반응형
[C++]optional
C++17
의 표준으로 optional
이 도입되었다. 이전에 자바 스프링 개발을 할 때도 본적이 있었는데 C++에서 보니 반갑다. 자바는 jdk1.8부터 optional 지원이 된것으로 알고있다. 그러면 이 optional
은 무엇일까?
함수를 작성하는 예시를 들어보자. 두 INT값을 나누어 결과를 반환하는 함수를 작성하려고 한다.
double divide(int a, int b) {
return (double)a / b;
}
만일 이 함수에 인자 b에 0이 주어진다면 exception이 발생할 것이다. 따라서 b == 0
일 경우 실패했다는 결과값을 반환해야 한다.
xxxxxxxxxx
double divide(int a, int b) {
if (b == 0) {
//fail code
}
return (double)a / b;
}
여기서 작성한 함수의 반환값은 double
이기 때문에 실패라는 결과를 알 수 있는 방법이 없다. 함수의 성공 여부를 확인하기 위해 다음과 같은 방법들을 생각해볼 수 있다.
- 인자에
double*
형을 받아 결과값을 보낸다. - 예외를 throw한다.
- 반환값을
pair<double, bool>
식으로 처리한다.
위 방법들보다 간소하게 처리할 수 있는 방법이 optional
이다. optional
은 결과값과 성공 여부를 모두 담을 수 있다. 이를통해 반환값으로 함수의 실패 여부까지 처리할 수 있다. optional
에서 사용할 수 있는 내부함수 두 가지가 있다.
- value : 결과 값을 반환한다.
- value_or(T value) : 성공하면 결과 값을 반한하고, 아닐경우 해당값을 반환한다.
이것을 통해 실패시 적절한 처리를 할 수 있다.
xxxxxxxxxx
std::optional<double> divide(int a, int b) {
if (b == 0) {
return {}; //fail
}
return (double)a / b;
}
xxxxxxxxxx
int main() {
if (auto res = divide(1, 2)) {
std::cout << res.value() << std::endl;
}
else {
std::cout << "fail" << std::endl;
}
return 0;
}
반응형