생성자(Constructor)
C++ class에는 생성자가 있습니다. 생성자는 변수를 생성하는 것과 동시에 호출되는 함수입니다.
즉, 변수가 메모리를 잡는 것과 동시에 호출되는 함수입니다.
생성자의 형태는 반환형이 없고 class의 이름과 동일한 함수입니다.
class C_DATA {
private:
int *m_pData;
int m_nSize;
public:
...
};
int main()
{
C_DATA cData;
...
return 0;
}
위의 class에는 원래 "C_DATA();" 형태의 생성자가 존재해야 하지만 생성자가 없는 것을 확인할 수 있습니다.
C_DATA class에는 생성자가 없지만 class 변수 cData는 생성자를 호출하게 됩니다.
생성자가 없는데 호출한다는 것이 이상하지만 그것이 가능한 이유는 default 생성자 때문입니다.
default 생성자는 프로그래머가 생성자를 구현하지 않아도 자동으로 추가되어 호출되는 생성자를 말합니다.
이렇게 프로그래머가 직접 생성하지 않아도 자동으로 추가되는 생성자가 있는데 그중 하나가 default 생성자입니다.
이런 default 생성자의 경우 자동으로 추가되어 변수의 생성과 동시에 호출되지만 하는 일은 없습니다.
class C_DATA {
private:
int *m_pData;
int m_nSize;
public:
C_DATA();
...
};
int main()
{
C_DATA cData;
...
return 0;
}
C_DATA::C_DATA() {
}
즉 프로그램은 실행되면 위의 코드와 같이 파란색으로 표시된 default 생성자를 자동으로 추가하게 되고 변수 생성과 동시에 이 default 생성자를 호출하게 됩니다.
하지만 이런 default 생성자를 사용하기보다는 프로그래머가 직접 생성자를 구현하여 사용하게 됩니다.
default 생성자를 직접 구현하여 생성자 안에 내용을 추가하거나 오버로딩을 통해 생성자를 통해 인자를 받아서 사용할 수 있습니다.
다음은 default 생성자를 프로그래머가 직접 구현한 다음 생성자 안에 내용을 추가한 방식입니다.
class C_DATA {
private:
int *m_pData;
int m_nSize;
public:
C_DATA();
...
};
int main()
{
C_DATA cData;
...
return 0;
}
C_DATA::C_DATA() :
m_pData(nullptr),
m_nSize(0) {
}
다음은 default 생성자를 오버로딩하여 생성자에 인자를 받을 수 있도록 한 방식입니다.
class C_DATA {
private:
int *m_pData;
int m_nSize;
public:
C_DATA(int nData);
...
};
int main()
{
C_DATA cData(0);
...
return 0;
}
C_DATA::C_DATA(int nData) :
m_pData(nullptr),
m_nSize(nData) {
}
위의 코드와 같이 default 생성자를 오버로딩하여 생성자를 추가한 경우 main에서 class 변수를 생성하는 것과 같이 반드시 ( ) 안에 생성자의 인자를 넣어 주어여 합니다.
default 생성자과 같이 "C_DATA cData; " 방식은 사용이 불가능합니다.
이유는 default 생성자의 경우 프로그래머가 따로 생성자를 구현하지 않은 경우 자동으로 추가되지만 프로그래머가 직접 생성자를 구현한 경우 자동으로 추가되지 않기 때문입니다.
하지만 프로그래머가 default 생성자를 추가로 구현한다면 가능하게 됩니다.
(생성자는 오버로딩의 형태도 여러 개 구현하는 것이 가능합니다.)
class C_DATA {
private:
int *m_pData;
int m_nSize;
public:
C_DATA();
C_DATA(int nData);
...
};
int main()
{
C_DATA cData1(0);
C_DATA cData2;
...
return 0;
}
C_DATA::C_DATA() {
}
C_DATA::C_DATA(int nData) :
m_pData(nullptr),
m_nSize(nData) {
}
생성자를 여러 개 구현하여 사용이 가능하지만 기본적으로 default 생성자만 직접 구현하여 default 생성자에서는 기본적인 초기화 작업만 한 다음 따로 init 함수를 구현하여 값을 설정하도록 하는 것이 좋습니다.
class C_DATA {
private:
int *m_pData;
int m_nSize;
public:
C_DATA();
void init(int nSize);
};
int main()
{
C_DATA cData;
cData.init(10);
return 0;
}
C_DATA::C_DATA() :
m_pData(nullptr),
m_nSize(0) {
}
void C_DATA::init(int nSize) {
m_pData = new int[nSize]{};
m_nSize = nSize;
}
위 방식으로 사용하며 따로 중간에 값을 변경하고 싶다면 set으로 시작하는 함수를 구현하여 사용하도록 합니다.
'C++' 카테고리의 다른 글
[C++]Class 소멸자(Destructor) (0) | 2018.01.25 |
---|---|
[C++]복사 생성자와 delete 키워드 (0) | 2018.01.24 |
[C++]Reference 레퍼런스 (0) | 2018.01.24 |
[C++] 메모리 누수 (memory leak)와 CRT 라이브러리 (0) | 2018.01.24 |
[C++]new delete 동적할당 (0) | 2018.01.24 |