C++의 std::optional 타입은 C++17에서 도입된 기능으로, 값이 있을 수도 있고 없을 수도 있는 상황을 표현하는 데 사용됩니다. 이는 변수에 값이 없는 경우를 안전하게 처리할 수 있도록 해줍니다. std::optional은 주로 함수에서 **"값이 없을 수도 있다"**는 의미를 전달할 때 유용하며, 포인터를 사용하는 대안이 될 수 있습니다.
std::optional의 기본 개념
std::optional은 값을 포함할 수도 있고 포함하지 않을 수도 있는 컨테이너입니다. 값이 포함된 경우에는 유효한 값을 갖고, 그렇지 않은 경우에는 비어있는(empty) 상태가 됩니다.
std::optional 선언 및 사용 방법
std::optional을 사용하려면 <optional> 헤더를 포함해야 합니다.
1. 기본 사용법
cpp
코드 복사
#include <iostream>#include <optional>#include <string>using namespace std;
optional<int> findEvenNumber(int number) {
if (number % 2 == 0) {
return number; // 짝수일 경우 값을 반환
} else {
return nullopt; // 짝수가 아니면 비어 있는 상태 반환
}
}
int main() {
auto result = findEvenNumber(4);
if (result.has_value()) { // 값이 존재하는지 확인
cout << "Even number found: " << result.value() << endl;
} else {
cout << "No even number found." << endl;
}
return 0;
}
설명
- findEvenNumber 함수는 입력된 숫자가 짝수일 경우 그 숫자를 std::optional<int>로 반환하고, 그렇지 않으면 std::nullopt을 반환하여 비어 있는 상태를 나타냅니다.
- main 함수에서 result.has_value()를 통해 값이 있는지 확인하고, value()로 값을 가져올 수 있습니다. 값이 없는 상태에서 value()를 호출하면 예외가 발생합니다.
실행 결과
typescript
코드 복사
Even number found: 4
std::optional의 주요 멤버 함수
- has_value(): 값이 있는지 여부를 bool로 반환합니다.
- value(): 값을 반환합니다. 값이 없는 경우 예외(std::bad_optional_access)가 발생합니다.
- value_or(T default_value): 값이 있는 경우 그 값을 반환하고, 없는 경우 default_value를 반환합니다.
- reset(): 현재 값을 삭제하여 std::optional을 비웁니다.
예제: 기본값 반환
cpp
코드 복사
#include <iostream>#include <optional>using namespace std;
int main() {
optional<int> opt;
// opt가 비어 있으므로, 기본값을 반환합니다.
int value = opt.value_or(10);
cout << "Value: " << value << endl; // 출력: Value: 10
// opt에 값을 할당합니다.
opt = 20;
value = opt.value_or(10);
cout << "Value: " << value << endl; // 출력: Value: 20
return 0;
}
사용 사례
- 함수의 반환값으로 값이 없을 수도 있는 경우: 함수가 유효한 값을 반환할 수도 있고, 값이 없음을 나타내야 하는 경우에 사용합니다. 예를 들어, 데이터베이스 조회 결과가 없을 때 std::optional을 사용하여 처리할 수 있습니다.
- 유효하지 않은 상태를 포인터 대신 표현: 포인터를 nullptr로 설정해 "값이 없음"을 나타내는 대신, std::optional을 사용할 수 있습니다.
장점
- 명시적으로 값이 없음을 나타냄: std::optional은 값이 없을 수 있다는 의도를 명확하게 전달합니다.
- 안전한 값 접근: 값이 존재하는 경우에만 접근할 수 있어, 널 포인터 참조와 같은 위험을 줄여줍니다.
주의점
std::optional은 값을 저장할 때 약간의 오버헤드가 발생할 수 있으며, 모든 경우에 적합한 것은 아닙니다. 특히, 값이 항상 존재해야 하는 상황에서는 굳이 사용할 필요가 없습니다.
std::optional을 통해 C++에서는 값이 없을 수 있는 상황을 보다 안전하게 처리할 수 있습니다. 이러한 기능은 선택적(optional) 데이터를 다루는 코드의 가독성과 안정성을 높이는 데 기여합니다.
'C++ STL, 알고리즘' 카테고리의 다른 글
c++ 구조적 바인딩 (0) | 2024.10.07 |
---|---|
++i vs i++ 누가 일반적인가. (0) | 2024.10.07 |
가상 베이스 클래스 (다이아몬드 상속 해결) (0) | 2024.10.07 |
파생 클래스의 복제 생성자와 대입 연산자 (0) | 2024.10.07 |
Virtual (0) | 2024.10.07 |