객체지향 설계의 핵심은 구체적인 구현이 아닌 규격에 의존하는 데 있다.
C++에서 인터페이스(Interface)와 추상 클래스(Abstract Class)를 활용해 유연한 설계를 구현하는 방법을 정리했다.
규격을 정의하는 두 가지 방식
C++은 별도의 interface 키워드가 없는 대신 가상 함수를 통해 이를 표현한다.
-
추상 클래스: 하나 이상의 가상 함수를 포함하며, 직접 객체를 생성할 수 없는 클래스이다.
자식 클래스들이 공통으로 가져야 할 로직이나 상태를 상속할 때 사용한다. -
인터페이스 (순수 추상 클래스): 모든 멤버 함수가 순수 가상 함수(
= 0)로만 구성된 클래스이다.
해당 클래스를 상속받는 경우 반드시 이 기능들을 구현해야 한다는 규격을 정의한다.
가상 소멸자
다형성을 활용할 때 부모 클래스의 소멸자를 반드시 virtual로 선언해야 한다.
부모 타입 포인터로 자식 객체를 삭제할 때 자식의 소멸자가 정상적으로 호출되어 메모리 누수를 방지할 수 있기 때문이다.
추상화와 설계
구체적인 구현 내용을 몰라도 인터페이스만 알면 코드를 작성할 수 있다는 점이 객체지향의 특징이다.
가상 함수 테이블(vtable)의 동작 원리를 이해하면 런타임에 적절한 함수를 찾아가는 다형성의 원리를 파악할 수 있다.
시스템 설계 능력을 기르기 위해 추상화 개념을 적극 활용해야 하는 것 같다.