이 글에서는 C++ 클래스의 변환 생성자(Conversion Constructor)가 무엇인지 살펴보겠습니다. 먼저 생성자에 대한 기본 개념부터 짚고 넘어가겠습니다.
생성자(Constructor)란?
생성자는 클래스의 객체가 생성될 때 자동으로 호출되는 특수한 멤버 함수입니다. 생성자에는 다음과 같은 고유한 특징이 있습니다.
- 함수 이름이 클래스 이름과 반드시 동일해야 합니다.
- 반환값(return type)을 가지지 않습니다.
- 객체가 선언되는 시점에 자동으로 호출됩니다.
생성자는 매개변수를 받을 수도 있고, 받지 않을 수도 있습니다. 매개변수를 받는 생성자를 흔히 매개변수 생성자(parameterized constructor)라고 부릅니다.
변환 생성자의 정의
단 하나의 매개변수만 받는 생성자를 변환 생성자라고 합니다. 이러한 생성자가 존재하면 컴파일러는 해당 매개변수 타입의 값을 클래스 객체로 자동으로 변환(암시적 형변환)할 수 있습니다.
예를 들어, int 하나를 받는 생성자가 있다면 int 값을 그대로 클래스 객체에 대입하는 코드도 문제없이 동작합니다.
예제 코드
#include<iostream>
using namespace std;
class my_class {
private:
int my_var;
public:
// 매개변수가 하나뿐인 생성자 → 변환 생성자
my_class(int x) {
this->my_var = x; // my_var 값 설정
}
void display() {
cout << "my_var의 값: " << my_var << endl;
}
};
int main() {
my_class my_obj(10);
my_obj.display();
my_obj = 50; // 여기서 변환 생성자가 호출됨
my_obj.display();
return 0;
}실행 결과
my_var의 값: 10 my_var의 값: 50
동작 원리
my_obj = 50; 구문이 실행되면 내부적으로 다음 과정이 진행됩니다.
- 컴파일러는 int 값 50을 my_class 타입으로 변환해야 함을 감지합니다.
- int 하나를 받는 변환 생성자를 호출하여 임시 my_class 객체를 생성합니다.
- 생성된 임시 객체의 내용이 my_obj에 대입(복사)됩니다.
주의 사항: explicit 키워드
변환 생성자는 코드를 간결하게 만들어 주지만, 개발자가 의도하지 않은 암시적 변환이 발생해 버그의 원인이 될 수 있습니다. 이를 방지하려면 생성자 앞에 explicit 키워드를 붙여 암시적 변환을 차단할 수 있습니다.
explicit my_class(int x) {
this->my_var = x;
}explicit이 지정되면 my_obj = 50;과 같은 암시적 변환은 컴파일 오류가 되며, my_class obj(50);처럼 명시적으로 객체를 생성해야만 합니다. 따라서 단일 매개변수 생성자에는 가능한 한 explicit을 붙이는 것이 안전한 코딩 습관으로 권장됩니다.