다라다라V
article thumbnail
728x90
반응형
본 글은 "황기태"님의 [명품 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번 해설 참고

 

 

 

 

반응형
profile

다라다라V

@DaraDaraV

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!