생성자와 소멸자

객체가 생기고 사라질 때는 무슨 일이 일어날까?

생성자

생기자마자 칸을 채웁니다

생성자(constructor)는 인스턴스의 데이터 멤버에 첫 값을 넣는 함수입니다. 이름은 클래스 이름과 같고, 인스턴스가 생길 때 저절로 불립니다. Stack의 생성자는 힙(실행 중에 받아 쓰는 칸, 4강)에 정수 100개의 배열을 받아 둡니다.

new는 힙에서 칸을 받는 명령입니다. 생성자는 객체를 만들지는 않고 초기화만 합니다.

연산의 속

push가 표현을 지킵니다

push는 먼저 자리가 남았는지 봅니다. 남았으면 topPtr을 1 늘리고 그 칸에 값을 넣습니다. 가득 찼으면 오류를 알리고 넣지 않습니다. 표현을 바꾸는 길이 연산뿐이니 이 검사를 건너뛸 수 없습니다.

++topPtr은 topPtr을 먼저 1 늘린다는 뜻이고, cerr << 는 오류 글을 내보내는 코드입니다. 5는 예시 값입니다.

소멸자

떠날 때 칸을 돌려줍니다

소멸자(destructor)는 인스턴스가 사라질 때 뒷정리를 하는 함수입니다. 주로 힙에서 받은 칸을 돌려줍니다. 이름은 클래스 이름 앞에 ~를 붙인 것이고, 객체의 수명이 끝날 때 저절로 불립니다.

delete는 힙의 칸을 돌려주는 명령입니다. 수명은 변수가 메모리 칸을 차지하고 있는 기간입니다.

언제 생기고 사라지나

사는 기간은 세 가지

C++의 인스턴스는 세 가지 방식으로 만들 수 있고, 방식마다 사는 기간이 다릅니다. 정적이면 프로그램 내내, 스택 동적이면 선언이 실행될 때부터 블록을 벗어날 때까지, 힙 동적이면 new에서 delete까지입니다.

스택 영역은 메모리의 구역 이름으로, 우리가 만든 Stack 타입과는 다른 것입니다. 블록은 중괄호로 둘러싼 구역입니다.

명세와 구현의 분리

선언과 정의를 나눕니다

C++에서는 클래스를 두 파일로 나눠 적을 수 있습니다. 헤더 파일에는 멤버 함수의 이름과 타입만, 구현 파일에는 본문을 적습니다. 사용하는 쪽은 헤더만 봅니다.

void push(int); 처럼 본문 없는 선언이 프로토타입입니다. Stack::push는 Stack 클래스의 push라는 뜻입니다.

다음 편

자바는 같은 클래스를 조금 다르게 다룹니다

5편자바에는 왜 delete가 없을까? 10강 목록