C++에서 explicit 키워드는 생성자가 암시적(implicit) 타입 변환을 수행하지 않도록 명시적으로 지정할 때 사용됩니다. 이를 통해 개발자가 의도하지 않은 자동 형 변환으로 인한 버그를 사전에 방지할 수 있습니다.
암시적 변환의 문제점
먼저 다음과 같은 클래스가 있다고 가정해 보겠습니다.
class Foo {
public:
Foo(int n); // Foo 객체에 n바이트를 할당
Foo(const char *p); // char *p로 객체를 초기화
};이 상태에서 다음과 같은 코드를 작성하면 어떻게 될까요?
Foo mystring = 'x';
컴파일러는 문자 'x'를 int 타입으로 암시적으로 변환한 뒤, Foo(int) 생성자를 호출합니다. 하지만 이것은 작성자가 의도한 동작이 아닐 가능성이 높습니다.
explicit 키워드로 해결하기
이런 실수를 방지하고 코드의 안정성을 높이려면 생성자를 explicit로 선언하면 됩니다.
예제 코드
class Foo {
public:
explicit Foo(int n); // n바이트 할당
Foo(const char *p); // 문자열 p로 초기화
};정리
- explicit 키워드는 단일 인수를 받는 생성자의 암시적 변환을 차단합니다.
- 변환 생성자(converting constructor)로 인한 의도치 않은 객체 생성을 막아줍니다.
- 코드의 가독성과 안전성을 높여 오류 발생 가능성을 줄입니다.
C++11부터는 변환 연산자(Conversion Operator)에도 explicit을 적용할 수 있으므로, 암시적 변환이 바람직하지 않은 모든 경우에 활용하는 것이 좋은 코딩 습관입니다.