"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
C++ 에서 explicit 이란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.
질문 >
C++ 에서 explicit 이란 무엇이며, 어떻게 활용할 수 있나요?
답변 >
explicit 키워드란?
C++에서 explicit 키워드는 생성자나 변환 연산자에 사용되어, 암시적 변환(implicit conversion)을 방지하는 데 사용됩니다. 이 키워드는 코드의 명확성과 의도성을 높여, 예기치 않은 동작이나 버그를 예방하는 데 유용합니다.
암시적 변환(Implicit Conversion)이란?
C++에서는 매개변수나 대입 연산에서 타입 변환이 자동으로 이루어질 수 있습니다. 특정 클래스의 생성자가 단일 매개변수를 가질 경우, 컴파일러는 이를 암시적으로 호출하여 객체를 생성할 수 있습니다.
#include <iostream>
class MyClass {
public:
MyClass(int value) {
std::cout << "Constructor called with value: " << value << std::endl;
}
};
int main() {
MyClass obj = 42; // 암시적 변환
return 0;
}
위 코드에서 MyClass obj = 42;는 컴파일러가 MyClass(int) 생성자를 암시적으로 호출하여 객체를 생성합니다.
explicit의 역할
explicit 키워드를 사용하면, 이러한 암시적 변환을 방지하고, 명시적 호출만 허용할 수 있습니다.
#include <iostream>
class MyClass {
public:
explicit MyClass(int value) {
std::cout << "Constructor called with value: " << value << std::endl;
}
};
int main() {
// MyClass obj = 42; // 컴파일 에러: 암시적 변환 불가
MyClass obj(42); // 명시적 호출만 허용
return 0;
}
explicit의 활용 사례
1. 단일 매개변수 생성자
단일 매개변수 생성자는 암시적 변환의 주된 원인이므로, 필요에 따라 explicit을 붙여 암시적 변환을 방지합니다.
class Vector {
public:
explicit Vector(int size) {
// size 길이의 벡터 초기화
}
};
Vector v1(10); // 명시적 호출: OK
// Vector v2 = 10; // 컴파일 에러: 암시적 변환 금지
2. 변환 연산자
클래스의 특정 타입으로 변환을 지원하는 연산자에 explicit을 붙이면, 암시적 변환을 방지할 수 있습니다.
#include <iostream>
class MyClass {
public:
explicit operator int() const {
return 42;
}
};
int main() {
MyClass obj;
// int value = obj; // 컴파일 에러: 암시적 변환 금지
int value = static_cast<int>(obj); // 명시적 변환: OK
std::cout << "Value: " << value << std::endl;
return 0;
}
암시적 변환과 명시적 변환 비교
특징 | 암시적 변환 | 명시적 변환 |
호출 방식 | 자동 호출 | static_cast, 명시적 생성자 호출 필요 |
가독성 | 코드에서 변환이 명확하지 않을 수 있음 | 변환의 의도가 명확하게 드러남 |
explicit 키워드 적용 여부 | 적용하지 않음 | explicit으로 제한 가능 |
예외 상황 | 의도하지 않은 변환으로 버그 유발 가능 | 개발자가 명확히 의도한 경우에만 허용 |
주의사항
- 다중 생성자에서 선택적 사용:
- 다중 생성자 중 일부는 암시적 변환이 유용할 수 있으므로, 모든 생성자에 explicit을 사용하는 것은 적합하지 않을 수 있습니다.
- 라이브러리 코드에서 중요성:
- 공개 API를 제공하는 라이브러리에서는 explicit을 적절히 사용하여 사용자가 예기치 않은 동작을 경험하지 않도록 해야 합니다.
결론
explicit 키워드는 암시적 변환을 방지하여 코드의 명확성과 안전성을 높이는 데 유용합니다. 특히 단일 매개변수 생성자나 변환 연산자를 정의할 때, 의도적으로 암시적 변환을 허용하지 않으려면 반드시 explicit을 사용해야 합니다. 이를 통해 의도하지 않은 동작을 방지하고, 코드의 유지보수성을 향상시킬 수 있습니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
'프로그래밍' 카테고리의 다른 글
👨💻 [Go] Go 에서 Buffer Pool 과 같은 Pool 구조를 구성하는 설계가 필요한가요? (1) | 2025.01.22 |
---|---|
👨💻 [C++] C++ 에서 static_cast 란 무엇이며, 어떻게 활용할 수 있나요? (1) | 2025.01.22 |
👨💻 [C++] C++ 에서 boost::asio 는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.21 |
👨💻 [C++] C++ 에서 boost 는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.21 |
👨💻 [Go] Go 에서 프로그램이 비정상 종료 될 때, 오류 분석을 위한 덤프 파일을 생성하는 방법은 어떻게 되나요? (0) | 2025.01.20 |