본문 바로가기
C++ STL, 알고리즘

Optional Type

by wanna_dev 2024. 10. 7.

C++의 std::optional 타입은 C++17에서 도입된 기능으로, 값이 있을 수도 있고 없을 수도 있는 상황을 표현하는 데 사용됩니다. 이는 변수에 값이 없는 경우를 안전하게 처리할 수 있도록 해줍니다. std::optional은 주로 함수에서 **"값이 없을 수도 있다"**는 의미를 전달할 때 유용하며, 포인터를 사용하는 대안이 될 수 있습니다.

std::optional의 기본 개념

std::optional은 값을 포함할 수도 있고 포함하지 않을 수도 있는 컨테이너입니다. 값이 포함된 경우에는 유효한 값을 갖고, 그렇지 않은 경우에는 비어있는(empty) 상태가 됩니다.

std::optional 선언 및 사용 방법

std::optional을 사용하려면 <optional> 헤더를 포함해야 합니다.

1. 기본 사용법

cpp
코드 복사
#include <iostream>#include <optional>#include <string>using namespace std;

optional<int> findEvenNumber(int number) {
    if (number % 2 == 0) {
        return number; // 짝수일 경우 값을 반환
    } else {
        return nullopt; // 짝수가 아니면 비어 있는 상태 반환
    }
}

int main() {
    auto result = findEvenNumber(4);

    if (result.has_value()) { // 값이 존재하는지 확인
        cout << "Even number found: " << result.value() << endl;
    } else {
        cout << "No even number found." << endl;
    }

    return 0;
}

설명

  • findEvenNumber 함수는 입력된 숫자가 짝수일 경우 그 숫자를 std::optional<int>로 반환하고, 그렇지 않으면 std::nullopt을 반환하여 비어 있는 상태를 나타냅니다.
  • main 함수에서 result.has_value()를 통해 값이 있는지 확인하고, value()로 값을 가져올 수 있습니다. 값이 없는 상태에서 value()를 호출하면 예외가 발생합니다.

실행 결과

typescript
코드 복사
Even number found: 4

std::optional의 주요 멤버 함수

  • has_value(): 값이 있는지 여부를 bool로 반환합니다.
  • value(): 값을 반환합니다. 값이 없는 경우 예외(std::bad_optional_access)가 발생합니다.
  • value_or(T default_value): 값이 있는 경우 그 값을 반환하고, 없는 경우 default_value를 반환합니다.
  • reset(): 현재 값을 삭제하여 std::optional을 비웁니다.

예제: 기본값 반환

cpp
코드 복사
#include <iostream>#include <optional>using namespace std;

int main() {
    optional<int> opt;

    // opt가 비어 있으므로, 기본값을 반환합니다.
    int value = opt.value_or(10);
    cout << "Value: " << value << endl;  // 출력: Value: 10

    // opt에 값을 할당합니다.
    opt = 20;
    value = opt.value_or(10);
    cout << "Value: " << value << endl;  // 출력: Value: 20

    return 0;
}

사용 사례

  1. 함수의 반환값으로 값이 없을 수도 있는 경우: 함수가 유효한 값을 반환할 수도 있고, 값이 없음을 나타내야 하는 경우에 사용합니다. 예를 들어, 데이터베이스 조회 결과가 없을 때 std::optional을 사용하여 처리할 수 있습니다.
  2. 유효하지 않은 상태를 포인터 대신 표현: 포인터를 nullptr로 설정해 "값이 없음"을 나타내는 대신, std::optional을 사용할 수 있습니다.

장점

  • 명시적으로 값이 없음을 나타냄: std::optional은 값이 없을 수 있다는 의도를 명확하게 전달합니다.
  • 안전한 값 접근: 값이 존재하는 경우에만 접근할 수 있어, 널 포인터 참조와 같은 위험을 줄여줍니다.

주의점

std::optional은 값을 저장할 때 약간의 오버헤드가 발생할 수 있으며, 모든 경우에 적합한 것은 아닙니다. 특히, 값이 항상 존재해야 하는 상황에서는 굳이 사용할 필요가 없습니다.

std::optional을 통해 C++에서는 값이 없을 수 있는 상황을 보다 안전하게 처리할 수 있습니다. 이러한 기능은 선택적(optional) 데이터를 다루는 코드의 가독성과 안정성을 높이는 데 기여합니다.