티스토리 툴바

C 프로그래머를 위한 C++ - 8점
그레고리 새터 외 지음 / 서정욱 옮김/한빛미디어

역시나 산지는 좀 되었지만 이제야 다 읽은 책이다. C 프로그램을 하던 사람들을 독자로 삼고 있으며 C에서 C++로 넘어가기 위한 C++의 기본 개념들을 설명하고 있다.
책이 나온지 한참되었기 때문인지 번역한 단어가 다소 생소하지만 내용 자체는 여전히 유효한 내용들로 구성되어 있어 크게 문제가 되지 않는다. 중간 중간 예제가 나와 있지만 예제가 틀려서인지 글의 내용과 매치되지 않는 부분도 있다.

C++의 전체적인 틀을 잡기에는 괜찮은 책이다.
크리에이티브 커먼즈 라이선스
Creative Commons License

얼마전 부터 회사내의 보안 강화 지침이 발표되면서 이제는 mp3p 및 각종 저장매체가 달린 장비는 소지를 못하게 되었습니다. 공항 검색대를 방불케 하는 x-ray 투시기와 도난 경보기도 설치되었답니다.

이런 이유로 출퇴근 시간에 놀이 상대가 되어 주던 NDSL을 버려 두고 다시 책을 붙잡게 되었습니다. 약 두달 동안 출퇴근 시간을 이용하여 그동안 읽어 오던 책들을 마무리 짓게 되는 군요.

Effective C++ - 8점
Scott Meyers 지음, 연승훈.표광준 옮김/대림

3판까지 번역서가 나와 있습니다만 중고로 구입한 2판입니다. (3판은 품절이더군요..) 내용은 아직까지 모두 이해하기는 힘들지만 그럭저럭 참고가 될 만한 내용들로 구성되어 있고, 현재 프로젝트 진행하면서 문제가 되었던 부분도 나와 있어서 나름 흥미 진진하게 읽었습니다. 단지 번역이.. 좀 이상한 부분이 있고 예제와 안 맞는 부분도 있습니다.

많은 분들이 추천할 만한 책인 것은 맞습니다. 단지 C++ 처음하시는 분들에게는 맞지 않다는 거.
크리에이티브 커먼즈 라이선스
Creative Commons License

연습문제 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 함수의 예와 실행 결과를 참조해서 정의하기 바란다.

  • main 함수의 예
int main(void)
{
    //계좌 번호: 1234-5678
    // 초기 입금액: 5000원
    // 이체 한도: 100000원
    KBAccount acc("1234-5678", 5000 100000);
    acc.ShowData();
    return 0;
};
  • 실행 결과
계좌 번호: 1234-5678
계좌 잔액: 5000원
이체 한도: 100000원

구루마루의 답안 보기


연습문제 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

구루마루의 답안 보기

크리에이티브 커먼즈 라이선스
Creative Commons License

이번 단계에는 멤버 함수를 상수화 시키는 방법을 설명하고 있습니다.
4단계의 프로그램에서 일부 함수를 상수화 (const) 시킬 수 있습니다.

Data를 읽어 오는 부분은 내부 변수를 변경시키지 않으므로 상수화가 가능합니다.
계좌번호, 이름, 잔액을 가져오는 함수가 이에 해당됩니다.


more..


크리에이티브 커먼즈 라이선스
Creative Commons License

지난 번 OOP 프로젝트 2단계에 이어 이번에는 클래스의 복사 생성자를 추가하는 코드입니다.
실제 2단계의 코드에서 생성자 부분만 약간 바뀌었을 뿐입니다.

소스를 참고하시려면 아래를 누르세요.

구루마루의 답안 보기



크리에이티브 커먼즈 라이선스
Creative Commons License

[연습문제 5-1]

문제1) 연습문제 4-1의 3번 문제를 통해서 NameCard 클래스를 정의하였다. 이 클래스도 생성자 내에서 메모리 공간을 동적 할당하고 있으며 소멸자에서 이를 해제하고 있기 때문에 깊은 복사를 하는 복사 생성자가 필요한 상황이다. 이에 적절한 복사 생성자를 정의해 보기 바란다. 그리고 제대로 정의를 하였는지, 다음 main 함수를 통해서 확인하기 바란다.

  • main 함수의 예
int main(void)
{
    NameCard Lee("Lee Hun", "333-3333", "freelec", "manager");
    NameCard Lee2(Lee);
    Lee.ShowData();
    return 0;
}


구루마루의 답안 보기




크리에이티브 커먼즈 라이선스
Creative Commons License

OOP 프로젝트 1단계에 이어 이번에는 계정 부분을 클래스로 변환한 2단계 소스입니다.
책에는 Banking System v2.0 이라고 되어 있군요.

소스를 참고하시려면 아래를 누르세요.

구루마루의 답안 보기


크리에이티브 커먼즈 라이선스
Creative Commons License

[연습문제 4-1]

문제1) 직사각형을 나타내는 Rectangle 클래스와 원을 나타내는 Circle 클래스를 디자인 해보자. 이 두클래스는 넓이를 구하는 기능과 둘레를 구하는 기능을 지녀야 한다. 다음에 제공되는 main 함수와 출력 결과를 통해서 요구되는 Rectangle 클래스와 Circle 클래스를 디자인해 보자.

  • main 함수의 예
  •    Rectangle rec(3,4);
       cout <<" 면적: "<<rec.GetArea()<<endl;
       cout <<" 둘레: "<<rec.GetGirth()<<endl;

       Circle cir(5);
       cout <<" 면적: "<<cir.GetArea()<<endl;
       cout <<" 둘레: "<<cir.GetGirth()<<endl;

        return 0;
    }
  • 실행 결과

    면적 : 12

    둘레 : 14

    면적: 78.5

    둘레: 31.4


구루마루의 답안


문제2) 시(hour), 분(minute), 초(second) 정보를 지닐 수 있는 Time 클래스를 정의해 보자. 이 클래스는 멤버 변수가 지니고 있는 데이터를 출력하는 기능을 지녀야 한다. 출력 방식은 두 가지로 제공을 하자.

하나는 [시,분,초]의 형식을 띄며, 또 하나는 초 단위로 계산한 출력 결과를 보여준다. 제시되는 main 함수와 출력 결과를 참조하기 바란다.


  • main 함수의 예
  • int main(void)
    {
        Time time1(10);
       Time time2(10, 20);
       Time time3(10, 20, 30);

       time2.ShowTime();
       time2.ShowTimeinSec();

        return 0;
    }
  • 실행 결과

    [10시 20분 0초]

    37200초


구루마루의 답안 보기


문제3) 명함 정보를 지닐 수 있는 클래스를 정의해 보자. 클래스의 이름은 NameCard이고 일므, 전화번호, 주소, 직급 정보를 저장할 수 있어야 한다. 생성자 내에서 동적 할당하고, 소멸자에서 할당받은 메모리를 해제하는 형식으로 구현해보자.


  • main 함수의 예
  • int main(void)
    {
       NameCard Lee("Lee Ji Sun", "333-3333", "www.ezsun.net", "missionary");
       Lee.ShowData();
       return 0;
    }
  • 실행 결과

    이      름: Lee Ji Sun

    전화번호: 333-3333

    주      소: www. ezsun.net

    직      급: missionary


구루마루의 답안 보기


[연습문제 4-2]

문제1) 연습문제 4-1의 3번 문제를 통해서 NameCard 클래스를 정의하였다. 이제 이 클래스를 적절히 활용하는 main 함수를 만들어 보기로 하자.


사용자로부터 NameCard 객체에 들어갈 데이터를 입력받기로 하자. 총 3명의 데이터를 순차적으로 입력받고, 다시 순차적으로 출력하는 형태로 예제를 작성하자. 단 3명의 데이터를 입력받기 위해서 배열을 선언하되, 객체 포인터 배열을 선언하는 형태를 취하도록 하자.

구루마루의 답안 보기



이 글은 스프링노트에서 작성되었습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License

문제1) 계산기 기능을 하는 Calculator라는 이름의 클래스를 작성해 보자. 기본적으로 지니고 있는 기능은 덧셈, 뺄셈, 곱셈 그리고 나눗셈이며, 연산을 할 때마다 어떠한 연산을 몇 번했는지 기록되어야 한다. 다음에 제공되는 main 함수의 출력 결과를 통해서 요구되는 Calculator 클래스를 디자인 해보자.
단, 멤버 변수는 private으로, 멤버 함수는 public으로 선언을 하자. 이렇게 선언하는 이유에 대해서는 다음 장에서 자세히 언급한다.

> main 함수의 예
int main(void)
{
    Calculator cal;
    cal.Init();

    cout<< "3+5= "<<cal.Add(3,5)<<endl;
    cout<< "3/5= "<<cal.Div(3,5)<<endl;
    cout<< "12-4= "<<cal.Min(12,4)<<endl;
    cout<< "12/4= "<<cal.Div(12,4)<<endl;
   
    cal.ShowOpCount();

    int n;
    cin >> n;
    return 0;
}

>실행 결과
3+5=8
3/5=0.6
12-4=8
12/4=3
덧셈: 1 뺄셈: 1 곱셈: 0 나눗셈: 2

구루마루의 답안


문제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;
}

>실행 결과
Hello World!
I Love C++

구루마루의 답안






크리에이티브 커먼즈 라이선스
Creative Commons License

열혈강의 C++ 프로그래밍에 나오는 OOP 프로젝트 1단계에 대해 나름대로 짜 봤습니다.
거의 발로 짠 코드라 오류처리나 범위 초과 체크 부분이 없습니다.

그래도 보실려면 아래를 참고하세요.

소스보기



크리에이티브 커먼즈 라이선스
Creative Commons License