역시나 산지는 좀 되었지만 이제야 다 읽은 책이다. C 프로그램을 하던 사람들을 독자로 삼고 있으며 C에서 C++로 넘어가기 위한 C++의 기본 개념들을 설명하고 있다. 책이 나온지 한참되었기 때문인지 번역한 단어가 다소 생소하지만 내용 자체는 여전히 유효한 내용들로 구성되어 있어 크게 문제가 되지 않는다. 중간 중간 예제가 나와 있지만 예제가 틀려서인지 글의 내용과 매치되지 않는 부분도 있다.
3판까지 번역서가 나와 있습니다만 중고로 구입한 2판입니다. (3판은 품절이더군요..) 내용은 아직까지 모두 이해하기는 힘들지만 그럭저럭 참고가 될 만한 내용들로 구성되어 있고, 현재 프로젝트 진행하면서 문제가 되었던 부분도 나와 있어서 나름 흥미 진진하게 읽었습니다. 단지 번역이.. 좀 이상한 부분이 있고 예제와 안 맞는 부분도 있습니다.
많은 분들이 추천할 만한 책인 것은 맞습니다. 단지 C++ 처음하시는 분들에게는 맞지 않다는 거.
연습문제 7-1) 문제1] 다음 클래스는 은행 계좌 정보를 담을 수 있도록 정의되어 있는 Account 클래스이다.
class Account { private: char acc_num[10]; // 계좌 번호 int balance; // 계좌 잔액 public: Account (char* num, int bal) { strcpy(acc_num, num); balance = bal; } };
위 클래스를 public 상속하는 KBAccount 클래스를 정의해 보자. KBAccount 클래스는 Account 클래스가 지니고 있는 멤버 변수 이외에 고객별 이체 한도 정보를 담고 있는 멤버 변수 (trans_limit)를 지녀야 한다. 다음에 제시하고 있는 main 함수의 예와 실행 결과를 참조해서 정의하기 바란다.
int main()
{
KBAccount acc("1234-5678", 5000, 1000000);
acc.ShowData();
return 0;
}
연습문제 7-2) 문제1] 예제 BasicInheri4.cpp에서 Person 클래스와 Student 클래스를 디자인하였다. 그런데 Person 클래스의 멤버 변수 name과 Student 클래스의 멤버 변수 major는 배열의 형태로 선언되어 있다. 따라서 생성되는 모든 객체는 동일한 형태의 메모리 공간을 할당받게 될 것이다.
이제 Person 클래스와 Student 클래스를 변경해 보자. 멤버 변수 name과 major를 문자열 포인터(char*)로 선언하고, 생성자 내에서 문자열의 길이에 따라서 메모리 공간을 동적 할당하는 형태로 변경해 보자. 앞에서 복사 생서자를 공부할 때 접해 봤던 형태이다.
처음 접할 경우, 결코 쉬운 문제가 아니므로 복습을 한다는 생각을 가지고 천천히 해결해 보기 바란다. 참고로 여러분은 Person 클래스와 Student 클래스에서 생성자, 소멸자, 뿐만 아니라 복사 생성자까지 정의해야 한다.
여러분이 정의한 클래스는 다음의 main 함수와 더불어 무리 없이 실행되어야 한다.
main 함수의 예
int main() { Student Hong1(20, "Hong Gil Dong", "computer"); Hong1.ShowData(); Student Hong2 = Hong1; Hong2.ShowData(); return 0; }
실행 결과
이름: Hong Gil Dong 나이: 20 전공: computer 이름: Hong Gil Dong
나이: 20
전공: computer
구루마루의 답안 보기
#include <iostream>
using namespace std;
class Person
{
protected:
int age;
char* name;
//char name[20];
public:
int GetAge() const
{
return age;
}
const char* GetName() const
{
return name;
}
Person(int _age = 1, char* _name = "noanme")
{
name = new char[strlen(_name)+1];
age = _age;
strcpy_s(name, strlen(_name)+1, _name);
}
Person(const Person &p)
{
name = new char[strlen(p.name)+1];
age = p.age;
strcpy_s(name, strlen(p.name)+1, p.name);
}
~Person()
{
delete []name;
}
};
class Student:public Person
{
char* major;
//char major[20];
public:
Student(int _age, char* _name, char* _major):Person(_age, _name)
{
major = new char[strlen(_major)+1];
strcpy_s(major, strlen(_major)+1, _major);
}
Student(const Student &s):Person(s)
{
major = new char[strlen(s.major)+1];
strcpy_s(major, strlen(s.major)+1, s.major);
}
const char* GetMajor() const
{
return major;
}
void ShowData() const
{
cout << "이름: " << name << endl;
cout << "나이: " << age << endl;
cout << "전공: " << major << endl;
}
};
문제1) 연습문제 4-1의 3번 문제를 통해서 NameCard 클래스를 정의하였다. 이 클래스도 생성자 내에서 메모리 공간을 동적 할당하고 있으며 소멸자에서 이를 해제하고 있기 때문에 깊은 복사를 하는 복사 생성자가 필요한 상황이다. 이에 적절한 복사 생성자를 정의해 보기 바란다. 그리고 제대로 정의를 하였는지, 다음 main 함수를 통해서 확인하기 바란다.
문제1) 직사각형을 나타내는 Rectangle 클래스와 원을 나타내는 Circle 클래스를 디자인 해보자. 이 두클래스는 넓이를 구하는 기능과 둘레를 구하는 기능을 지녀야 한다. 다음에 제공되는 main 함수와 출력 결과를 통해서 요구되는 Rectangle 클래스와 Circle 클래스를 디자인해 보자.
문제1) 계산기 기능을 하는 Calculator라는 이름의 클래스를 작성해 보자. 기본적으로 지니고 있는 기능은 덧셈, 뺄셈, 곱셈 그리고 나눗셈이며, 연산을 할 때마다 어떠한 연산을 몇 번했는지 기록되어야 한다. 다음에 제공되는 main 함수의 출력 결과를 통해서 요구되는 Calculator 클래스를 디자인 해보자. 단, 멤버 변수는 private으로, 멤버 함수는 public으로 선언을 하자. 이렇게 선언하는 이유에 대해서는 다음 장에서 자세히 언급한다.
> main 함수의 예 int main(void) { Calculator cal; cal.Init();
double Add(double a, double b) { nAddCount++; return a+b;} double Min(double a, double b) { nMinCount++; return a-b;} double Multi(double a, double b) { nMultiCount++; return a*b;} double Div(double a, double b) {nDivCount++; return a/b;}
문제2) Printer라는 이름의 클래스를 디자인하자. Printer 클래스는 두 가지 기능을 지닌다. 그 중 첫번째는 문자열을 설정할 수 있는 기능이고, 두 번째 기능은 설정되어 있는 문자열을 출력하는 기능이다. 다음에 제공되는 main 함수와 출력 결과를 통해서 요구되는 Printer 클래스를 디자인해보자. 이번에도 역시, 멤버 변수는 private으로, 멤버 함수는 public으로 선언을 하자.
> main 함수의 예 int main(void) { Printer pnt; pnt.SetString("Hello World!"); pnt.ShowString();
pnt.SetString("I Love C++"); pnt.ShowString(); return 0; }