[C++] 생성자와 소멸자

닿메_dahme
|2024. 12. 30. 22:18

2024년 12월 30일 월요일

오늘은 월요병이 온 탓인지 학습에 쉽사지 집중을 하지 못했다.

그래서 코드와 강의를 듣기보다는 지금까지 공부하면서 헷갈리고 명확하지 못한 것들을 확실히 정리하는 시간을 가졌다.

오늘은 생성자와 소멸자에 대해 공부를 해봤다.

생성자

  • 객체가 생성되는 시점에 자동으로 호출되는 멤버 함수
  • 클래스 이름과 동일한 멤버 함수
  • 리턴 타입 지정하지 않음(void도 마찬가지)
  • 오버로딩을 통해 다형성을 구현하면 중복된 생성자 중 하나만 호출
  • 생성자가 하나도 없다면 컴파일러에 의해 매개변수가 없는 기본 생성자가 자동 생성됨
    • 매개변수가 있는 생성자만 생성하고 매개변수가 없는 기본 생성자를 생성하지 않으면 컴파일 에러가 남

 

생성자가 필요한 이유

  • 인스턴스(객체)를 생성할 때 멤버 변수 값을 초기화하거나, 객체 크기에 맞는 메모리 할당, 파일을 열거나 네트워크 연결하는 등 생성하는 지점에서 해야 하는 초기화 작업들을 담당하기 위해 존재

 

생성자로 멤버 변수 초기화

  • 2가지 방법으로 초기화가 가능함.
Rectangle::Rectangle(){ width = 10; length = 10; }
Rectangle::Rectangle(int x) { width = x; length = x; }
Rectangle::Rectangle(int w, int l) { width = w; length = l }
Rectangle::Rectangle() : width(10), length(10) {}
Rectangle::Rectangle(int x) : width(x), length(x) {}
Rectangle::Rectangle(int w, int l) : width(w), length(l) {}

int width;  // int 클래스의 인스턴
int length;

🔼 이 케이스가 가능한 이유는 C++에서 멤버 변수 또한 객체이기 떄문.

int의 크기를 가지는 객체이므로 int 클래스의 인스턴스 width의 생성자 매개변수로 값을 넘겨줘서 초기화

 

위임 생성자

  • 타겟 생성자를 통해 생성자 작업을 대행
  • 더 공부해야할 것 같다.

 

소멸자

  • 객체가 소멸할 때 자동으로 호출되는 함수
    • 함수 내부에서 return되는 순간 생성자의 역순으로 호출됨
  • 임의로 호출 불가
  • 클래스와 동일한 이름, 리턴 타입 지정 x
  • 반드시 하나만 존재
  • 소멸자 앞에 ~(틸트)가 붙음
  • 소멸자가 없으면 컴파일러가 기본적으로 소멸자를 생성해줌
    • new 키워드로 만든 동적 생성 객체는 delete로 소멸시켜주자

 

소멸자가 필요한 이유

  • 객체가 사라지는 시점에 할당 받은 메모리를 해제, 파일 저장 및 닫기, 네트워크 닫기 등 자원에 대한 마무리 작업 수행
  • 소멸자가 없다면 메모리 오버플로우 발생 가능성 높음
    • 왜? 객체가 만들어질 때마다 메모리 등의 자원이 계속 추가적으로 사용될 것이고, 계속 반복되면 불필요한 데이터들도 메모리 공간에 남아있게 되어 남아있는 공간이 없어질 것.

 

참고링크

https://easy-study-note.tistory.com/33