-
생성자(constructor), 소멸자(destructor)플밍/C++ (overview) 2012. 1. 3. 22:532006/07/30 14:56
생성자(constructor)
1. 생성자의 필요성
class Person{
int a;
int b;
public :
void fun(){};
}
int main(){
Person p = {10, 20};
}
위같은 문장은 컴파일 에러가 발생한다.
빨간색부분에서 p를 생성과 동시에 a, b를 초기화 하고 있는데,
a,b는 private으로 생성되어 있기 때문이다.
그렇다고 a,b를 public으로 선언하는것은 정보은닉에 위배 되므로, 다음과 같은 방법을
써보자.
class Person{
int a;
int b;
public :
void fun(){};
void set(int _a, int _b){
a = _a;
b = _b;
}
}
int main(){
Person p; // 객체를 생성만 함.(멤버 변수들은 쓰레기 값으로 채워짐)
p.set(10, 20); // 멤버 변수를 초기화 함.
}
set이라는 함수를 만들어주었다. 그러나 이는, 객체 생성과 동시에 초기화 하고자 하는 목적에
어긋난다. 그렇다면? 객체 생성과 동시에 초기화 할수 있는 메커니즘이 바로 생성자이다.
(또한, 클래스 정의할때 멤버 변수를 특정한 값으로 지정할수 없다는 말도 포함하고 있다.)
class Person{
int a;
int b;
public :
void fun(){};
Person(int _a, int _b){
a = _a;
b = _b;
}
}
int main(){
Person p(10,20);
//같은 표현 : Person p = Person(10, 20);
}
2. 생성자와 객체의 생성 과정
객체가 생성되는 과정은 다음과 같다.
첫째. 메모리 할당(그리고, 메모리에 객체 이름 붙여주기)
둘째. 생성자 호출
3. 디폴트 생성자와 생성자의 특징
* 디폴트 생성자 : 인자 값도 받지 않고, 아무짓도 안함. -_-;, 다시 말해 껍데기.
<생성자의 특징>
첫째. 생성자를 하나라도 정의하지 않으면, 컴파일과정에서 디폴트 생성자가 자동 삽입된다.
둘째. 함수의 일종이므로, 오버로딩과 디폴트 매개변수 설정이 가능하다.
[예]
class Point{
int a;
public:
Point(int _a){
a = _a;
}
}
int main(){
Point p1(10);
Point p2;
}
생성자가 하나 만들어져 있기때문에, 디폴트 생성자가 삽입되지 않았다. 그래서 오류가 발생함.
[해결] : 디폴트 매개 변수 사용
class Point{
int a;
public:
Point(int _a = 0){
a = _a;
}
}
int main(){
Point p1(10);
Point p2;
}
4. 생성자와 동적 할당
생성자 내에서 동적 할당을 하는 경우,
생성자 호출이 끝난 직후 메모리의 모습은 다음과 같다.
객체(그림에서 왼쪽 네모) xx는 main함수 내에서 생성되었기때문에, 스택 영역에 할당되고,
생성자 내에서 메모리 공간을 동적 할당하고 있기때문에, 멤버 변수 name, phone이 가리키는
공간은 힙이 된다. (메모리 공간을 효율적으로 사용할수 있다.)
===========================================================
소멸자(destructor)
그런데, 생성자 내에서 메모리 동적할당을 했을때, 깜빡하고 해제를 해주지 않으면 메모리가
줄줄 샌다 -_-;
그렇다고 특별히 해제를 하는 함수를 만들어 쓰자니, 객체가 소멸되는 시점도 알아야 하고,
그때에 맞춰서 그 함수를 호출해줘야 하는 불편함이 있다.
이를 해소하기 위해, C++에서는 객체가 소멸될때 자동으로 소멸자를 호출하도록 한다.
(내가 호출 안해도 된다. 소멸자만 만들어 두면, 객체가 알아서 사라지면서 그 함수를 부르면서
죽는다.)
생성자와 마찬가지로, 소멸자를 특별히 코딩해주지 않으면, 컴파일러가 자동으로
디폴트 소멸자를 삽입해준다. (껍데기만 -_-; 즉, 아무것도 하는짓 없음.)
생성자와 달리, 매개변수를 받을수 없다.
즉, 오버로딩이 불가능하고, 디폴트매개변수선언도 불가능하다.
<객체의 소멸 과정>
첫째. 소멸자 호출
둘째. 메모리 반환(해제)
생성자는 거의 필수처럼 정의하지만,
소멸자는 선택사항이다. (특히, 생성자에서 메모리동적할당을 했을경우, 이를 해제하기위해..)
'플밍 > C++ (overview)' 카테고리의 다른 글
복사 생성자 (0) 2012.01.03 객체 배열, 객체포인터배열, this, friend (0) 2012.01.03 정보은닉(information hiding), 캡슐화 (0) 2012.01.03 구조체에서 클래스로! (0) 2012.01.03 동적 메모리 할당(malloc, new) (0) 2012.01.03