ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] Explicit
    프로그래밍/C & C++ 2024. 7. 8. 20:10
    728x90
    반응형

    explicit 키워드는 C++에서 생성자 앞에 사용되어 암시적(implicit) 형 변환과 단일 인수를 가지는 생성자의 암시적 호출을 방지하는 역할을 합니다. 이는 코드의 명확성을 높이고, 의도하지 않은 형 변환으로 인한 오류를 방지하는 데 도움을 줍니다.

    암시적 형 변환과 단일 인수 생성자

    기본적으로, 단일 인수를 가지는 생성자는 암시적 형 변환을 허용합니다. 이는 생성자가 단일 인수를 받을 때, 그 인수를 통해 객체를 자동으로 생성할 수 있게 합니다. 예를 들어:

    #include <iostream>
    
    class MyClass {
    public:
        MyClass(int x) {
            std::cout << "Constructor called with value: " << x << std::endl;
        }
    };
    
    void func(MyClass obj) {
        // ...
    }
    
    int main() {
        func(42); // 암시적으로 MyClass(42) 생성자가 호출됨
        return 0;
    }

    위 코드에서 func(42);int 타입의 42를 MyClass 타입으로 암시적으로 변환하여 생성자를 호출합니다. 이는 유연성을 제공하지만, 원치 않는 형 변환이 발생할 수 있는 위험이 있습니다.

    explicit 키워드 사용

    explicit 키워드를 사용하면 이러한 암시적 형 변환을 방지할 수 있습니다. explicit 키워드는 단일 인수를 가지는 생성자 앞에 위치하며, 이 생성자가 암시적으로 호출되지 않도록 합니다.

    explicit 키워드 사용 예제

    #include <iostream>
    
    class MyClass {
    public:
        explicit MyClass(int x) {
            std::cout << "Constructor called with value: " << x << std::endl;
        }
    };
    
    void func(MyClass obj) {
        // ...
    }
    
    int main() {
        // func(42); // 이 줄은 컴파일 오류를 발생시킵니다.
        func(MyClass(42)); // 명시적으로 MyClass 객체를 생성
        return 0;
    }

    위 코드에서 explicit 키워드가 MyClass 생성자 앞에 사용되었습니다. 이로 인해 func(42);는 더 이상 유효하지 않으며, MyClass 객체를 명시적으로 생성해야 합니다.

    explicit을 사용하는가?

    1. 명확성: explicit 키워드를 사용하면 생성자가 명시적으로 호출되어야 하므로 코드가 더 명확해집니다.
    2. 안전성: 암시적 형 변환을 방지하여 의도하지 않은 변환으로 인한 버그를 줄일 수 있습니다.
    3. 유지 보수성: 명시적인 호출은 코드의 의도를 분명히 하여, 코드 유지 보수를 쉽게 만듭니다.

    주의 사항

    • explicit 키워드는 단일 인수를 가지는 생성자에만 적용됩니다. 여러 인수를 가지는 생성자는 암시적 형 변환에 대해 덜 민감하기 때문입니다.
    • explicit 키워드는 변환 생성자(conversion constructor)에도 적용될 수 있습니다.

    예제: 변환 생성자에 explicit 적용

    #include <iostream>
    
    class MyClass {
    public:
        explicit MyClass(int x) {
            std::cout << "Constructor called with value: " << x << std::endl;
        }
    
        explicit operator int() const {
            return 42; // 예시로 반환하는 값
        }
    };
    
    int main() {
        MyClass obj(10);
        // int value = obj; // 컴파일 오류: 명시적 변환 필요
        int value = static_cast<int>(obj); // 명시적 변환
    
        std::cout << "Value: " << value << std::endl;
        return 0;
    }

    위 코드에서 explicit 키워드는 변환 생성자에도 적용되어, objint로 암시적으로 변환할 수 없게 합니다. 대신 명시적 변환인 static_cast<int>(obj)가 필요합니다.

    결론

    explicit 키워드는 C++에서 암시적 형 변환을 방지하여 코드의 명확성과 안전성을 높이는 데 유용합니다. 이를 통해 코드의 의도를 명확히 하고, 의도하지 않은 변환으로 인한 오류를 줄일 수 있습니다.

    728x90
    반응형
Designed by Tistory.