반응형
std::optional이 필요한가요?
C++에서는 전통적으로 "값이 없음을 나타내는" 방법이 마땅치 않았어요.
- 포인터일 경우는 nullptr로 표현할 수 있었지만,
- 값 타입(int, double, struct 등)에서는 특별한 값을 정하거나 별도 플래그를 둬야 했죠.
이런 문제를 해결하기 위해 optional이 등장했어요.
std::optional 이란?
std::optional<T>는 T 타입의 값을 가질 수도 있고, 안 가질 수도 있는 컨테이너입니다.
#include <optional>
std::optional<int> maybeGetValue(bool condition) {
if (condition)
return 42;
else
return std::nullopt; // 아무 값도 없음
}
주요 특징 정리
기능설명
std::optional<T> | T 타입의 optional 객체 생성 |
std::nullopt | 값이 없음을 표현하는 상수 |
.has_value() or if (opt) | 값이 있는지 확인 |
.value() | 값을 가져옴 (값이 없으면 예외 발생) |
.value_or(default) | 값이 있으면 그 값, 없으면 기본값 반환 |
*opt or opt.value() | 값에 접근 (값이 있어야 안전함) |
사용 예제
#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> findNameById(int id) {
if (id == 1)
return "Alice";
else
return std::nullopt;
}
int main() {
auto name = findNameById(2);
if (name.has_value()) {
std::cout << "이름: " << *name << "\n";
} else {
std::cout << "이름을 찾을 수 없습니다.\n";
}
return 0;
}
언제 쓰면 좋을까?
- 함수에서 값을 반환할 수도, 안 할 수도 있는 경우 (null 대신)
- 포인터를 쓰지 않고도 값 없음(null) 상태 표현 가능
- std::optional<T>는 T가 복사/이동 가능한 타입일 때 사용 가능
C++에서 Optional은 어떤 점이 좋을까?
- 명시적이고 타입 안정성 있음 (null pointer 같은 오류 줄임)
- 함수 인터페이스가 더 직관적이고 안전해짐
- null 체크나 특별한 에러코드를 리턴하는 방식보다 표현력이 풍부함
'Develop > C&CPP' 카테고리의 다른 글
[cpp] thread (0) | 2025.04.20 |
---|---|
[cpp] atomic (0) | 2025.04.20 |
[cpp] mutex, lock (0) | 2025.04.20 |
[cpp] cpp17에서 달라진 점 (0) | 2025.04.20 |
[cpp] cpp14에서 추가된 것 (0) | 2025.04.20 |