클래스 생성자 (Constructor) / 소멸자 (Destructor)

클래스 생성자란 무엇인가?

 

- 클래스의 생성자도 클래스가 가진 멤버 함수의 하나이다.

 

- 생성자의 이름은 클래스의 이름과 같다.

 

- 생성자는 멤버 변수들의 초기화를 하며 반환값이 없다.

 

클래스의 인스턴스를 생성할 때 생성자를 호출하는데 만일 생성자가 정의되어 있지 않으면 컴파일러가 매개변수가 없고 내용이 없는 생성자를 만들어 호출한다. 매개변수도 없고 반환값도 없고 내용도 없지만 생성자는 실행한다. 직접 구현하지 않았어도 클래스의 인스턴스를 생성해봤다면 이미 생성자를 호출해 본 것이다.

 

public 영역에 선언

생성자(constructor)를 만들었다면 소멸자(destructor)도 만들어야 한다. 자바 같은 경우 메모리 관리를 JVM(자바가상머신)이 하기 때문에 이것을 신경 쓸 필요가 없는데 C++의 경우 메모리를 직접 할당하기 때문에 메모리의 해제도 프로그래머가 직접 해줘야 한다. C++ 언어는 역시 메모리가 어렵다.

 

소멸자는 생성자와 같은 이름에 ~ (틸드)를 앞에 붙인다. 아래와 같이 구현한다.

 

 

생성자는 오버로드할 수 있다. 매개변수를 달리하여 여러개의 생성자를 만드는 것을 생성자 오버로드라고 한다. 클래스를 초기화할 때 다양한 옵션을 줄 수 있는 방법이다. 

 

 

*소스코드

#include <iostream>
#include <string>

using namespace std;

class MyClass
{
public:
	MyClass(double b, string s);
	MyClass();
	~MyClass();
	void showInfo();
	void setA(int a);
	int getA();

private:
	int a;
	double b;
	string s;
};

// 생성자 Constructor 초기화한다
MyClass::MyClass(double b, string s)
{
	cout << "constructor initializing...\n\n";
	this->b = b;
	this->s = s;
}

// 매개변수 없는 생성자. 자체적으로 초기화한다.
MyClass::MyClass()
{
	cout << "constructor initializing...\n\n";
	this->b = 19.99;
	this->s = "KEN";
}

// 소멸자 Destructor 딱히 하는 일은 없다
MyClass::~MyClass()
{
	cout << "desctructor called\n";
}

void MyClass::showInfo()
{
	cout << "int    a : " << a << endl;
	cout << "double b : " << b << endl;
	cout << "string s : " << s << endl;
}

void MyClass::setA(int a)
{
	this->a = a;
}

int MyClass::getA()
{
	return a;
}

int main()
{
	cout << "Welcome!\n";
	cout << "--------\n";

	MyClass james(77.9, "sir JAMES");

	james.setA(88);
	james.showInfo();

	cout << endl;
	return 0;
}

 

Console Output

* 이번 포스팅까지 생성자와 소멸자까지 해서 클래스에 대하여 기초사항을 알아봤다. 아직 시작도 안한 느낌인데 C++언어 자체가 방대하기 때문에 어쩔 수 없는 부분이 있다. 그렇다고 너무 주눅이 들어있으면 C++을 제대로 공부할 수가 없다. 프로그래밍 언어 공부는 교재를 읽고 튜토리얼을 정해진 순서대로 쭉 따라가면서 한번에 다 끝내는게 어렵다.

 

 

객체지향의 C++언어를 예술에 빗대자면...

 

아무것도 없는 캔버스에 붓을 자유자재로 놀리다 보니 어느새 완성되어 있는 밥 아저씨의 그림이 떠오른다.

 

마치 개발의 달인들이 "어때요? 객체지향 프로그래밍 매우 쉽죵?" 라고 말하는 것 같다.

 

이미 개념을 간파하고 제대로 훈련이 된 사람들에겐 쉬운일이다.

 

참 쉽죵? 으로 유명했던 화가 밥 아저씨

프로그래밍이 악기 연주와 닮은 점이 있다는 것은 드롭박스의 창업자가 한 말이다. 머리로만 이해해서 되는게 아니라 수련을 통해서 스스로의 레벨을 높여야 하는 일이다.

 

어려운 C++이 한가지 좋은 점이 있다면 그런 도전의식을 불러일으킨다는 것이다. 아무래도 다른 언어들보다 어려운 C++을 마스터하면 성취감이 더 크다.

 

필자는 일반적인 프로그래밍 챕터에 따라서 튜토리얼을 만들고 있다. 대부분의 튜토리얼, 교재가 첫파트에 언어의 특성부터 시작해서 변수, 자료형, 제어문... 뭐 이런 식으로 순서가 진행된다.

 

클래스 기초 파트는 복합자료형이라 볼 수 있다. 그러니까 기본자료형 배우고 배열 정도 학습한  혹은 아니면 기본자료형 다음에 클래스 기초를 먼저 학습해도 된다.

 

C++ 클래스 기초까지 튜토리얼을 진행했다면 이제 시작점에 놓인 것인데 갈길은 멀지만 보람이 있는 일이다. 고수들은 언제나 C++에 대한 강조를 한다. 아마 고수의 경지에 오르기 위해 C++을 뛰어넘어야 하는 것 같다.

 

고수들의 이야기가 저 밥 아저씨 처럼 들릴 때가 C++에 대한 말을 할 때다.

 

흠... 이 튜토리얼에 대한 포스팅은 언제까지 계속될 것 인가? 갈길이 멀어 보인다.

공유하기

facebook twitter kakaoTalk kakaostory naver band