소멸자는 언제 호출되길래 소멸자라 부를까?
생성자가 언제 호출되는 지 기억하는가?
오브젝트가 새로 만들어질 때이다.
스택에 in place되거나 힙에 new로 할당 될 때이다.
두 경우 모두 생성자가 호출된다.
그럼 소멸자는 이 객체가 지워질 때 호출된다.
new 만든 객체가 delete로 지워질 때,
스택에 만든 오브젝트면 스택에서 없어지면서 호출된다.
자바같은 경우에는 소멸자가 없다.
없을 수 밖에 없는게 소멸자는 뭐 할 일이 없기 때문이다.
C++는 소멸자가 있다.
그 이유는 뭘까?
C++는 메모리 관리를 스스로 해줘야한다.
따라서 만약에 C++ 클래스 안에서 내가 메모리를 할당을 한 상황이라면
내 오브젝트가 언제 지워지는 지 알아야
그 안에서 할당한 메모리도 지울 수 있다.
그 시기를 알기 위해서 사용하는 것이 소멸자이다.
이때 MyString.cpp에 소멸자가 delete[] 해주는 구문이 없다면
힙 메모리에 자리를 계속해서 차지할 것이다.
따라서 소멸자 안에 delete[] mChar를 넣어줘야한다.
즉 자바는 없고 C++에는 있는 기능이라면,
언매니지먼트 언어이기 때문에 있는 것이라 한 번쯤 생각해볼 수 있다.
생성자는 클래스 이름이었다.
소멸자는 ~클래스 이름이다.
소멸자는 매개변수 없이 ~클래스이름() 이다.
가상소멸자도 같이 포스팅하면 좋겠지만,
나중에 따로 설명하겠다.
가상 소멸자는 중요하니깐..!
정리
소멸자의 특징
- 개체가 지워질 때 호출된다.
Java와 C++의 소멸자의 차이
Java는 자동으로 가비지를 수집하기 때문에 소멸자가 없다.
C++는 C++ 클래스 내부에서 동적으로 메모리를 할당할 수도 있다.
따라서 필수적으로 소멸자에서 메모리를 직접 해제해 줘야 한다.
클래스 const 멤버 함수
class Vector
{
public :
...
int GetX() const;
int GetY() const;
...
}
간혹 멤버 함수 뒤에 const가 붙어있는 경우가 있다.
const란?
바꿀 수 없는 것을 말한다.
보통 const는 읽기 전용으로 가져올 때 쓴다.
const 메서드는 해상 개체 안에
어떠한 것도 바꾸지 않을 것인 용도로 쓸 때 쓴다.
값을 바꾸지 않는데 함수를 호출한다면, 읽기 전용이라는 뜻인 것이다.
const 키워드로 멤버 함수를 선언하면
함수가 자신이 호출되는 개체를 수정하지 않는 "읽기 전용" 함수로 지정된다.
상수 멤버 함수는 비정적 데이터 멤버를 수정하거나 상수가 아닌 멤버 함수를 호출할 수 없다.
선언과 정의 모두에 const 키워드가 필요하다.
// 출저 Microsoft C++ 공식문서
class Date
{
public:
Date( int mn, int dy, int yr );
int getMonth() const; // 읽기 전용
void setMonth( int mn ); // 쓰기 함수, 값을 가지고 오는 것이니 const안붙인다.
private:
int month;
};
int Date::getMonth() const
{
return month; // Doesn't modify anything
}
void Date::setMonth( int mn )
{
month = mn; // Modifies data member
}
int main()
{
Date MyDate( 7, 4, 1998 );
const Date BirthDate( 1, 18, 1953 );
MyDate.setMonth( 4 ); // Okay
BirthDate.getMonth(); // Okay
BirthDate.setMonth( 4 ); // C2662 Error
}
위 예제처럼 Get 함수에 const를 사용해주면 좋다.
그럼 const 매개 변수는 뭘까?
그 매개 변수가 바꾸지 않고 읽어올 것을 이야기 하는 것이다.
그럼 const 맴버변수는?
그 맴버 변수 안바꿀꺼라고 단언하는 것이다.
언제나 코드를 짤 때는 함수의 선언이 중요하다.
모른건 함수 헤더에서 시작된다고 해도 과언이 아닐 정도이다.
이걸 보는 순간 얘가 뭘 하는 지 알아야 한다.
얘가 내부 상태를 변화시키는 애인 지 아닌 지 알아야 한다.
이렇게 제한적으로 코딩하는 것은 굉장히 안전하게 코딩하는 것이다.
참조 문헌
https://learn.microsoft.com/ko-kr/cpp/cpp/const-cpp?view=msvc-170
'프로그래밍 언어 > C & C++ 정리' 카테고리의 다른 글
구조체와 클래스의 차이 (1) | 2024.11.02 |
---|---|
new와 malloc의 차이 (1) | 2024.11.01 |
Java와 C++ 로 비교하는 - 초기화 리스트와 기본 생성자 (1) | 2024.10.31 |
Java와 C++/C 차이 개체 배열, 선언문 관례 (1) | 2024.10.28 |
C++ 에서 가상 함수가 필요한 이유는 무엇인가? (0) | 2024.10.24 |