객체지향프로그래밍(7) - 소멸자

메모리 구조를 통한 소멸자 이해

Featured image

🔚 짧게 하는 복습

✅ 1. 오버로딩이 무엇인지 알고, 장단점이 무엇인지 안다.

✅ 2. 생성자 오버로딩, 생성자 리스트를 사용할 줄 안다.

✅ 3. 읽어볼 거리를 통해, 오버로딩의 우선 순위를 이해한다.

혹시 기억이 안 난다면, 다시 돌아가자


저번 시간에는 함수 오버로딩을 통해 생성자에 대한 심화내용을 다루는 것을 했다.

생성자객체 생성 시 호출되어 초기화를 하는 메소드였다.

이번 시간에는 생성자의 반대 격인 소멸자에 대해 다루어보겠다.


소멸자란?

생성자와 소멸자는 굉장히 비슷한 형태를 가진다.

생성자처럼 반환형이 없고, 클래스 이름 앞~를 붙여주면 그 자체가 소멸자 함수 선언이 된다.

생성자와 반대로, 소멸자객체의 수명이 끝날 때 호출되는 함수이다.

여기서 잠깐, 객체의 수명이 뭐지…? 기억이 안 날 법하니 다시 설명해보겠다.


메모리 구조로 보는 변수의 할당 원리, 그에 따른 수명

간단한 복기를 하자면, 메모리 구조는 Data, Text, Stack, Heap, 총 4가지의 영역을 가진다.

텍스트 영역이란 우리가 작성한 코드상수가 위치하며, 이 영역은 읽기 전용이어서 실행 중에 코드를 수정할 수 없다.(함수도 여기 저장된다.)

데이터 영역은 보통 전역 변수가 저장되고, 힙 영역동적 할당된 변수가 저장된다.

스택 영역함수 호출과 관련된 변수, 함수의 인자, 반환 주소 등이 저장되는 영역이다.

즉, 객체구조체의 연장이고 하나의 변수이니 , 스택 또는 데이터 영역에 저장이 된다.

그렇다면 각 영역에서 변수가 얼마나 생존 가능한지를 생각해보면 된다.

가장 쉬운 것은 데이터 영역이다. 전역이니까 프로그램이 끝날 때, 객체도 같이 사라진다.

두 번째는 힙 영역이다. 당연히 동적 할당 되었는 변수이니, 할당이 해제될 때 객체는 사라진다.

마지막으로 스택 영역이 헷갈릴 수 있는데, 모든 프로그램은 기본적으로 함수를 호출하는 방식으로 진행된다. (main 함수가 필수인 이유이다.)

새 함수가 호출될 때마다 스택 영역에, 새 함수 스택 프레임이 쌓인다.

함수가 실행되는 동안에, 함수 내의 모든 변수는 스택 프레임에서 실행된다.

마지막으로 함수가 종료되면, 스택 프레임이 스택 영역에서 사라진다.

즉, 함수가 종료될 때 함수에서 호출한 객체도 같이 사라지는 것이다. (더 자세한 원리는 읽어볼 거리 참고)

그렇다면 이제 직접 실습을 해보자.


실습 코드


✅ 1. 메모리 구조에 대해 알고, 영역별 특징을 안다.

✅ 2. 영역별 변수의 수명을 이해한다.

✅ 3. 소멸자에 대해 안다.

💣 과제, 없음

  1. 읽어볼 거리(1) - 함수 호출의 원리
  2. 읽어볼 거리(2) - 변수 저장 및 동적 할당의 원리