관리자 글쓰기
C++ 생성자와 정적 멤버
2022. 5. 12. 14:15 - pingu-s

생성자의 기본

 

(1) 생성자

 

이전에서는 클래스로부터 객체를 생성하고, 이용하는 방법을 살펴보았다. 객체를 생성할 때에는 여러 가지 초기화 처리가 필요하다.

클래스를 사용한 프로그래밍에서는 이 초기화 처리를 생성자(constructor)라고 부르는 특수한 멤버 함수의 처리로서 기술한다. 생성자는 클래스로부터 객체가 생성될 때에 자동적으로 호출되는 특수한 멤버 함수로 되어 있다. 생성자의 정의를 살펴보도록 한다.

 

[구문 : 생성자의 정의]

 

 

생성자는 객체가 생성될 때 자동적으로 호출되는 특수한 멤버 함수인데 반드시 클래스 명을 함수명으로 사용한다. 또한 생성자는 반환 값을 가지지 못한다. 생성자는 반드시 public으로 선언되어야 하며, 1개의 클래스 내에 여러 개의 생성자를 중복 정의할 수도 있다.

 

생성자를 사용한 예시는 다음과 같다.

 

//생성자에는 반환값이 없다. 클래스명을 함수명으로 한다.
House::House()
{
	address = "";
	space = 0;
	telephone = "";
	cout << "집을 생성하였다.\n";
}

 

House 클래스에서 객체가 생성되면 정의해 둔 생성자가 자동적으로 호출되어 처리가 수행되도록 되어 있다. 이 House 클래스의 생성자에서는 주소와 전화번호는 " ", 평수는 0으로 설정되어 있다.

그러면 실제로 생성자의 기능을 살펴보기로 한다.

 

예제 13-1) 클래스에서 생성자의 정의

12장에서 사용한 집(House) 클래스에서 생성자를 정의해 보도록 한다.

#include <iostream>
using namespace std;

//House 클래스의 선언
class House{
private:
	const char* address;
	int space;
	const char* telephone;
public:
	House(); //생성자는 멤버 함수이므로 클래스 내부에 선언한다.
	void show();
};

House::House() //House 클래스의 멤버 함수인 생성자를 정의한다.
{
	address = "";
	space = 0;
	telephone = "";
	cout << "하나의 집을 생성했습니다.\n";
}

void House::show()
{
	cout << "집의 주소는 " << address << "입니다.\n";
	cout << "집의 평수는 " << space << "평입니다.\n";
	cout << "집의 전화번호는 " << telephone << "입니다.\n";
}

int main()
{
	House my_house; //...③

	my_house.show();

	return 0;
}

③ 객체를 생성하면 생성자가 호출된다. 여기서는 ⅰ. House 클래스에서 my_house라는 객체를 생성했다. ⅱ. 이때 정의되어 있는 생성자(House())가 자동적으로 호출되어 [하나의 집을 생성했습니다.]로 출력이 수행되는 것이다. 주소와 전화번호는 공백, 평수는 0으로 설정되어 있다.

 

생성자의 중복

 

(1) 중복

 

생성자는 멤버 함수의 하나이다. 함수에서는 인수의 형과 수가 다르면 같은 이름의 함수를 여러 개 정의할 수 있다. 이 구조를 중복(overloading)이라고 한다.

생성자도 인수의 형과 수가 다르면 똑같이 중복할 수 있다. 즉, 여러 개의 생성자를 정의할 수 있다.

다음의 2개의 생성자를 살펴보도록 한다.

 

//House 클래스의 멤버 함수의 정의
House::House() //인수가 없는 클래스 생성자이다.
{
	address = "";
	space = 0;
	telephone = "";
	cout << "하나의 집을 생성했습니다.\n";
}

House::House(const char* a, int s, const char* t) //인수를 3개 가지고 있는 생성자이다.
{
	address = a;
	space = s;
	telephone = t;
	cout << "주소는 " << address << ", 평수는 " << space << "로, 전화번호는 "
		<< telephone << "인 집을 생성했습니다.\n";
}

 

에제 13-2) 클래스에서 생성자 정의

생성자 중복을 이용하여 House 클래스의 2개의 생성자가 사용되는 코드를 생성해 보도록 한다. 하나는 인수가 없는 생성자를, 다른 하나는 인수가 3개인 생성자를 생성한다.

#include <iostream>
using namespace std;

//House 클래스의 선언
class House{
private:
	const char* address;
	int space;
	const char* telephone;
public:
	House(); //생성자는 멤버 함수이므로 클래스 내부에 선언한다.
	House(const char* a, int s, const char* t); //생성자는 멤버 함수이므로 클래스 내부에 선언한다.
	void show();
};

//House 클래스의 멤버 함수의 정의
House::House() //인수가 없는 생성자를 정의한다.
{
	address = "";
	space = 0;
	telephone = "";
	cout << "하나의 집을 생성했습니다.\n";
}

House::House(const char* a, int s, const char* t) //인수를 3개 가지고 있는 생성자를 정의한다.
{
	address = a;
	space = s;
	telephone = t;
	cout << "주소는 " << address << ", 평수는 " << space << "이고, 전화번호는 "
		<< telephone << "인 집을 생성했습니다.\n";
}

void House::show()
{
	cout << "집의 주소는 " << address << "입니다.\n";
	cout << "집의 평수는 " << space << "평입니다.\n";
	cout << "집의 전화번호는 " << telephone << "입니다.\n";
}

int main()
{
	House my_house; //인수가 없는 생성자를 호출한다.
	House you_house("부산시 남구 대연3동", 64, "051-629-1004"); //인수를 3개 가지고 있는 생성자를 호출한다.

	return 0;
}

 

이 코드에서는 2개의 객체를 생성하고 있다. my_house의 객체에서는 지금까지와 똑같이 기술하고 있다. 인수를 지정하지 않는다.

House my_house; //인수가 없는 생성자를 호출한다.

 

한편, you_house의 객체에서는 3개의 인수를 지정하고 있다.

House you_house("부산시 남구 대연3동", 64, "051-629-1004"); //인수를 3개 가지고 있는 생성자를 호출한다.

 

이때 각각 다음의 생성자가 자동적으로 호출된다.

첫번째의 객체(my_house) → 인수가 없는 생성자
두번째의 객체(you_house) → 인수가 3개인 생성자

 

첫 번째의 객체(my_house)는 주소와 전화번호가 공백이고 평수를 0으로, 두 번째의 객체(you_house)는 주소가 "부산시 남구 대연3동", 평수가 64이고, 전화번호는 "051-629-1004"인 집을 생성하는 것이 가능했다.

즉, 생성자를 여러 개 정의해 두면 많은 인수를 전달하여 객체를 유연하게 생성할 수 있게 된다는 것이다.

또한 생성자를 호출할 경우에는 다음과 같이 표기할 수도 있다.

 

House my_house = House(); //인수가 없는 생성자를 호출한다.
House you_house = House("부산시 남구 대연3동", 64, "051-629-1004"); //인수 3개를 가지고 있는 생성자를 호출한다.

이 방법은 좀 길게 기술되어 있다. 예제 13-2과 같이 짧은 표기를 사용하는 방법이 일반적이다.

 

(2) 생성자를 생략하면?

 

그러면 생성자를 한 개도 정의하지 않은 경우는 어떠한 처리가 수행될 것인가? 제12장을 생각해 보도록 한다. 제12장에서는 생성자를 정의하지 않은 House 클래스를 설계하고 있다. 사실은 생성자가 정의되지 않은 경우는 인수를 취하지 않은 생성자가 준비된다. 이 생성자는 아무것도 처리하지 않는다. 이 생성자를 디폴트 생성자(default constructor)라고 한다. 즉, 생성자를 생략한 경우에는 컴파일러가 준비한 빈 디폴트 생성자가 호출된다.

단, 생성자를 무엇인가 1개라도 자기 자신이 정의한 경우는 빈 디폴트 생성자는 준비되지 않기 때문에 주의해야 한다.

 

 

출처: 박흥복서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당

'개발 > C++' 카테고리의 다른 글

C++ 생성자와 정적 멤버3  (0) 2022.05.16
C++ 생성자와 정적 멤버2  (0) 2022.05.12
C++ 클래스와 객체3  (0) 2022.05.12
C++ 클래스와 객체2  (0) 2022.05.11
C++ 클래스와 객체  (0) 2022.05.07