안녕하세요
개인 해설이므로 오답이 있을 수 있습니다.
오답이나 조금 더 좋은 해설의 방향이 있다면, 바로 댓글로 알려주시면 더 공부하고 좋은 방향의 해답을 낼 수 있도록 노력하겠습니다.
01. 객체를 캡슐화하는 목적은 무엇인가?
[ 정답 ] - 캡슐화를 통해 외부의 접근을 통제하여 지신의 내부 요소들을 보호하기 위해서다
02. 클래스와 객체에 관한 설명 중 틀린 것은?
① 객체를 실체 혹은 인스턴스(instance)라고 부른다.
② 클래스는 객체를 생성하기 위한 설계도 혹은 틀과 같다.
③ 클래스의 멤버들은 private보다 public 접근 지정이 바람직하다.
④ 클래스는 함수 멤버와 변수 멤버로 이루어진다.
[ 정답 : 3번 ] - private로 보호하는 것이 바람직하다
03. 다음 C++ 코드가 객체 지향 언어의 캡슐화를 달성하고 있는지 설명하라.
int acc;
int add(int x) {
acc += x;
return acc;
}
class Circle {
public:
int radius;
double getArea();
};
[ 정답 ] int acc;는 전역 변수로 int add는 함수로 선언되어 있기 때문에 캡슐화를 달성하지 않는다. 캡슐화를 달성하기 위해서는 Circle 내부에 public 멤버 변수와 int 멤버 함수로 acc와 add를 구현해야 한다.
04. 다음 C++ 프로그램에 캡슐화가 부족한 부분을 수정하여 캡슐화하라.
int age;
void older() {
age++;
}
class Circle {
int radius;
public:
double getArea();
};
[ 정답 ] - 전역변수 age를 class 내부 private 접근 지정자로 선언 age를 Circle의 멤버 함수로 선언한다.
class Circle {
int age;
int radius;
public:
double getArea();
void older() {age++;};
};
05. 다음 코드는 Circle 클래스의 선언부이다. 틀린 부분을 수정하라
class Circle {
int radius;
double getArea();
}
[ 정답 ] - 클래스로 선언하려면 중괄호 끝나는 부분 뒤에 ;가 있어야 된다
class Circle {
int radius;
double getArea();
};
06. 다음 코드는 Tower 클래스를 작성한 사례이다. 틀린 부분을 수정하라.
class Tower{
int height = 20;
pulbic:
Tower() { height = 10; return; }
};
[ 정답 ] - 생성자는 리턴타입을 선언하지 않는다
class Tower{
int height = 20;
pulbic:
Tower() { height = 10; } ;
};
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; };
Building(int s) { floor = s; }
};
int main() {
Building twin, star;
Building BlueHouse(5), JangMi(14);
}
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::Calender(){
year = 10;
}
int Calender::getYear(){
return year;
}
또는
class Calendar {
private:
int year;
public:
Calendar() { year = 10; };
int getYear() { return year; };
};
09. 생성자에 대한 설명 중 틀린 것은?
① 생성자의 이름은 클래스 이름과 같다.
② 생성자는 오직 하나만 작성 가능하다.
③ 생성자는 리턴 타입을 가지지 않는다.
④ 생성자가 선언되어 있지 않으면 컴파일러에 의해 기본 생성자가 삽입된다.
[ 정답 : 2번 ] - 하나 이상 가능하다
10. 소멸자에 대한 설명 중에 틀린 부분을 지적하라.
소멸자는 ① 객체가 소멸되는 시점에 자동으로 호출되는 멤버 함수로서 ② 클래스의 이름 앞에 ~를 붙인 이름으로 선언되어야 한다. ③ 매개 변수 있는 소멸자를 작성하여 소멸 시에 있는 값을 전달할 수 있으며, 소멸자가 선언되어 있지 않으면 ④ 기본 소멸자가 자동으로 생성된다. |
[ 정답 : 3번 ] - 소멸자는 매개 변수를 가질 수 없으므로 매개 변수 있는 소멸자 부분이 오답이다.
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) - 함수 명 ::생성자(타입, 타입)에 맞게 작성 후 안에 numOfRooms은 n으로 size는 s라는 값을 초기화해줬습니다.
이들을 출력하는 생성자를 구현하라 부분은 n, s를 초기화하는 House 매개 변수를 두 개 갖는 생성자를 이용해 그 부분에 생성 및 출력했습니다.
소스코드입니다.
#include <iostream>
using namespace std;
class House {
int numOfRooms;
int size;
public:
House(int n, int s);
};
House::House(int n, int s) {
numOfRooms = n; size = s;
cout << "생성 - numOfRooms : " << n << " size : " << s<< endl;
}
void f() {
House a(2, 20);
}
House b(3, 30), c(4, 40);
int main() {
f();
House d(5, 50);
}
디버깅 화면입니다.
(2) - size와 numOfRooms 값을 출력하는 House 클래스의 소멸자를 생성하라.
생성자 출력은 생성자를 구현하면서 작성할 수 있었습니다. 소멸자의 경우 한 개만 존재하고 리턴도 안되고 매개 변수를 가질 수 없기 때문에 소멸자 ~House()를 생성하면서 화면에 출력될 멤버 변수를 가져와서 사라지도록 했습니다. 이런 경우 private로 선언된 값들을 public으로 바꿔서 클래스 내부가 아닌 외부에서도 전역 객체가 접근이 가능하도록 멤버 변수의 값을 선언합니다.
#include <iostream>
using namespace std;
class House {
public:
int numOfRooms;
int size;
House(int n, int s);
~House();
};
House::House(int n, int s) {
numOfRooms = n; size = s;
cout << "생성 - numOfRooms : " << n << " size : " << s << endl;
}
House::~House() {
cout << "소멸 - numOfrooms : " << numOfRooms << " size : " << size << endl;
}
void f() {
House a(2, 20);
}
House b(3, 30), c(4, 40);
int main() {
f();
House d(5, 50);
}
디버깅 화면입니다.
출력 부분에 보시면 f() 함수가 main문의 생성자 보다 빠르게 생성되고 소멸하는 과정도 확인할 수 있습니다.
(R과 r로 생성 소멸뿐 아니라 시각적으로 구별하기 조금 편하라고 바꿔놨습니다)
(3) - 생성되는 순서는 전역 객체 -> 지역 객체 순이다. 지역 객체의 경우 메인 문의 순서대로 확인한다.
이 부분에 대해서 올바르지 못한 정보 전달일 가능성이 존재하여 풀이를 내렸습니다. 해당 내용은 댓글을 참조하여 파악해주시길 바랍니다!
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 순으로 소멸한다.
13. 다음 프로그램의 오류를 지적하고 수정하라.
class TV {
TV() { channels = 256; }
public:
int channels;
TV(int a) { channels = a;}
};
int main() {
TV LG;
LG.channels = 200;
TV Samsung(100);
}
[ 정답 ] - 멤버 변수가 없는 LG 객체를 생성자가 초기화해줘야 하는데 private의 구역에 있어서 오류가 난다 public 구간으로 옮겨준다.
class TV {
public:
int channels;
TV() { channels = 256; }
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);
}
[ 정답 ] - channels의 변수가 main문에서도 접근해서 사용하려는데 TV클래스의 private접근 지정자로 선언되었기 때문에 public으로 멤버 변수를 빼준다
class TV {
public:
int channels;
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);
}
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) 두개가 자동 인라인 함수이다.
inline int TV~~는 멤버 함수를 inline으로 선언하는 방법이다. 자동X
16. 인라인 함수의 장단점을 설명한 것 중 옳은 것은?
① 인라인 함수를 사용하면 컴파일 속도가 향상된다.
② 인라인 함수를 이용하면 프로그램의 실행 속도가 향상된다.
③ 인라인 함수를 사용하면 프로그램 작성 시간이 향상된다.
④ 인라인 함수를 사용하면 프로그램의 크기가 작아져서 효과적이다.
[ 정답 : 2번 ] - 실행 속도가 빨라지는 것임
17. 인라인 함수에 대해 잘못 설명한 것은?
① 인라인 선언은 크기가 큰 함수의 경우 효과적이다.
② C++ 프로그램에는 크기가 작은 멤버 함수가 많기 때문에 이들을 인라인으로 선언하면 효과적이다.
③ 컴파일러는 먼저 인라인 함수를 호출하는 곳에 코드를 확장시킨 후 컴파일한다.
④ 인라인 함수는 함수 호출에 따른 오버헤드를 줄이기 위한 방법이다.
[ 정답 : 1번 ] - 작은 크기의 함수에 적합함
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;
}
[ 정답 : 1번 ] - 함수가 가장 간략함
19. C++ 구조체(struct)에 대해 잘못 설명한 것은?
① C++에서 구조체를 둔 이유는 C 언어와의 호환성 때문이다.
② C++에서 구조체는 멤버 함수와 멤버 변수를 둘 수 있다.
③ C++에서 구조체는 생성자와 소멸자를 가진다.
④ C++에서 구조체는 상속을 지원하지 않는다.
[ 정답 : 4번 ] 상속을 지원한다
20. 다음 C++ 구조체를 동일한 의미를 가지는 클래스로 작성하라.
struct Family {
int count;
char address[20];
public:
Family();
private:
char tel[11];
};
[ 정답 ]
class Family {
private:
char tel[11];
public:
int count;
char address[20];
Family();
};
C++의 구조체의 경우 디폴트 값이 public 선언이므로 private로 선언되는 값은 tel하나다.
21. 다음 클래스를 구조체로 선언하라.
class Universe {
char creator[10];
int size;
private:
char dateCreated[10];
public:
Universe();
};
[ 정답 ] - 위와 동일하게 class의 디폴은 private이므로 묶음으로 구조체(struct)에서 private를 따로 선언한다. Universe의 경우 선언할 필요는 없지만 그냥 보기 좋으라고 선언함
struct Universe {
public:
Universe();
private:
char creator[10];
int size;
char dateCreated[10];
};
개인 해설지로 정리하는 게시글은 직접 타이핑해서 작성하므로
오타가 있을 수 있으며, 오답이 있을 수 있습니다.
오타가 있거나 오답이 있는 경우에 댓글로 남겨주시면 감사드리겠습니다.
다음 포스팅 때 뵙겠습니다!
'C, C++ > C++' 카테고리의 다른 글
C++ *로 X자 패턴 표현하기 (0) | 2020.12.18 |
---|---|
C++ 클래스를 이용하여 x자 출력하기 (0) | 2020.12.02 |
명품 C++ Programming 2판 연습문제 2장 실습문제 개인 풀이 (2) | 2020.10.15 |
명품 C++ Programming 연습문제 2장 이론문제 개인 풀이 (6) | 2020.10.14 |
명품 C++ Programming 연습문제 1장 (실습문제)개인 풀이 및 개인 해설 (0) | 2020.10.13 |