Basic/C/C++2012.02.07 22:32



 드디어 클래스를 공부하는군요. 클래스와 우리가 기존에 알고 있던 구조체를 같이 언급하면서 설명하도록 하겠습니다. 프로그래밍을 할 때, 관련 있는 데이터를 하나로 묶습니다. 관리하기도, 프로그래밍 하기에도 편하기 때문이죠. 그래서 구조체를 사용했습니다. 즉, 부류를 형성하는 데이터들을 하나의 자료형으로 정의해서, 관리 및 프로그램 구현에 도움을 주고있습니다.

 지금까지 우리는 구조체를 공부하면서 구조체 내부에 오직 변수만 정의하여 사용해왔습니다. 그러나 클래스는 함수까지도 포함을해서 정의합니다. 어떠한 데이터들이 부류를 형성한다고 가정해 봅시다. 예를들어 은행업무에서의 고객이름, 비밀번호, 계좌번호, 잔액은 모두 고객에 대한 정보로 부류를 이루고 있습니다. 출금기능과 입금기능은 함수로 구현을 했고 이러한 기능도 고객 정보에서 구현이 됩니다. 결론적으로 클래스의 개념은 구조체의 개념을 포함하고 있습니다. 클래스는 변수와 함수를 포함하기 때문이죠

 이제부터 클래스 내부에 정의되어 있는 변수를 맴버변수, 함수를 맴버 함수로 이야기 하겠습니다. 그리고 클래스의 변수는 객체라고 부르겠습니다. 클래스를 정의하는 방법은 구조체와 아주 비슷하니까 예제보시고 아 이렇구나~라고 생각만 하세요~

 클래스 맴버의 접근제어 방식에 대하여 알아보겠습니다. 무슨말이냐~ 하면요 클래스 안에 선언되어 있는 맴버의 접근 허용 범위를 이야기하는 것 입니다. 

  public, protected, private

이렇게 3개의 키워드가 존재합니다. 클래스 내에서 변수를 가지고 노는 것이 내부 접근, 클래스를 벗어나 다른 곳에서 클래스의 변수(맴버변수)를 가지고 노는 것이 외부 접근이라고 생각하시면 됩니다. 이러한 접근을 제어하는 역할을 하는데요 한번 살펴보도록 하겠습니다. 아! protected 키워드는 나중에 상속을 공부할때 언급하기로 하고 일단은 public과 private만 설명하겠습니다.

 class person
{
   private:
          int height;
   public:
          int age;
          void hchange();
          void achange();
          void show()
          {
                 cout<<"hi boxbop"<<endl;
           }
 };

 int main(void)
{
   person p;
   p.height = 10; //에러
   p.age = 10;  //가능
   p.show();  //가능
 }

 height 라는 변수는 private, 그외에는 public을 지정해주었습니다.
메인 함수에서 이러한 맴버 변수들에 접근하고 있습니다 요런걸 외부 접근이라고 하죠~ 여기서 height의 값을 10으로 바꾸는 부분에서는 에러를 발생시킵니다. 그외에는 public으로 설정해주었으니까 가능하구요. private는 맴버가 선언이 되면 클래스의 내부 접근만 허용하겠다는 이야기 입니다. 반면에 public은 클래스 외부 접근도 허용하겠다는 이야기가 되죠~

 클래스 내부의 함수를 외부에 정의하는 법을 배워보겠습니다. 이 방법을 왜 공부해보냐면 위의 클래스 같은 경우에는 함수의 구현부분이 상당히 짧습니다. 그러나 실제로는 짧지가 않죠! 때문에 클래스가 상당히 조잡(?)해지는 경우가 있을 수 있는데요 이를 방지하기 위해서 살펴볼거랍니다~ 위 예제에 이어서 설명하도록 하겠습니다.

 void p::hchange()
{
   heigh = 10;
 }
 void p::achange()
{
   age = 10;
 }

요렇게 작성해주면 됩니다. 물론 클래스 정의 부분과 메인함수의 사이에요~ 만약 ' p:: '라는 선언이 존재하지 않는다면 이는 전역함수가 되버리지만 저런 선언때문에 클래스 외부에서도 클래스의 함수를 구현할 수 있는겁니다. 즉, 맴버 함수의 선언만 클래스 내부에 두고, 정의(구현)는 클래스 밖으로 빼낼 수 있습니다.
 
 사실 클래스의 맴버 함수를 내부에 정의한다는 것은 외부에 정의하는 것과 달리 인라인(in-line)으로 처리할 것을 요구합니다. 

  inline void p::hchange()
{
   heigh = 10;
 }
 inline void p::achange()
{
   age = 10;
 }

 이렇게 앞에 inline키워드를 붙여주면 비록 함수의 정의가 클래스 외부에 있다고 하더라도 인라인화가 가능합니다. 

 오늘은 여기까지입니다. 피곤해서... 다음 장은 클래스에 대하여 마저 알아보도록 하겠습니다.
 
Posted by boxbop@gmail.com boxbop