본문 바로가기

전체 글

(5)
[C++] 클래스(class) (6) - 소멸자(Destructor) 생성자, 소멸자 호출 순서 생성자와 소멸자도 일종의 함수이기 때문에 call stack 위에서 호출이 처리된다. call stack은 FILO(First-In-Last-Out, 선입후출) 구조이기 때문에, 생성자가 호출된 역순으로 소멸자가 호출된다. 이때 2가지 특이 사항이 있다. 바로 상속(Inheritance)와 구성(Composition)의 경우이다. 구성(Composition) 쉽게 생각하면 다른 클래스 객체를 멤버로 갖는 상황이다. 이때는 객체 멤버가 정의된 순서를 따라 생성자가 호출된다. #include class Foo1 { public: Foo1() { std::cout
[C++] 클래스(class) (5) - 정규 타입(Regular Type)과 중괄호 사용 정규 타입(Regular type): 이상적인 클래스는 int처럼 행동한다 (C++ Core Guideline C.11) 클래스를 디자인할 때 직관적이면서 다루기 쉬운 편이 좋다. 프로젝트 규모가 커지고 객체 간의 관계가 서로 얽히다 보면, 간단한 연산이 관리에 용이하기 때문이다. 그렇다면 "이상적인 클래스는 int처럼 행동한다"는 무엇을 의미할까? 이는 대부분의 STL 컨테이너 클래스가 해당되는데 5가지 특성이 있다. 기본 생성이 가능한(default constructibility) 클래스 int와 std::vector의 차이점을 생각해 보자. 두 객체 전부 초기화 없이 생성가능하다. int num; std::vector vec; 기본 생성이 가능하기 위해서는 멤버 변수 모두 기본 생성자를 가진 변수 ..
[C++] 클래스(class) (4) - The Rule of Zero/Five 생성자가 필요한 이유 클래스는 객체(정확히는 인스턴스)를 초기화할 때 틀이 된다. 객체를 위한 메모리 공간을 할당(allocate)하고, 할당된 공간에 값을 초기화한다. 만약 생성자를 따로 정의하지 않으면 C++ 컴파일 과정에서 자동으로 기본 생성자를 호출한다. 밑에서 더 자세히 서술하겠지만, 객체 내부에 있는 객체(데이터)가 기본 생성자가 없는 경우에는 쓰레기 값(dump value)으로 객체가 초기화한다. 절대 규칙은 아니지만, 객체를 생성한 후에 내부 데이터를 변경하면 캡슐화(encapsulation) 규칙에 위배되므로 상황에 따라 생성자를 반드시 정의해야 한다. The Rule of Zero(C++ Core Guidelines C.20) 기본 연산(생성, 소멸, 복사, 복사 할당, 이동, 이동 할..