C++현대 C++

variant와 visit 기본

`union`보다 안전한 대안인 `std::variant`와, 현재 담긴 타입에 따라 분기하는 `std::visit`의 핵심을 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

cpp
std::variant<int, std::string> value = std::string("hello");

std::visit([](const auto& item) {
    std::cout << item << "\n";
}, value);

설명

  • std::variant는 "여러 타입 중 정확히 하나를 담는 값"을 타입 안전하게 표현하는 도구입니다. 전통적인 union보다 훨씬 안전하고 사용 의도도 더 분명합니다.
  • 예를 들어 파싱 결과가 숫자일 수도 문자열일 수도 있다면, variant<int, std::string>처럼 가능한 경우의 수를 타입 수준에서 명시할 수 있습니다.
  • std::visit은 현재 담긴 타입에 맞는 동작을 수행하게 해 줍니다. 즉 runtime 상태를 안전하게 분기하면서도, 컴파일러가 가능한 타입 집합을 알고 있도록 유지합니다.
  • 이 패턴은 "서로 다른 경우의 수를 한 값으로 표현하되, 억지 형변환은 피하고 싶다"는 문제에서 특히 강합니다. 현대 C++의 algebraic data type에 가까운 감각이라고 볼 수 있습니다.
  • 중요한 것은 문법 자체보다 모델링입니다. 어떤 경우의 수가 가능한지 미리 닫힌 집합으로 정의할 수 있다면 variant가 class hierarchy보다 더 간단하고 명확할 때도 많습니다.

빠른 정리

요소의미
std::variant<A, B>A 또는 B 중 하나를 담는 값
std::visit현재 타입에 맞는 동작 분기
장점타입 안전한 다중 경우 표현
잘 맞는 곳파서 결과, 상태 값, 닫힌 경우의 수

주의할 점

variant는 경우의 수가 닫혀 있을 때 특히 잘 맞습니다. 반대로 새로운 타입 확장이 자주 필요한 열린 구조라면 상속 계층이 더 자연스러울 수도 있습니다.

참고 링크

2 sources