Python 타입 힌트: Optional, Union, T | None 차이 정리

2026. 5. 20. 10:36·Language/Python

Python 타입 힌트를 작성하다 보면 값이 특정 타입이거나 None일 수 있는 경우가 있습니다.

예를 들어 함수의 인자로 문자열을 받을 수도 있고, 값이 전달되지 않으면 None을 기본값으로 사용할 수도 있습니다. 이런 경우 기존에는 Optional[T] 또는 Union[T, None]을 사용했습니다.

하지만 Python 3.10 이상부터는 T | None 문법을 사용할 수 있습니다. 더 간결하고 직관적이기 때문에 최근 코드에서는 이 방식을 많이 사용합니다.

기존 방식: Optional[T]

Python 3.10 이전에는 typing.Optional을 사용해 None이 가능한 타입을 표현했습니다.

from typing import Optional


def greet(name: Optional[str] = None) -> str:
    return f"Hello, {name}" if name else "Hello, Guest"

여기서 Optional[str]은 str 또는 None이 올 수 있다는 의미입니다.

즉, 다음과 같은 의미와 같습니다.

str 또는 None

Union[T, None]과의 관계

Optional[str]은 사실상 Union[str, None]과 동일합니다.

from typing import Union


def greet(name: Union[str, None] = None) -> str:
    return f"Hello, {name}" if name else "Hello, Guest"

즉, 아래 두 표현은 같은 의미입니다.

Optional[str]
Union[str, None]

다만 Optional[T]이 더 짧고 의도가 명확하기 때문에 Python 3.10 이전 코드에서는 Optional[T]을 더 자주 사용했습니다.

Python 3.10 이상: T | None

Python 3.10부터는 | 연산자를 사용해 Union 타입을 표현할 수 있습니다.

따라서 str 또는 None을 받을 수 있는 타입은 다음처럼 작성할 수 있습니다.

def greet_new(name: str | None = None) -> str:
    return f"Hello, {name}" if name else "Hello, Guest"

이 방식은 별도의 typing.Optional import가 필요하지 않습니다.

또한 str | None이라는 표현 자체가 “문자열 또는 None”이라는 의미를 바로 보여주기 때문에 더 직관적으로 읽을 수 있습니다.

핵심 비교

표현 Python 버전 의미 특징

Optional[T] Python 3.10 미만에서 주로 사용 T 또는 None typing.Optional import 필요
Union[T, None] Python 3.10 미만에서 사용 T 또는 None typing.Union import 필요
T \| None Python 3.10 이상 T 또는 None import 없이 간결하게 작성 가능

정리

Python 3.10 이상을 기준으로 작성하는 코드라면 Optional[T]보다 T | None을 사용하는 것이 더 간결하고 읽기 좋습니다.

# 이전 방식
from typing import Optional


def greet(name: Optional[str] = None) -> str:
    return f"Hello, {name}" if name else "Hello, Guest"


# Python 3.10 이상 권장 방식
def greet_new(name: str | None = None) -> str:
    return f"Hello, {name}" if name else "Hello, Guest"

결론적으로 Optional[str], Union[str, None], str | None은 모두 “문자열 또는 None”을 의미합니다.

다만 Python 3.10 이상에서는 str | None이 더 현대적이고 직관적인 표현입니다.

'Language > Python' 카테고리의 다른 글

Ruff E712와 SQLAlchemy Boolean 조건식 처리하기  (0) 2026.05.20
FastAPI Depends()에서 Ruff B008 경고가 발생할 때 해결 방법  (0) 2026.05.20
'Language/Python' 카테고리의 다른 글
  • Ruff E712와 SQLAlchemy Boolean 조건식 처리하기
  • FastAPI Depends()에서 Ruff B008 경고가 발생할 때 해결 방법
hwara_
hwara_
배움의 기쁨
  • hwara_
    기록 저장소
    hwara_
  • 전체
    오늘
    어제
    • 분류 전체보기 (24)
      • 일상 (1)
        • 회고 (1)
      • 프로젝트 (0)
      • OS (2)
        • Mac (0)
        • Linux (2)
      • 클라우드 (1)
        • AWS (0)
        • CloudFlare (1)
      • Devops (10)
        • Docker (1)
        • Kubernetes (7)
        • Terraform (0)
        • GitHub Actions (2)
      • 알고리즘 (0)
      • Git (2)
      • Database (1)
      • Language (3)
        • Python (3)
      • 환경구성 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hwara_
Python 타입 힌트: Optional, Union, T | None 차이 정리
상단으로

티스토리툴바