오늘은 class 생성자에 대해서 공부하다가 알게 된 explicit 키워드의 의미에 대해서 알아보겠습니다.
class 생성자에서 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 |