개발/C, C++

[C++] class 생성자에서 explicit 키워드의 의미

growing-dev 2023. 9. 5. 22:15

오늘은 class 생성자에 대해서 공부하다가 알게 된 explicit 키워드의 의미에 대해서 알아보겠습니다.

 

class 생성자에서 explicit 키워드의 의미

 

c++ explicit

 

 

 explicit 키워드

 

C++에서 `explicit` 키워드는 주로 클래스의 생성자에 사용되며, 해당 생성자가 암시적 형 변환을 허용하지 않도록 지정하는 데 사용됩니다. `explicit` 키워드를 사용하면 해당 생성자가 명시적으로 호출되어야 하며, 암시적 형 변환이 자동으로 수행되지 않습니다.

1. 형 변환 오류를 방지: 암시적 형 변환이 허용되면 예상치 못한 형 변환이 발생할 수 있으며, 이는 버그의 원인이 될 수 있습니다. `explicit` 키워드를 사용하면 이러한 형 변환이 방지됩니다.

2. 의도적인 호출 강조: `explicit` 키워드를 사용하면 해당 생성자가 명시적으로 호출되어야 한다는 의도를 코드에서 강조합니다. 이는 코드를 더 명확하게 만들고, 오류를 줄일 수 있습니다.

결국 명시적이라는 뜻에서도 알 수 있다시피 가독성과 묵시적인 형 변환을 방지하는 역할을 합니다.

 

 사용 예시

 

예를 들어, 다음과 같은 클래스를 고려해 봅시다.

class MyClass {
public:
    MyClass(int a) : m(a) {
        // 생성자 코드, a를 받아서 m을 a로 초기화
    }
    void print() {
      std::cout << m << std::endl;
    }
private:
    int m;
};

int main(int, char**) {
   MyClass obj1 = 10;
   obj1.print();
}

 

실행 결과

 

빌드에 성공하고 실행 결과 10이 출력됩니다.

일반적으로 생성자를 생성할 때 obj1(10) 과 같은 형태로 생성해야 하지만 컴파일러가 알아서 10이라는 값을 생성자로 받아서 m 값으로 설정하게 됩니다. 이런 경우가 바로 클래스 객체 생성 시 묵시적 형 변환입니다.

이런 경우 문제가 발생할 수 있습니다. 지금과 같이 단순한 상황에서는 크게 문제가 되지 않겠지만 클래스 타입과 변수가 복잡해지면 실수할 수 있습니다.

객체 생성 시 할당되는 값의 실수로 인해 문제가 발생할 소지가 있다는 점, 그리고 가독성이 좋지 않다는 점에서 우리는 explicit 키워드를 활용해야 합니다.

 

만약 아래와 같이 obj1 = 10; 인 상태로 MyClass 생성자에 explicit을 붙여주면 어떻게 될까요?

class MyClass {
public:
    explicit MyClass(int a) : m(a) {
        // 생성자 코드, a를 받아서 m을 a로 초기화
    }
    void print() {
      std::cout << m << std::endl;
    }
private:
    int m;
};

int main(int, char**) {
   MyClass obj1 = 10;
   obj1.print();
}

빌드 에러

위 사진과 같이 빌드에 실패합니다.

즉 명시적으로 생성자를 제대로 호출해 주어야 한다고 컴파일 타임에 에러를 띄어주어서 실수를 방지하는 것입니다.

이를 통해 객체 생성을 암묵적으로 형 변환하지 않고 명시적으로 제대로 설정하도록 제한하는 역할을 하는 것입니다.

 

 

 결론

 

오늘은 C++의 explicit 키워드에 대해서 알아보았습니다. C++ 이 객체지향언어이고 class와 상속, 객체를 자주 활용하다 보면 실수할 수 있는 부분에서 키워드를 통해 실수를 방지하고 가독성을 높이는 방식 중의 하나라는 것을 이해할 수 있었습니다.

반응형