Monday, August 11, 2008

Basic concepts

상속
class drivedClass : public baseClass { ... }

public
interface의 일부로 상속한다는 의미 not as an implementation

protected
기본 클래스의 private멤버에 접근하고 싶을때 protected에 선언

baseClass::function
같은 이름의 기본클래스의 함수에 접근하고 싶을때

Polymorphism(다형성), binding
기본클래스의 레퍼런스를 인자로 받는 함수에서 파생클래스를 넣어도 되는 식
- 파생클래스의 기본 클래스 부분만 사용된다. (1)

virtual
(1)에서 파생클래스의 것을 자동으로 사용하게 해주고 싶을때 사용
클래스의 인자가 레퍼런스나 포인터로 호출된 경우에만 가능.

일반적으로 파생클래스에서 재정의 되는 virtual함수들은 기본클래스의 함수와 동일한 타입을 리턴해야하지만, 기본클래스의 virtual함수가 *this를 리턴하는 경우 파생클래스에서도 기본클래스의 포인터가아닌 파생클래스의 포인터(*this)를 리턴할 수 있다.

virtual function의 경우 기본/파생 클래스 함수들의 매개변수 갯수 타입이 다르면 별도의 함수로 동작하기 때문에 이를 고려해서 구현해야한다. 매개변수 개수가 다른 경우에는 아래와 같은 식의 구현을 통해 virtual function을 사용할 수 있다.

void BaseClass::func(double d1, double = 0) { ... }
void DerivedClass::func(double d1, double d2) { ... }

static binding
호출되기 전에 타입이 결정되어 그 타입으로 사용됨

dynamic binding
호출될 때 타입이 결정되어 그 타입으로 사용됨
레퍼런스나 포인터로 전달할 때 이루어짐 (실제 전달되는 값을 알지 못하므로)

virtual destructor
포인터나 레퍼런스에 대한 객체의 타입을 모르지만 delete 하고 싶은 경우 소멸자를 virtual로 선언하여 각 객체에 맞는 소멸자를 호출해주게 하는 것

Rule of three
복사생성자, 대입연산자, 소멸자 : 는 붙어 다닌다.

static member function
클래스의 멤버 함수로 호출되더라도 객체(this)의 멤버와 연관이 없는 작업을 수행하는 함수.
ex. static void func (classA& c1, classA& c2)

handle class
서로 상속관계를 가진 여러 클래스들을 하나의 클래스 처럼 사용하고자 할 때 인터페이스 역할을 하도록 하나의 클래스를 만들어 각 경우에 맞는 클래스의 객체를 생성하고 생성한 객체의 포인터(혹은 레퍼런스)를 가지게 하는데, 이를 핸들 클래스 라고 한다. 이 때 포인터는 기본클래스의 포인터를 가진다.
포인터를 가지고 연산하기 때문에 복사생성자, 대입연산자, 소멸자가 필요하다.

virtual clone function
복사 생성자의 경우, 핸들클래스는 생성한 클래스의 포인터를 가지고 있기 때문에 어떤 클래스를 생성해서 가지고 있는지 모르므로, 복사될 핸들 클래스의 포인터에 어떤 클래스를 생성해서 대입해야할지 모른다. 그래서 자기 자신을 복사하는 clone 함수를 각 클래스 별로 정의하고, 기본클래스에서 이를 virtual 로 선언해서 핸들 클래스에서 사용시에 각 타입에 맞는 방식의 clone함수를
사용해 복사후 핸들클래스의 포인터로 넘겨줄 수 있다.

ex. 대부분 각 클래스들은 아래와 같은 식으로 clone()을 만들어 놓는다.
protected:
// virtual 은 기본클래스의 경우에만.
virtual BaseClass* clone() const { return new BaseClass(*this); }

대신 핸들클래스가 이를 사용할 수 있도록 기본클래스의 friend로 등록되어야 한다.

핸들 클래스에서 기본클래스의 포인터를 가지고 있기 때문에 파생클래스의 clone에 대한 접근은 virtual call로 이루어 진다. 때문에 핸들클래스만 기본클래스의 friend 로 등록되면 된다.

friend
함수가 특정 클래스의 protected영역에 접근할 수 있도록 할 때 클래스에 이 함수를 friend로 등록할 수 있다. 클래스가 friend로 등록된 경우 클래스의 모든 멤버가 대상 클래스의 friend 가 된다.

friend관계는 상속되지 않는다.

No comments:

Post a Comment