[C++] 3. 접근제한자, 클래스와 객체, this

2011. 5. 20. 12:39C++


C++ 기초 3

1. Bitwise
    정수 변수의 값을 비트만큼 이동시키는 것을 말한다. (shart ,int ,long, char 만 사용가능하다)
    비트가 소실되지 않는한 n비트만큼 왼쪽으로 밀면 기존 값*2^n 의 결과가 된다.
    오른쪽으로 밀면 기존값/2^n 이 된다.
    사용법: unsigned int number = 4;
               number<<2;  // 16
               number>>2;  // 1

2. lvalue 의 의미
   lvalue란 메모리안에 있는 하나의 어드레스를 지정하는 것입니다. lvalue라고 불리는 이유는 할당문에서 등호의 왼쪽에 나탈수 있기때문에 그렇게 이름지어졌습니다.


3. Struct & Class
  Struct : 사용자 정의 자료형, 기본 자료형으로 인식해 주지 않는다.
    따라서 아래와 같이 사용해야 합니다.
    typedef 을 하지 않았다면

    struct Person {
 int age;
 char name[20];
    }

    Person p = {10,"ncanis"}; (c: x , c++:o)
    struct Person p; (o)


 Class : 멤버 변수와 멤버함수를 사용할 수 있다. 이 2가지를 이용해 하나의 자료형을 만든다.


4. 접근 제한자
  public: 어디서든 사용가능
  protected: 상속된 자식클래스까지만 사용가능
  private: 내부 접근만 가능

  만약 선언이 되어있지 않으면 private으로 인식한다.

  * 전역 함수에 대한 friend 선언
    정보 은닉에 위배되기때문에 유용하지 않습니다.
    다만 연산자 오버로딩에서는 유용하게 사용합니다.

    전역함수에게 private 영역 접근을 허용합니다.
    예를들면 AAA 클래스에서 friend class BBB; 라고 선언하면
             BBB 클래스에서는 AAA클래스내의 private 영역에 접근이 가능합니다.

    class AAA {
        private: int value;
        friend void SetX(A& a, int value); // 외부 전역함수를 friend로 선언
        friend class BBB; // BBB 클래스를 friend로 선언함
    };
    void SetX(A&a, int value) {
        a.value = value; // AAA의 private 변수 value 접근
    }

    class BBB {
       public: void SetX(A& a, int value) {
           a.value = value; // AAA의 private 변수 value 접근
       }
    }


5. 클래스
  - 정보은닉: 외부공개할필요 없는 변수들은 접근 제한자를 이용해 제한한다.(private)
  - 캡슐화
  - 생성자: 객체 생성과 동시에 초기화, 단 한번만 호출 

  - 객체 생성
    : 메모리 할당
    : 생성자의 호출
    : 생성자를 통한 인자의 전달
    ex> Person p; // 디폴트 생성자(void)
        Person p(10,"name");
        Person p(); // 이건 함수의 선언이다. 참고.

  - 소멸자
    : 객체는 기본자료형 변수, 구조체 변수가 소멸되는 시점과 동일합니다.
    : 함수내에서 선언된 객체는 호출이 끝나면 소멸됩니다.
    : 전역적으로 선언된 객체는 프로그램이 종료될때 소멸됩니다.
    : 소멸자는 객체의 소멸시 자동으로 호출됩니다.

    : 생성자에서 메모리 동적 할당을 하는경우

    

예>
     char *name;

     Person::Person() {
           name = new char[10]; // Heap에 저장됨 (동적할당)
           int b; // Stack 에 저장
     }
     Person::~Person() {
            delete []name;
     }

     Heap에 저장된 name은 반드시 명시적으로 해제를 해주어야 합니다.
     즉 반드시 delete []name 을 호출 해주어야 합니다.

     int main() {
         Person p1;
         Person p2;
         return 0; // 리턴과 동시에 p1과 p2의 소멸자가 호출된후 객체가 소멸 됩니다.
     }

6. 객체의 포인터
   객체를 가리킬 수 있는 포인터를 멤버로 지니는 배열
   Point* arr[5]; // Point 클래스에 대한 포인터 주소, 포인터는 무조건 4바이트 할당 ( 20bytes)

   for(int i=0;i<5;i++) {
         arr[i] = new Point(10);   // 포인트 클래스의 포인터 주소들은 Stack에
                                   // Point 객체는 Heap에 저장
   }

7. this(자기참조 포인터)
   - 연산자 오버로딩에서 유용하게 사용 (예> this->name = name; )

   Person* GetThis() {
        return this;
   }
   int main() {
      Person *p1 = new Person();
      cout<<p1<<endl;
      cout<<p1->GetThis()
      // 위 2개는 서로 같은 주소값을 보여준다.
      // 즉 this는 할당된 자기자신 객체의 시작번지 주소를 가리킨다.( 자기참조 포인트 )
   }

   => p1->i 는 (*p1).i 을 말한다.