기본 패턴
cpp
std::optional<int> findScore(bool found) {
if (found) {
return 100;
}
return std::nullopt;
}설명
std::optional<T>는 "T 값이 있을 수도 있고 없을 수도 있음"을 타입 수준에서 직접 표현합니다.- 포인터를
nullptr과 함께 쓰는 방식보다 의도가 더 분명하고, 값 의미를 유지한 채 "없음" 상태를 다룰 수 있다는 장점이 있습니다. - 함수가 실패를 표현할 때 무의미한 sentinel 값
-1을 돌려주는 대신 optional을 쓰면, 호출자에게 결과 해석 규칙을 더 명확하게 전달할 수 있습니다. - 사용 전에는 값이 있는지
has_value()또는 bool 문맥으로 확인하고, 값이 있을 때만*opt또는opt.value()에 접근해야 합니다. - optional은 강력하지만, 오류 원인까지 풍부하게 전달해야 하는 상황이라면 예외나
expected류 구조가 더 맞는 경우도 있습니다.
짧은 예제
cpp
#include <iostream>
#include <optional>
std::optional<int> parseLevel(bool ok) {
if (ok) {
return 7;
}
return std::nullopt;
}
int main() {
auto level = parseLevel(true);
if (level) {
std::cout << *level << "\n";
}
}빠른 정리
| 항목 | 설명 |
|---|---|
std::optional<T> | 값이 있을 수도 없을 수도 있는 상태 표현 |
std::nullopt | 값이 비어 있음을 명시 |
if (opt) | 값 존재 여부 검사 |
*opt / opt.value() | 값 접근 |
| 장점 | sentinel 값보다 의도가 더 분명한 API 설계 가능 |
주의할 점
optional이 있다고 해서 오류 정보가 풍부해지는 것은 아닙니다. "값이 없음"만 표현하면 충분한지, 아니면 실패 원인까지 전달해야 하는지 먼저 구분하는 편이 좋습니다.