위 주제는 많은 경험과 지식을 토대로 작성되어야 하므로 여기서는 형식적인 이론만을 간단히 작성.
객체지향언어를 공부하다보면 빠지지 않고 등장하는 키워드가 정보은닉, 캡슐화, 다형성 등이다.
# 정보은닉(information hiding)
클래스 디자인의 가장 기본원칙은 캡슐화와 정보은닉이다.
기초 이론은 멤버변수의 private를 기반으로 멤버 함수들의 const화 그리고 제한된 방법으로만의 접근 허용이다.
◎ 정보은닉의 필요성
- 프로그램의 안정적 구현과 관련
◎ 제한된 접근 방법
- Get으로 시작하는 함수를 이용하여 private 멤버 변수에 접근하도록 한다. (관례)
- Set으로 시작하는 함수를 이용하여 private 멤버 변수를 변경하도록 한다. (관례)
- const 선언을 최대한 효율적으로 사용하여 접근제한의 안정성을 높힌다.
# 캡슐화(Encapsulation)
캡슐화의 기본 이론은 관련 있는 데이터와 함수를 하나로 묶는것이다.
언뜻보기엔 쉽지만 그 범위의 제한을 둘수 없을뿐더러 상황에 따라 변화하고 개인차에 따라 변하기 때문에 쉬운
개념이 아니다. 가장 중요한것은 캡슐화가 지니는 장점이 무엇이며 캡슐화의 필요성을 인식하는 것이다.
캡슐화는 감싸는 개념이다. 그런데 감싸려면 안전하게 감싸야한다. 다시 말해서 이왕이면 멤버변수가 보이지 않게
정보를 은닉해서 감싸는 것이 좋다. 그래서 캡슐화는 기본적으로 정보은닉을 포함하는 개념이라고도 한다.
# 생성자와 소멸자
◎ 생성자란?
- 객체생성시 반드시 한번 호출되는 함수.
- 사용자가 작성하지 않을경우 컴파일러에 의해 디폴트 생성자가 자동 삽입된다.
- 생성자는 함수이며 이름은 클래스와 같아야 한다.
- 리턴형이 없으며 리턴하지도 않는다.
◎ 생성자의 필요성
- 객체를 생성과 동시에 초기화 하기 위해(이것이 좋은 구조이다)
◎ 객체의 생성과정
- 메모리 할당 → 생성자의 호출
◎ 멤버 이니셜라이저
- 생성자 호출이전에 초기화 하는 방법
- 성능에 약간 이점이 있다.
- 함수 원형 옆에 ( : ) 연산자를 이용하여 초기화한다.
- 이니셜라이저를 이용하면 선언과 동시에 초기화가 이뤄지는 형태로 바이너리 코드가 생성된다.
- const 멤버변수도 이니셜라이저를 이용하면 초기화가 가능하다.
- 참조자(reference)도 이니셜라이저를 이용하여 초기화가 가능하다.
◎ 소멸자
- 생성자와는 달리 함수 이름앞에 ~가 붙는다.
- 반환형이 없으며, 반환하지 않는다.
- 매개변수는 void형으로 선언되어야 하므로 오버로딩, 디폴트설정등이 불가능하다.
class NameCard
{
private:
char *name;
int position;
public:
NameCard(){} // 디폴트 생성자(생성자를 작성하지 않으면 컴파일러에 의해 자동삽입)
NameCard(char *pName,int pos) : position(pos) // 사용자가 작성한 생성자, 이니셜라이저
{
name=newchar[strlen(pName)+1]; strcpy(name,pName);
}
~NameCard() { delete []name; } // 소멸자
};
# this 포인터-
자기 참조 포인터이다.
- 현재 객체의 주소 및 멤버를 참조 할 수 있다.
- 연산자 오버로딩에서 유용하게 사용된다.
class AAA
{
private:
int num;
...
void SetMem(int num){ this->num=num; }
...
}
※ this가 가리키는 변수 num은 AAA객체의 멤버변수 num이고 대입되는 변수num은 인자로 받아온 num이다.# friend 선언- 전역함수의 friend 선언의 경우 private 영역에 접근을 가능케 한다.
- 클래스의 friend 선언의 경우 private로 선언된 모든 영역에 접근 가능하다.
- 정보은닉에 위배되는 개념이다.
- 자주 사용하되지는 않지만 연산자 오버로딩에서 유용하게 쓰일 수 있다.