본 글은 "황기태"님의 [명품 C++ Programming]의 연습 문제 답을 공유하고자 작성되었으며, 필자가 직접 문제를 풀며 작성한 것이기에 오류가 있을 수 있습니다. 댓글로 알려주시면 반영하도록 하겠습니다.
시리즈 보기
[C++] 명품 C++ Programming 1장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 1장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 2장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 2장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 3장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 4장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 4장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 5장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 6장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 7장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 8장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 8장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 9장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 9장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 10장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 10장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 11장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 11장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 12장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 12장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 13장 연습 문제 풀이 (이론 문제)
💡 01.
객체를 캡슐화하는 목적은 무엇인가?
[정답]
(96쪽~97쪽) 캡슐화(encapsulation)란 객체의 구성 요소들을 캡슐로 싸서 보호하고 볼 수 없게 하는 것으로 객체의 가장 본질적인 특징입니다. 객체는 캡슐화를 통해 외부의 접근을 통제하여 자신의 내부 요소들을 보호한다.
💡 02.
클래스와 객체에 관한 설명 중 틀린 것은?
① 객체를 실체 혹은 인스턴스(instance)라고 부른다.
② 클래스는 객체를 생성하기 위한 설계도 혹은 틀과 같다.
③ 클래스의 멤버들은 private보다 public 접근 지정이 바람직하다.
④ 클래스는 함수 멤버와 변수 멤버로 이루어진다.
[정답] ③번
클래스의 멤버는 부적절한 접근을 막기 위하여 = private 접근 지정이 바람직합니다.
💡 03.
다음 C++ 코드가 객체 지향 언어의 캡슐화를 달성하고 있는지 설명하라.
int acc;
int add(int x) {
acc += x;
return acc;
}
class Circle {
public:
int radius;
double getArea();
};
[정답]
캡슐화를 달성하고 있지 않습니다.
acc 변수와 add( ) 함수는 어떠한 클래스에도 포함되어 있지 않습니다. acc 와 add( ) 함수를 하나의 클래스로 묶어 캡슐화를 이룰 수 있습니다.
💡 04.
다음 C++ 프로그램에 캡슐화가 부족한 부분을 수정하여 캡슐화하라.
int age;
void order() {
age++;
}
class Circle {
int radius;
public:
double getArea();
};
[정답]
// age와 order과 관련된 Person 클래스 생성
class Person {
int age;
public:
void order() { age++; };
};
class Circle {
int radius;
public:
double getArea();
};
💡 05.
다음 코드는 Circle 클래스의 선언부이다. 틀린 부분을 수정하라.
class Circle {
int radius;
double getArea();
}
[정답]
class Circle {
int radius;
double getArea();
}; // 수정
(101쪽) 클래스는 반드시 class 키워드와 클래스 이름으로 선언하고, 마지막에 반드시 세미클론(;)을 붙여야합니다.
💡 06.
다음 코드는 Tower 클래스르 작성한 사례이다. 틀린 부분을 수정하라.
class Tower {
int height = 20;
public:
Tower() { height = 10; return; }
};
[정답]
class Tower {
int height = 20;
public:
Tower() { height = 10; } // 수정
};
(108쪽~109쪽) 생성자는 함수이지만 리턴 타입을 선언해서는 안됩니다. 또한 함수 실행을 종료하기 위해 return 문을 사용할 수 없습니다.
💡 07.
다음 코드에서 틀린 부분을 수정하라.
class Building {
private:
int floor;
public:
Building(int s) { floor = s; }
};
int main() {
Building twin, star;
Building BlueHouse(5), JangMi(14);
}
[정답]
class Building {
private:
int floor;
public:
Building() { floor = 1; } // 수정
Building(int s) { floor = s; }
};
int main() {
Building twin, star;
Building BlueHouse(5), JangMi(14);
}
(117쪽) 생성자가 하나라도 선언된 클래스의 경우, 컴파일러는 기본 생성자를 자동 삽입하지 않습니다. 따라서 매개변수가 없는 Buliding 생성자를 명시적으로 선언해야 twin, star 객체를 만들 수 있습니다.
💡 08.
다음 코드는 Calendar 클래스의 선엄부이다. year을 10으로 초기화하는 생성자와 year 값을 리턴하는 getYear( )를 구현하라.
class Calendar {
private:
int year;
public:
Calendar();
int getYear();
};
[정답]
class Calendar {
private:
int year;
public:
Calendar();
int getYear();
};
Calendar::Calendar() {
year = 10;
}
int Calendar::getYear() {
return year;
}
💡 09.
생성자에 대한 설명 중 틀린 것은?
① 생성자의 이름은 클래스 이름과 같다.
② 생성자는 오직 하나만 작성 가능하다.
③ 생성자는 리턴 타입을 가지지 않는다.
④ 생성자가 선언되어 있지 않으면 컴파일러에 의해 기본 생성자가 삽입된다.
[정답] ②번
(109쪽) 생성자는 한 클래스에서 매개 변수 개수나 타입을 다르게 하여 여러 개 만들 수 있습니다. 이를 통해 사용자가 다양한 방법으로 객체를 생성할 수 있습니다.
💡 10.
소멸자에 대한 설명 중에 틀린 부분을 지적하라.
소멸자는 ① 객체가 소멸되는 시점에 자동으로 호출되는 멤버 함수로서 ② 클래스의 이름 앞에 ~를 붙인 이름으로 선언되어야 한다. ③ 매개 변수 있는 소멸자를 작성하여 소멸 시에 있는 값을 전달할 수 있으며, 소멸자가 선언되어 있지 않으면 ④ 기본 소멸자가 자동으로 생성된다.
[정답] ③번
(121쪽) 소멸자는 매개변수를 가지지 않습니다.
💡 11.
다음 프로그램에 대해 답하라.
class House {
int numOfRooms;
int size;
public:
House(int n, int s);
};
void f() {
House a(2,20);
}
House b(3,30), c(4,40);
int main() {
f();
House d(5,50);
}
(1) n과 s로 numOfRooms, size를 각각 초기화하고, 이들을 출력하는 생성자를 구현하라.
(2) size와 numOfRooms 값을 출력하는 House 클래스의 소멸자를 생성하라.
(3) 객체 a, b, c, d가 생성되는 순서와 소멸되는 순서는 무엇인가?
[정답]
(1)
House::House(int n, int s) {
numOfRooms = n;
size = s;
cout << "numOfRooms: " << numOfRooms << ", size: " << size << endl;
}
(2)
House::~House() {
cout << "numOfRooms: " << numOfRooms << ", size: " << size << endl;
}
(3)
(123쪽~125쪽) 함수 내에서 선언된 지역 객체(local object)는 함수가 실행되고 함수가 종료될 때 소멸됩니다. 함수 바깥에 선언되는 객체는 전역 객체(global object)는 프로그램이 로딩될 때 생성되고 main( ) 이 종료된 뒤 프로그램 메모리가 사라질 때 소멸됩니다. 전역 객체와 지역 객체 모두 생성된 순서의 반대순으로 소멸됩니다.
b - c - a - a - d - d - c - b
💡 12.
다음 프로그램에서 객체 a, b, c가 생성되고 소멸되는 순서는 무엇인가?
class House {
int numOfRooms;
int size;
public:
House(int n, int s) {numOfRooms = n; size = s; }
void test() {
House a(1, 10);
}
};
void f() {
House b(2,20);
b.test();
}
House c(3, 30);
int main() {
f();
}
[정답]
c - b - a - a - b - c
11번 해설 참고
💡 13.
다음 프로그램의 오류를 지적하고 수정하라.
class TV {
TV() { channels = 256; }
public:
int channels;
TV(int a) { channels = a;}
};
int main() {
TV LG;
LG.channels = 200;
TV Samsung(100);
}
[정답]
생성자가 private으로 설정되어 있으므로 LG 객체를 만들 수 없습니다.
class TV {
public:
TV() { channels = 256; } // 수정
int channels;
TV(int a) { channels = a; }
};
int main() {
TV LG;
LG.channels = 200;
TV Samsung(100);
}
💡 14.
다음 프로그램의 오류를 지적하고 수정하라.
class TV {
int channels;
public:
int colors;
TV() { channels = 256;}
TV(int a, int b) { channels = a; colors = b; }
};
int main() {
TV LG;
LG.channels = 200;
LG.colors = 60000;
TV Samsung(100, 50000);
}
[정답]
(102쪽) channels 멤버 변수가 private으로 선언되어 있으므로, 외부 함수나 다른 클래스의 멤버 함수에서 접근할 수 없습니다. main( ) 함수에서 channels 멤버에 접근하기 위해서는 channels 가 public 접근 지정자로 선언되어야합니다.
class TV {
public:
int colors;
int channels; // 수정
TV() { channels = 256; }
TV(int a, int b) { channels = a; colors = b; }
};
int main() {
TV LG;
LG.channels = 200;
LG.colors = 60000;
TV Samsung(100, 50000);
}
💡 15.
다음 코드에서 자동 인라인 함수를 찾아라.
class TV {
int channels;
public:
TV() { channels = 256; }
TV(int a) { channels = a; }
int getChannels();
};
inline int TV::getChannels() {return channels; }
[정답] TV(), TV(int a)
(133쪽) 멤버 함수의 크기가 작은 경우 클래스의 선언부에 직접 구현할수도 있습니다. 컴파일러는 클래스 선언부에 구현된 멤버 함수들에 대해 inline 선언이 없어도 자동 인라인 함수로 처리합니다.
💡 16.
인라인 함수의 장단점을 설명한 것 중 옳은 것은?
① 인라인 함수를 사용하면 컴파일 속도가 향상된다.
② 인라인 함수를 이용하면 프로그램의 실행 속도가 향상된다.
③ 인라인 함수를 사용하면 프로그램 작성 시간이 향상된다.
④ 인라인 함수를 사용하면 프로그램의 크기가 작아져서 효과적이다.
[정답] ②번
(132쪽) 컴파일러는 인라인 함수를 호출하는 곳에 인라인 함수의 코드를 그대로 삽입하여 함수 호출이 발생하지 않도록 합니다. 이를 통해 함수 호출 오버헤드를 없애 실행 속도가 빨라집니다.
💡 17.
인라인 함수에 대해 잘못 설명한 것은?
① 인라인 선언은 크기가 큰 함수의 경우 효과적이다.
② C++ 프로그램에는 크기가 작은 멤버 함수가 많기 때문에 이들을 인라인으로 선언하면 효과적이다.
③ 컴파일러는 먼저 인라인 함수를 호출하는 곳에 코드를 확장시킨 후 컴파일한다.
④ 인라인 함수는 함수 호출에 따른 오버헤드를 줄이기 위한 방법이다.
[정답] ①번
(132쪽) 가능한 작은 함수를 인라인으로 선언하는 것이 코드의 크기를 줄이는데 도움이 됩니다.
💡 18.
inline 선언 강제 사항이 아니다. 다음 함수 중에서 컴파일러가 인라인으로 처리하기에 가장 바람직한 것은?
①
inline int big(int a, int b) {
return a>b?a:b;
}
②
inline int sum(int a, int b) {
if(a>=b) return a;
else return a + sum(a+1, b);
}
③
inline void add(int a, int b) {
int sum=0;
for(int n=a; n<b; n++)
sum += n;
}
④
inline int add(int a) {
static int x =0;
x += a;
return x;
}
[정답] ①번
(133쪽) 컴파일러에 따라 재귀 함수, static 변수, 반복문, switch 문, goto 문 등을 가진 함수는 인라인 함수로 허용되지 않습니다.
💡 19.
C++ 구조체(struct)에 대해 잘못 설명한 것은?
① C++에서 구조체를 둔 이유는 C 언어와의 호환성 때문이다.
② C++에서 구조체는 멤버 함수와 멤버 변수를 둘 수 있다.
③ C++에서 구조체는 생성자와 소멸자를 가진다.
④ C++에서 구조체는 상속을 지원하지 않는다.
[정답] ④번
(134쪽) C++ 구조체는 클래스와 기능적으로 비슷합니다. 생성자와 소멸자를 비롯한 멤버 함수를 가질 수 있으며 다른 구조체나 클래스에 상속하거나 상속 받을 수 있습니다.
💡 20.
다음 C++ 구조체를 동일한 의미를 가지는 클래스로 작성하라.
struct Family {
int count;
char address[20];
public:
Family();
private:
char tel[11];
};
[정답]
class Family {
char tel[11];
public:
int count;
char address[20];
Family();
};
(134쪽) 클래스의 디폴트 접근 지정은 private이지만, 구조체는 public입니다. 때문에 접근지정자를 알맞게 수정할 필요가 있습니다.
💡 21.
다음 클래스를 구조체로 선언하라.
class Universe {
char creator[10];
int size;
private:
char dateCreated[10];
public:
Universe();
};
[정답]
struct Universe {
Universe();
private:
char creator[10];
int size;
char dateCreated[10];
};
20번 해설 참고
'대학교 > 명품 C++programming 문제' 카테고리의 다른 글
[C++] 명품 C++ Programming 4장 연습 문제 풀이 (실습 문제) (0) | 2022.11.11 |
---|---|
[C++] 명품 C++ Programming 4장 연습 문제 풀이 (이론 문제) (0) | 2022.11.10 |
[C++] 명품 C++ Programming 2장 연습 문제 풀이 (실습 문제) (0) | 2022.10.28 |
[C++] 명품 C++ Programming 2장 연습 문제 풀이 (이론 문제) (0) | 2022.10.27 |
[C++] 명품 C++ Programming 1장 연습 문제 풀이 (실습 문제) (0) | 2022.10.25 |