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

2023. 9. 5. 22:15·개발/C, C++
반응형

오늘은 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와 상속, 객체를 자주 활용하다 보면 실수할 수 있는 부분에서 키워드를 통해 실수를 방지하고 가독성을 높이는 방식 중의 하나라는 것을 이해할 수 있었습니다.

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

[Clang] C++ 빌드 시 undefined reference error 해결 방법  (0) 2023.12.02
[C++] STL 컨테이너 unordered set, unordered map 사용법, 차이점  (0) 2023.11.21
[C++] STL 컨테이너 Set과 Map 활용법과 차이점  (0) 2023.09.02
[C++] STL 컨테이너 Vector 의 용도와 특징, 사용 예제  (0) 2023.09.01
[C++] 생성자에서 virtual 가상 함수 호출하는 경우의 문제  (0) 2023.08.11
'개발/C, C++' 카테고리의 다른 글
  • [Clang] C++ 빌드 시 undefined reference error 해결 방법
  • [C++] STL 컨테이너 unordered set, unordered map 사용법, 차이점
  • [C++] STL 컨테이너 Set과 Map 활용법과 차이점
  • [C++] STL 컨테이너 Vector 의 용도와 특징, 사용 예제
growing-dev
growing-dev
S/W 개발 관련 내용들과 취미나 육아, 맛집 등 관심 있는 내용을 공유하는 블로그입니다.
    반응형
  • growing-dev
    성장하는 개발자 블로그
    growing-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 개발
        • 개발 공통
        • 개발 환경
        • Git
        • 자료구조, 알고리즘
        • C, C++
        • Python
        • DevOps
        • CMake
      • 공부
        • 영어
        • 경제
      • 취미, 육아 N
        • 육아
      • 생활정보
  • 블로그 메뉴

    • 홈
  • 링크

    • growing-dev GitHub
  • 공지사항

    • [블로그 시작] 성장하는 개발자 스토리입니다.
  • 인기 글

  • 태그

    하이볼
    VS Code
    필스너
    CMake
    git
    OPIC
    소프티어
    프로그래머스
    WSL
    Python
    Clang
    티스토리챌린지
    생산성
    오블완
    오픽
    앨리웨이
    TDD
    dfs
    키즈카페
    C++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
growing-dev
[C++] class 생성자에서 explicit 키워드의 의미
상단으로

티스토리툴바