C++현대 C++

std::optional 기본

값이 있을 수도 없을 수도 있는 상태를 더 명확하게 표현하는 `std::optional` 기본 패턴을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

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이 있다고 해서 오류 정보가 풍부해지는 것은 아닙니다. "값이 없음"만 표현하면 충분한지, 아니면 실패 원인까지 전달해야 하는지 먼저 구분하는 편이 좋습니다.