C++ 프로젝트를 진행하며 상속 구조를 설계할 때 반드시 숙지해야 할 핵심 개념들을 정리한다. 특히 메모리 누수와 접근 제어자 문제는 런타임 에러의 주범이 되므로 정확한 이해가 필요하다.
1. 추상 클래스와 순수 가상 함수 (Abstract Class)
C++에서 하나 이상의 순수 가상 함수를 포함하는 클래스는 추상 클래스가 된다. 이는 객체의 직접적인 생성을 방지하고, 자식 클래스에서 반드시 구현해야 할 인터페이스(Interface)를 정의하는 역할을 한다.
- 정의 방식: virtual void function() = 0;
- 접근 제어자: class 내부는 기본이 private이다. 외부 호출 및 오버라이딩을 위해 반드시 public:을 명시해야 한다. 명시하지 않을 경우 inaccessible 컴파일 에러가 발생한다.
2. 가상 소멸자의 역할과 필요성 (Virtual Destructor)
상속 관계에서 부모 클래스의 포인터로 자식 객체를 관리할 때, 메모리 해제 과정에서 치명적인 문제가 발생할 수 있다.
- 문제 발생: 부모 소멸자가 virtual이 아니면, delete 호출 시 부모 클래스의 소멸자만 실행된다. 이 경우 자식 클래스에서 할당한 리소스(힙 메모리 등)가 해제되지 않아 메모리 누수(Memory Leak)가 발생한다.
- 해결: 부모 소멸자에 virtual 키워드를 붙이면, 자식 소멸자가 먼저 실행된 후 부모 소멸자가 실행되는 정상적인 소멸 순서를 보장한다.
- 전파 특성: 부모 클래스의 소멸자가 가상이면, 자식 클래스의 소멸자 역시 명시하지 않아도 자동으로 virtual 속성을 갖게 된다.
3. STL std::sort를 활용한 커스텀 정렬
기본적인 오름차순 외에 복합적인 조건으로 정렬할 때는 비교 함수(Comparator)를 정의하여 sort 함수의 세 번째 인자로 전달한다.
- 내림차순 조건: return a > b; (앞의 인자가 뒤보다 클 때 true 반환)
- 다중 조건 정렬: 1순위 조건이 일치하지 않을 때 우선 처리하고, 일치할 경우에만 2순위 조건을 비교하는 로직을 구성한다.
-
C++
bool compare(const Data& a, const Data& b) { if (a.score != b.score) return a.score > b.score; // 1순위: 점수 내림차순 return a.name < b.name; // 2순위: 이름 오름차순 }
4. 생성자 초기화 리스트 (Member Initializer List)
객체 생성 시 멤버 변수를 초기화하는 가장 효율적인 방법이다.
- 문법: ClassName(int val) : member(val) { }
- 특징: 생성자 본문에서 값을 대입(=)하는 방식보다 성능이 우수하며, const 멤버나 참조자(&) 멤버를 초기화할 수 있는 유일한 방법이다. 매개변수와 멤버 변수의 이름을 동일하게 사용할 수 있어 가독성 면에서도 유리하다.
5. 구조체(Struct)와 클래스(Class)의 차이점
C++에서 두 키워드의 기능적 차이는 기본 접근 제어 권한에 있다.
- Struct: 기본 접근 권한이 public. 주로 단순한 데이터 묶음(DTO)을 정의할 때 사용한다.
- Class: 기본 접근 권한이 private. 캡슐화를 통해 데이터를 보호하고 메서드를 통해 제어하는 객체 설계에 적합하다.
요약하자면, 상속을 전제로 한 클래스 설계 시에는 가상 소멸자를 반드시 선언하여 메모리 안정성을 확보해야 하며, 추상 클래스의 접근 제어자를 적절히 설정하여 인터페이스로서의 기능을 보장해야 한다. 또한, 생성자 초기화 리스트와 STL 비교 함수 활용 능력을 갖추는 것이 효율적인 C++ 프로그래밍의 기초가 된다.
'TIL' 카테고리의 다른 글
| [C++] 클래스 상속과 템플릿의 조화 (0) | 2026.05.11 |
|---|---|
| [C++ ] 템플릿(Template)과 STL 컨테이너정리 (0) | 2026.05.08 |
| [C++] 함수 오버로딩, 템플릿, 그리고 STL 컨테이너 기초 정리 (0) | 2026.05.06 |
| [C++]객체 지향과 메모리 관리 (0) | 2026.05.04 |
| C++ 클래스, 메모리, 그리고 참조 시스템 (0) | 2026.04.30 |