jam 블로그

[C++] 003. 클래스의 기본 본문

개발 및 관련 자료/C

[C++] 003. 클래스의 기본

kid1412 2013. 5. 12. 19:58
728x90

I. 구조체와 클래스

  • 구조체의 등장 배경은 무엇인가?

    • 일단 구조체의 이점은 관련있는 데이터를 하나로 묶으면 관리하기에도 프로그래밍 하기에도 편리하다는 점이 있다.
    • 부류를 형성하는 데이터들을 하나의 자료형으로
    • 정의해서, 관리 및 프로그램 구현에 도움을 주겠다는 의도로 등장.
  • 구조체에 대한 불만과 개선
  1. #include <stdio.h>
  2. struct Person
    {
     int age;
     char name[10];
    };
  3. int main()
    {
     int a = 10;
     Person p;
     return 0;
    }
  • 위와 같이 소스를 짜면 맞을듯 하나 틀리다.

    • main함수 안에 Person p; 라고 쓴 부분이 있는데 C파일에서는 컴파일 오류가 난다. 오류를 없애려면 struct Person p; 로 써야 한다.
    • cpp로 확장자를 바꾸어서 하면 컴파일이 잘 된다. 이유는 C 언어와 달리 C++의 매커니즘에는 사용자 정의 자료형과 기본 자료형을 동일시하자는 철학이 있다고 한다.
  • 구조체에 대한 자세한건 C에서 참조 하세요
  • 구조체가 아니라 클래스(class)

    •  클래스 = 멤버 변수 + 멤버 함수
    • 다음 소스는 기본적인 클래스를 쓴 예제이다.
  1.  #include <iostream>
    using namespace std;
    class Account
    {
    public:
     char accID[20];
     char secId[20];
     char name[20];
     int balance;
     
     void Deposit(int money)
     {
      balance += money;
     }
     void Withdraw(int money)
     {
      balance -= money;
     }
    };
    int main()
    {
     Account yoon={"1234","2321","yoon",1000};
     yoon.Deposit(100);
     cout<<"잔    액 : "<<yoon.balance<<endl;
  2.  yoon.Withdraw(200);
     cout<<"잔    액 : "<<yoon.balance<<endl;
     return 0;
    }

II. 클래스와 객체

  • 데이터 추상화

    • 현실세계의 사물을 데이터적인 측면과 기능적 측면을 통해서 정의하는 것.
  • 클래스

    •  추상화 된 데이터를 가지고 사용자 정의 자료형을 정의하는 것.
  • 객체

    •  클래스를 이용해서 정의된 자료형의 변수

III. 클래스 멤버의 접근 제어

  • 클래스의 내부 접근과 외부 접근
  1.  #include <iostream>
    using namespace std;
    class Counter
    {
    public:
     int val;
     void Increment(void)
     {
      val++ //내부 접근
     }
    };
    int main()
    {
     Counter cnt;
     cnt.val = 0;   //외부접근
     cnt.Increment();  //외부접근
     cout<<cnt.val<<endl; //외부접근
     return 0;
    }
  • 위 소스를 보면 클래스 안에서 접근을 하면 내부 접근 그 이외는 외부 접근으로 친다.

 

  •  public & private

    • private : 내부 접근만 허용 되며, 외부 접근 시도시 컴파일 에러가 난다.
    • public : 어디서 접근 하든 상관 안한다.
  1.  #include <iostream>
    using namespace std;
  2. const int OPEN = 1;
    const int CLOSE = 2;
  3. class Door
    {
    private:
     int state;
    public:
     void Open()
     {
      state = OPEN;
     }
     void Close()
     {
      state=CLOSE;
     }
     void ShowState()
     {
      cout<<"현재 문의 상태 : ";
      cout<<((state == OPEN)? "OPEN" : "CLOSE")<<endl; //if문과 같은 것
     }
    };
    int main()
    {
     Door d;
     //d.state = OPEN;  <= 외부에서 state(private)로 접근 하려고 했지 때문에 오류
     d.Open();
     d.ShowState();
     return 0;
    }
  • 위의 소스를 보면 메인에서 주석처리 된 부부은 private로 접근 하려고 해서 오류가 난다. 나머지는 public으로 접근이라 상관 없다.

IV. 멤버 함수의 외부 정의

  • 멤버 함수를 클래스 외부에 정의하기
  1. #include <iostream>
    using namespace std;
  2. const int OPEN = 1;
    const int CLOSE = 2;
  3. class Door
    {
    private:
     int state;
    public:
     void Open();
     void Close();
     void ShowState();
    };
    void Door::Open()
     {
      state = OPEN;
     }
    void Door::Close()
     {
      state=CLOSE;
     }
    void Door::ShowState()
     {
      cout<<"현재 문의 상태 : ";
      cout<<((state == OPEN)? "OPEN" : "CLOSE")<<endl; //if문과 같은 것
     }
    int main()
    {
     Door d;
     //d.state = OPEN;  <= 외부에서 state(private)로 접근 하려고 했지 때문에 오류
     d.Open();
     d.ShowState();
     return 0;
    }
  • 위의 소스는 앞절에서 한 소스를 클래스 안에 있던 함수를 외부로 빼온거 말고는 없다.

    • 잘 보면 외부로 함수를 빼었을 때 void Door::Open 이런식으로 써있는데 Door:: 은 Door이라는 클래스 안에 있는 Open 함수를 쓰겠다는 의미이다.
  • 클래스 내부 정의의 의미와 inline

    • 클래스의 멤버 함수를 내부에 정의한다는 것은 외부에 정의한 것과 달리 inline으로 처리할것으로 요구한다는 의미를 지닌다.
  1. #include <iostream>
    using namespace std;
  2. const int OPEN = 1;
    const int CLOSE = 2;
  3. class Door
    {
    private:
     int state;
    public:
     void Open();
     void Close();
     void ShowState();
    };
    inline void Door::Open()
     {
      state = OPEN;
     }
    inline void Door::Close()
     {
      state=CLOSE;
     }
    inline void Door::ShowState()
     {
      cout<<"현재 문의 상태 : ";
      cout<<((state == OPEN)? "OPEN" : "CLOSE")<<endl; //if문과 같은 것
     }
    int main()
    {
     Door d;
     //d.state = OPEN;  <= 외부에서 state(private)로 접근 하려고 했지 때문에 오류
     d.Open();
     d.ShowState();
     return 0;
    }
  • 위의 소스처럼 외부로 정의된 함수 앞에 inline 함수를 쓰면 된다. 컴파일러는 최적화를 위해서 무시할 때도 있다.

 

  • 헤더 파일을 이용한 파일의 분할
  • Door.h
  1. #include <iostream>
    using namespace std;
  2. const int OPEN = 1;
    const int CLOSE = 2;
  3. class Door
    {
    private:
     int state;
    public:
     void Open();
     void Close();
     void ShowState();
    };
  • Door.cpp
  1.  #include <iostream>
    #include "Door.h"
    using namespace std;
  2. void Door::Open()
    {
     state = OPEN;
    }
    void Door::Close()
    {
     state=CLOSE;
    }
    void Door::ShowState()
    {
     cout<<"현재 문의 상태 : ";
     cout<<((state == OPEN)? "OPEN" : "CLOSE")<<endl; //if문과 같은 것
    }
  • main.cpp
  1. #include "Door.h"
    int main()
    {
     Door d;
     //d.state = OPEN;  <= 외부에서 state(private)로 접근 하려고 했지 때문에 오류
     d.Open();
     d.ShowState();
     return 0;
    }
  • 위의 소스들처럼 클래스를 헤더파일어 넣고 그 헤더를 사용하면서 쓰면 된다.

문제

3 -1

문제 1

계산기 기능을 하는 Calculator라는 이름의 클래스를 작성해 보자. 기본적으로 지니고 있는 기능은 덧셈, 뺄셈, 곱셈, 그리고 나눗셈이며, 연산을 할 때마다 어떠한 연산을 몇번했는지 기록되어야 한다 다음에 제공되는 main 함수와 출력 결과를 통해서 요구되는 Calculator 클래스를 디자인해보자

 

문제2

Printer라는 이름의 클래스를 디자인하자. Printer클래스는 두가지 기능을 지닌다. 그 중 첫번째는 문자열을 설정할 수 있는 기능이고, 두번째 기능은 설정되어 있는 문자열을 출력하는 기능이다. main함수와 출력 결과를 통해서 요구되는 Printer 클래스를 디자인 해보자.( 멤버 변수는 private로 멤버함수는 public으로 하자)

'개발 및 관련 자료 > C' 카테고리의 다른 글

[C++] 005. 복사 생성자  (0) 2013.05.12
[C++] 004. 클래스의 완성  (0) 2013.05.12
[C++] 002. C기반의 C++ 2  (0) 2013.05.12
[C++] 001. C기반의 C++ 1  (0) 2013.05.12
[C] 26. 매크로와 전처리기  (0) 2013.05.12
Comments