ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구조체에서 클래스로!
    플밍/C++ (overview) 2012. 1. 3. 22:49

    2006/07/29 02:10




    구조체 : 부류를 형성하는 데이터들을 하나의 자료형으로 정의해서,

                관리 및 프로그램 구현에 도움을 주겠다는 의도로 등장.

     

    그런데......

     

    struct AAA{

             int data1;

             int data2;

             int data3;

    };

     

    {}안의 내용을 가진 사용자 정의 구조체 AAA타입을 만들었다. 그리고, main에서 써먹어보자.

     

    main(){

           int a = 10;

           Person p = {10, 20, 30};     

          

           return 0;

    }

     

    빨간 굵은 글씨로 된 부분은 .c로 컴파일 하면 에러가 난다.

     

    왜? C에서는 사용자가 직접 만든 타입은 primitive type과 동일하게 취급해주지 않는다!

    (해결을 위해선 앞에 struct를 붙여줘야 한다. =>  struct Person p;   

     왜? 왜? int형 선언할땐 아무것도 안 붙이는데, 왜 귀찮게 내가 직접 만든 타입을 선언할땐

    매번 앞에다가 struct를 붙여야 하는가!!!!!!!!!!!

     

    이를 C++에선 해결했다. 사용자 정의 자료형 변수도 기본 자료형 변수처럼 동일한 방법으로

    선언이 가능해졌다!  

     

    즉, 위의 소스를 .cpp로 컴파일 하면 오류가 나지 않는다.

     

    ========================================================

     

    부류를 형성하는 데이터들의 모임을 구조체 라고 했는데, 그럼 데이터들만 ?

    (C에서는 구조체는 데이터들로만 이루어져 있어야 했다. C++는 함수도 포함될수 있다.)

    data들만 가지고는 프로그램이 될수 없다.

     

    프로그램 = data + (그 data를 조작하는)루틴(함수)

     

    이므로,  함수를 추가 해야 쓰겄다.

     

    struct AAA{

            data1;

            data2;

    }

     

    void fun1(){

            ...

    }

     

    void fun2(){

            ...

    }

     

    int main(){

            ....

    }

     

    음.... 추가하긴 했는데, C++에서 추구하는 객체지향, (내 생각: 캡슐화)에서 멀어진다.

     

    좀더 객체지향 스럽게 모아모아서~

     

    struct AAA{

            data1;

            data2;

            void fun1(){

                    ...

            }

            void fun2(){

                    ...

            }

    }

     

    이렇게 모아졌다!

     

    여기서 struct를 class로 바꿔보자!

     

    짠! 무리없이 돌아간다!

     

    즉, C++에서 구조체는 클래스의 범주내에 속한다.

     

    그렇다면, 클래스란 무엇인가?    attribute(멤버변수) + method(멤버함수) 이다.

     

    =====================================================

     

    <객체 만들기~!! >

     

    1. 추상화 하기

     

    '계좌'를 예로 들어보자.

    추상화는 우리말로 해도 된다 -_-

    계좌 = attribute(계좌번호, 비밀번호, 이름, 잔액) + method(입금, 출금)

     

     

    2. 클래스화 하기

     

    위의 등식을 그대로 컴퓨터가 아는 언어로(여기서는 C++) 옮겨주면 된다.

     

     

    3. 객체화 하기(인스턴스화 하기 = instantiation)

     

    '계좌'는 내가 만들면 이런 '계좌'가 되고, 철수가 만들면 저런 '계좌'가 된다.

    이렇게 만들어진 하나 하나가 인스턴스, 즉 객체가 된다.

    ('인스턴스'와 '객체' 사이엔 미묘한 차이가 있으나, 객체지향에서는 동일시 하는 경향이 있다.)

     

    ========================================================

     

    <공개 여부 설정>

     

    class XXX{

    public:

            int top;

            void func1();

    }

     

    int main(){

            XXX xx;

            xx.top = 2;

    }

     

    이렇게 파란 굵은 글자 처럼 public으로 선언된 '것'들은 외부에서 접근이 가능하다.

    (사실 이런 식으로는 잘 안쓴다. 객체지향의 특성이 위배되기 때문이다.)

     

    초록 굵은 글자 public이 의미하는것은, 해당 클래스 외부에서 접근이 가능하다는 뜻.

    그리고, private이 의미하는 것은, 해당 클래스 내부에서만 접근이 가능하다는 뜻.

    그리고, protected가 의미하는 것은, 상속 관계에 있는 클래스내에서만 가능하다는 뜻.

    그리고, friend가 있는데 자세히 알아보자.

     

    1) 전역 함수에 대한 friend선언

     

    class AAA{

           int c;

    public:

           void func1();

           friend void func2();

    };

     

    void func2(const AAA& a1){

           a1.c = 20;

    }

     

    AAA클래스는 func2()를 친구로 생각하겠다는 말이다. 그러므로 func2()는 전역함수이지만

    AAA클래스 내부를 모두 조작가능해진다.

     

    2) 클래스에 대한 friend선언

     

    class AAA{

           int c;

    public:

           friend class BBB;

    };

     

    이 문장은 BBB내에서 c를 조작할수 있다는 뜻이다.

    friend선언은 단방향성을 가지고 있으므로, 여기서 AAA는 BBB의 내부를 조작할수 없다.

     

     

    ========================================================

     

    <클래스 선언과 정의는 헤더파일을 이용해서 구분하자.>

    (not necessary)

     

    [Door.h]

    #include <iostream>

    using std::cout;

    using std::endl;

     

    const int OPEN = 1;

    const ine CLOSE = 2;

     

    class Door{

    private:

          int state;

     

    public:

          void Open();

          void Close();

          void ShowState();

    };

     

    [Door.cpp]

    #include "Door.h"

     

    void Door::Open(){

          .......

    }

     

    void Door::Close(){

          .......

    }

     

    void Door::ShowState(){

          .......

    }

     

    [main.cpp]

    #include "Door.h"

     

    int main(){

          Door d;

          d.Open();

          .....

    }

     

     

    ==========================================================

     

    <참고>

     

    C++에서 struct와 class의 유일한 차이점!

     

    struct AAA{

            int a;

            int b;

    }

     

    class AAA{

            int a;

            int b;

    }

     

    이같은 상황(멤버변수 공개에 대한 어떤 선언도 없다.)에서

     

    struct로 선언을 하면, a,b는 자동으로 public: 이 되고,

     

    class로 선언을 하면, a,b는 자동으로 private: 이 된다.



     

    '플밍 > C++ (overview)' 카테고리의 다른 글

    생성자(constructor), 소멸자(destructor)  (0) 2012.01.03
    정보은닉(information hiding), 캡슐화  (0) 2012.01.03
    동적 메모리 할당(malloc, new)  (0) 2012.01.03
    레퍼런스(&) , call-by-reference  (0) 2012.01.03
    const, * ..  (0) 2012.01.03
Designed by Tistory.