타입 힌트(Type Hints)는 파이썬에서 변수와 함수의 인수 및 반환값의 타입을 명시하는 방법이다. 이는 코드의 가독성과 유지보수성을 향상시키고, 코드 작성 시 발생할 수 있는 타입 관련 오류를 미리 예방하는 데 도움이 된다. 파이썬은 동적 타입 언어이므로 타입 힌트를 사용해도 실행 시 타입 검사나 강제는 하지 않는다. 하지만, 이를 통해 IDE나 정적 분석 도구가 더 나은 지원을 제공할 수 있다.
기본 사용법
타입 힌트는 변수, 함수의 인수, 반환값 등에 사용할 수 있다.
변수의 타입 힌트
변수의 타입 힌트는 변수명 뒤에 콜론(:)과 타입을 명시한다.
age: int = 25
name: str = "Alice"
is_student: bool = True
함수의 타입 힌트
함수의 인수와 반환값에 타입 힌트를 사용하는 방법은 다음과 같다.
def greet(name: str) -> str:
return f"Hello, {name}"
위 예제에서 name 인수는 문자열 타입을 가지며, 함수는 문자열을 반환한다는 것을 명시하고 있다.
def add(x: int, y: int) -> int:
return x + y
result: int = add(3, 5)
print(result) # 8
위 예제에서는 x, y 인수가 정수형 타입을 가지며, 함수 결과로 정수형 값을 반환한다는 것을 명시하고 있다.
컬렉션 타입 힌트
리스트, 튜플, 딕셔너리와 같은 컬렉션 타입에 대해서도 타입 힌트를 제공할 수 있다. 이는 typing 모듈을 사용하여 표현한다.
from typing import List
numbers: List[int] = [1, 2, 3, 4, 5]
from typing import Tuple
coordinates: Tuple[int, int] = (10, 20)
from typing import Dict
user_info: Dict[str, int] = {"Alice": 25, "Bob": 30}
복합 타입 힌트
복합 타입을 표현하기 위해 Union을 사용할 수 있다. 이는 변수나 함수가 여러 타입을 가질 수 있음을 명시한다.
예제: Union
from typing import Union
def process_data(data: Union[int, str]) -> None:
if isinstance(data, int):
print(f"Processing integer: {data}")
elif isinstance(data, str):
print(f"Processing string: {data}")
process_data(42)
process_data("Hello")
예제: Optional
Optional은 값이 특정 타입이거나 None일 수 있음을 나타낸다. 이는 사실상 Union[Type, None]과 동일하다.
from typing import Optional
def get_user_name(user_id: int) -> Optional[str]:
if user_id == 1:
return "Alice"
else:
return None
name = get_user_name(2)
if name:
print(name)
else:
print("User not found")
제네릭 타입
제네릭 타입을 사용하여 함수나 클래스가 다양한 타입을 처리할 수 있게 할 수 있다. 이는 TypeVar을 사용하여 정의할 수 있다.
from typing import TypeVar, List
T = TypeVar('T')
def get_first_element(elements: List[T]) -> T:
return elements[0]
first_int = get_first_element([1, 2, 3])
first_str = get_first_element(["a", "b", "c"])
print(first_int) # 1
print(first_str) # a
타입 힌트의 장점
가독성 향상: 코드의 의도를 명확히 하여 가독성을 높인다.
유지보수성 향상: 함수나 변수의 타입을 명확히 함으로써 유지보수를 쉽게 한다.
도구 지원: IDE나 정적 분석 도구의 도움을 받아 코드 작성 시 오류를 사전에 방지할 수 있다.
문서화: 코드 자체가 문서화 역할을 하여, 다른 개발자들이 코드를 이해하기 쉽게 만든다.