배너
닫기
배너

C++에서 생성자와 소멸자 다루기

  • 등록 2015.09.16 10:03:35
URL복사
[무료 웨비나] 진동 신호를 이용한 산업용 모터 및 회전체 설비 AI 예지진단 솔루션 (6/5)

1. 생성자(constructor)와 소멸자(~constructor)의 개념

 C, C++은 하드웨어 제어 등 가장 많이 쓰는 언어 중 하나이다. 이번에는 C++에서 생성자와 소멸자에 대해 파악해 본다. 생성자와 소멸자는 간단히 줄여서 객체를 생성하고 소멸시키는 것이다. 객체를 생성하기 위해서는 메모리를 할당해야 하며, 소멸시키기 위해서는 메모리를 반환해야 한다. 생성자와 소멸자를 비교해서 설명하면 다음과 같다.

 

 


2. 생성자와 소멸자 형식

가. 생성자
class 이름 :: class 이름() // class 이름과 함수 이름이 동일
{
 생성자 몸체
}

나. 소멸자
class명 :: ~class 이름() // class 이름과 함수 이름이 동일
{
 소멸자 몸체
}

 

3. 생성자 예제

생성자 예제를 살펴본다. 프로그램에서 Seoul::Seoul()가 생성자이다.

(예제 1)
#include <iostream>
using namespace std;

 

class Seoul
{
public:
 Seoul(); // class명과 동일한 디폴트(기본) 생성자. 공개 멤버함수
 void dataShow(); // 공개 멤버함수

 

private:
 unsigned int Temp;  // 비공개 멤버변수
 unsigned int Population; // 비공개 멤버변수
};

 

Seoul::Seoul() // 생성자 정의
{
 Temp = 30;          // 멤버변수 초기화
 Population = 1500;   // 멤버변수 초기화
}

 

void Seoul::dataShow()
{
 cout << "서울의 온도는 " << Temp << "도 입니다." <<endl;
 cout << "서울의 인구는 " << Population << "만 입니다."<< endl;
}

 

int main()
{
 Seoul happy; // 생성자 Seoul()이 실행됨.
 happy.dataShow();
 return 0;
}

 

 

 
<그림1>  (예제 1)의 실행 결과


4. 소멸자 예제

소멸자 예제를 살펴본다. 프로그램에서 Seoul::~Seoul()가 소멸자이다.

(예제 2)
#include <iostream>
using namespace std;

 

class Seoul
{
public:      // 공개 선언
 Seoul(); // class명과 동일한 디폴트(기본) 생성자. 공개 멤버함수
 ~Seoul(); // 공개 멈버함수. 소멸자
 void dataShow(); // 공개 멤버함수

 

private:                // 비공개 선언
 unsigned int Temp;  // 비공개 멤버변수
 unsigned int Population; // 비공개 멤버변수
};

 

Seoul::Seoul() // 생성자 정의
{
 cout << "생성자 호출" << endl;
 Temp = 30;          // 멤버변수 초기화
 Population = 1500;  // 멤버변수 초기화
}

 

Seoul::~Seoul() // 소멸자 정의
{
 cout << "소멸자 호출" << endl;
}

 

void Seoul::dataShow()
{
 cout << "서울의 온도는 " << Temp << "도 입니다." <<endl;
 cout << "서울의 인구는 " << Population << "만 입니다."<< endl;
}

 

int main()
{
 Seoul happy; // 객체 생성. 생성자 Seoul()이 실행됨.
 happy.dataShow();
 return 0;
}

 

 

 
<그림2> (예제 2)의 실행 결과


5. 생성자의 종류

가. 디폴트 생성자

프로그래머가 생성자를 만들지 않으면 컴파일러가 자동적으로 만들어 주는 생성자이다. 따라서 초기화를 할 필요가 없는 일반적인 상황에서는 프로그래머가 생성자를 고려할 필요가 없다. 그런데 디폴트 생성자를 이용하여 객체를 만들 필요가 있을 때에는 다음과 같이 하면 된다.
디폴트 생성자가 Seoul()이라면
(예제 3) Seoul seo;
(예제 4) Seoul seo = Seoul();

나. 매개변수를 가진 생성자

생성자의 () 안에 매개변수를 가지는 형태이다. 이 때 매개변수 데이터 형의 종류와 개수를 다르게 하여(함수 오버로딩) 객체 운용을 다양하게 할 수 있다.

(예제 5)
#include <iostream>
using namespace std;

 

class Jeju
{
 int x;
 int y;

 

public:
 
 Jeju()
 {
  x=0;
  y=0;
 }
 
 Jeju(int a, int b)
 {
  x=a;
  y=b;
 }

 

 Jeju(double a, double b)
 {
  x=a;
  y=b;
 }

 

 void show()
 {
  cout << x << endl;
  cout << y << endl;
 }

 

};


int main()
{
 Jeju happy(3.7, 3.7);
 happy.show();
 return 0;
}


 

 

<그림3> (예제 5)의 실행 결과


위의 (예제 5)에서 Jeju happy(3.7, 3.7)와 같이 매개변수 x, y에 각각 3.7을 주었으나 데이터 형이 int 이므로 결과값이 각각 3으로 나왔다.

 

6. 분석과 고찰

객체를 생성할 때 구체적인 초기화가 필요하다면 프로그래머는 생성자를 직접 만들 어야 한다. 또한 클래스 생성자를 인자로 받는 형태로 프로그래밍 했을 때 프로그래머가 이 클래스의 객체를 생성하면서 전달인자를 넘기지 않으면 컴파일러는 “일치하는 생성자가 없다”는 메시지를 보낸다. 이 때는 빈 공백의 생성자를 만들어 넣어야 한다. 그리고 소멸자에 있어서 사용자가 정의하지 않으면 컴파일러가 자동으로 생성한다. 그런데 생성자를 클래스 내부에서 정의해 선언했다면 소멸자도 반드시 정의해야 한다.

<윤덕하 객원전문기자 _ 아이에셋>










배너









주요파트너/추천기업