GEMS 2권 추상 인터페이스
추상 인터페이스는 어떠한 구현도 제공하지 않는다. 규칙만 정의한다.
이러한 설계의 장점은
- 상속받는 새 클래스를 만들고 인스턴스화 하기만 하면 나머지 부분은 수정하지 않아도 된다.
- 실행시점에서 두 클래스들을 전환할 수 있다.
- 인터페이스를 제외한 세부사항들에 대해서 사용자에게 알려주지 않아도 된다.(은폐되어 있다.)
- 코드가 깔끔하다.
* 특정 클래스로 형변환해서 클래스에 특정 기능에 접근하거나 특정 구현에 국한된 작동 방식에 의존하려는 행동은 추상 인터페이스로 인한 이득이 사라질 수 있으니 방지하는 것이 좋다.
추상 팩토리란?
하나의 인터페이스에 대한 특정 구현을 요청에 따라 인스턴스화 하는 것이 유일한 목적인 클래스
* 추상 인터페이스는 항상 가상 소멸자를 가져야 한다.
그렇지 않으면 C++은 자동적으로 비가상 소멸자를 생성하며, 그러면 구체적인 구현의 실제 소멸자가 호출되지 않는다.
일반적인 멤버 함수들과는 달리, 소멸자는 '순수' 가상 소멸자로 지어할 수 없으므로, 컴파일러를 만족시키기 위해서는 가상 소멸자를 빈 함수로 정의해 주어야한다.
다중상속 시에도 편리하다.
다중상속을 피해야 한다고 말하지만 추상클래스의 경우 커다란 단점은 없다.
마름모꼴 상속구조가 될 가능성이 없기 때문이다.
추상 클래스의 단점
설계가 복잡해진다. 이득이 확실한 경우에만 사용하며, 무작정 적용하면 안된다.
디버깅이 어려워 질 수 있다. 인터페이스를 제대로 사용하지 않았을 때에만 버그들이 생길 수 있도록 견고하게 만들어야 한다.
상속을 통해서 추상 인터페이스 확장이 불가능 하다.
파생 클래스를 이용해서 새로운 인터페이스를 제공하는 것은 여전히 가능하나, 그런 것들은 모두 게임 코드가 아니라 클래스 구현 측면에서 이루어져야 할 일이다.
추상 인터페이스 안에 함수는 모두 가상 함수이다.
가상 함수는 호출하기 위해서 거쳐야할 단계가 하나 더 있기 때문에 빈번히 호출되는 함수들을 추상 인터페이스에 적용하는 것은 좋지 않다.