반응형
[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일 경우 실패했다는 결과값을 반환해야 한다.
xxxxxxxxxxdouble 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) : 성공하면 결과 값을 반한하고, 아닐경우 해당값을 반환한다.
이것을 통해 실패시 적절한 처리를 할 수 있다.
xxxxxxxxxxstd::optional<double> divide(int a, int b) { if (b == 0) { return {}; //fail } return (double)a / b;}xxxxxxxxxxint main() { if (auto res = divide(1, 2)) { std::cout << res.value() << std::endl; } else { std::cout << "fail" << std::endl; } return 0;}반응형