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 |