본문 바로가기

C, C++/C++ 여행

[A Tour of C++] 5장 - 클래스

클래스: 프로그램 코드 내 엔티티를 표현하기 위한 사용자 정의 타입이다.

 

구체 클래스: 내장 타입과 완전히 똑같이 동작하는 클래스이다. (객체를 직접 인스턴스화할 수 있음

따라서

1. 해당 객체를 스택, static 메모리, 다른 객체에 선언 가능

2. 객체 직접 참조 가능

3. 객체 복사, 이동 가능

4. 객체를 즉시 완전하게 초기화 가능 

 

컨테이너: 원소 묶음을 담아두는 객체. vector같은 클래스를 컨테이너라고 한다.

원소 묶음을 담기 때문에 해당 원소를 할당한 메모리를 반드시 소멸자를 통해 해제해야한다.

 

RAII(Resource Acquisition is Initialization): 생성자에서 리소스를 획득하고 소멸자에서 해제하는 방식. 이를 통해 객체 생성 시 new, delete를 직접 사용하지 않도록 감춘다.

 

초기자 리스트 생성자(initializer-list constructor): 생성자에 initializer_list<type>  인자를 받으면 {1, 2, 3, ...}와 같이 n개의 요소를 받아 사용할 수 있다.

 

추상 타입: 세부 구현을 사용자에게 감추는 타입. 하나 이상의 순수 가상 함수를 가진다. abstract type의 세부 구현은 하위 클래스에서 하기 때문에 직접 인스턴스화가 불가능하고, 따라서 사용 시에는 힙에 할당해서 사용한다.

직접 생성하지 않기 때문에 생성자는 없으며, 파생 클래스에 의해 삭제는 되어야하므로, virtual 소멸자를 선언한다. 

 

virtual 함수: virtual 키워드를 사용해 함수를 선언하면,  파생(Derived)클래스에서 나중에 정의할 수 있다. 

virtual function() = 0; 꼴로 되어있는 함수를 순수 가상 함수(pure virtual function) 이라고 하고, 이는 반드시 하위 클래스에서 언젠가 구현되어야 한다.

 

vtbl: 가상 함수를 포함하는 클래스는 함수를 식별하는 vtbl이 있다. 

 

vtbl을 활용하는 어셈블리 코드이다. ptr이라는 기반 클래스 포인터에서 foo라는 함수를 찾기 위해 여러 접근 과정을 거쳐 함수 call을 하는 것을 볼 수 있다. 


조언

1. 아이디어를 코드에 직접적으로 표현

2. 구체 타입은 가장 단순한 클래스. 복잡한 클래스, 평범한 데이터 구조보다는 구체 타입 사용

3. 간단한 개념은 구체 클래스로 표현

4. 성능이 중요한 컴포넌트에는 클래스 계층 구조보다 구체 클래스 사용: 접근이 빠름

5. 생성자를 통해 객체 초기화 처리

6. 클래스의 표현에 직접 접근이 필요한 경우 함수를 멤버만 접근할 수 있게 만들자

7. 연산자는 기존의 사용법을 모방하도록 정의하자

8. 대칭 연산자에는 비멤버 함수를 사용한다.

9. 객체 상태를 수정하지 않을 때는 멤버 함수를 const로 선언

10. 생성자가 자원을 획득하면 소멸자에서 해당 자원을 해제한다.

11. 기존 new delete 사용 x

12. 대신 RAII와 자원 핸들 사용

13. 클래스가 컨테이너면 초기자 리스트 생성자 (initializer-list constructor) 사용

14. 인터페이스와 구현을 완전히 분리해야 하면, 추상 클래스를 인터페이스로 사용 (순수 가상함수만 사용)

15. 다형 객체는 포인터와 참조로 구분 (하위 구현을 알 수 없음)

16. 추상 클래스에는 일반적으로 생성자가 불필요

17. 클래스 계층 구조를 통해 상속 개념 표현

18. virtual 함수를 포함하는 클래스는 virtual 소멸자 필요

19. 클래스 계층 구조에서 명시적으로 오버라이딩 시에 override 를 붙인다.

20. 구현 상속과, 인터페이스 상속을 구분하자

21, 22, 23. dynamic_cast를 통해 클래스 상속 구조를 탐색할 수 있다. (포인터, 참조)

24. new를 사용할거면 smart pointer를 사용하면 확실히 delete할 수 있다.

'C, C++ > C++ 여행' 카테고리의 다른 글

[A Tour of C++] 7장 - 템플릿  (1) 2025.06.10
[A Tour of C++] 6장 - 필수 연산  (1) 2025.05.17
C++ 여행 조언 새기기 4  (0) 2025.02.22
C++ 여행 조언 새기기 3  (1) 2025.02.22
C++ 여행 조언 새기기 2장  (0) 2025.02.16