파이썬 교재 · 18편 / 27편

파이썬 타입 힌트

동적 타입의 부드러운 안전망. IDE 자동완성 + 사전 버그 잡기.

중급읽는 시간 6분2026-05-13
def avg(nums: list[int]) -> float 같은 타입 힌트 코드 화면

3편에서 파이썬이 동적 타입이라 했죠. age = 30 한 줄에서 자료형이 자동으로 결정. 자유롭지만 함정도 있어요 — "이 함수의 data 인자는 리스트일까 딕셔너리일까" 가 한 달 뒤 본인 코드를 봐도 안 보입니다. 동료 코드는 더해요. 해법은 타입 힌트(type hint, 3.5+) — 강제는 안 하지만 "이 자리에는 int 가 옵니다" 라고 적는 약속입니다.

18편을 마치면 ① 기본 문법(x: int·-> str) ② 컬렉션(list[int]·dict[str, int]) ③ X | None 합집합 ④ mypy 정적 검사 ⑤ VS Code 자동완성 활용 — 5가지를 손에 익힙니다.

기본 문법 — 변수·인자·반환

# 변수
age: int = 30
name: str = "준성"
active: bool = True

# 함수 인자와 반환
def greet(name: str, count: int = 1) -> str:
    return f"안녕, {name}" * count

# 클래스 속성 (dataclass 와 연결)
class User:
    name: str
    age: int = 30

형태: 이름: 타입 또는 함수에서 이름: 타입 = 기본값. 반환은 -> 타입. 실행에는 영향 0 — 어긋난 타입을 넘겨도 파이썬은 그냥 동작합니다(검사하지 않음). 힌트일 뿐.

📌 타입 힌트는 강제가 아닌 문서

greet(name=123) 를 호출해도 파이썬은 안 막아요. 그러면 왜 적나? ① IDE 자동완성·경고가 정확해짐 ② 동료가 함수 시그니처만 보고 무엇을 넘길지 압 ③ mypy 같은 별도 도구가 사전에 버그 탐지. "실행 시간 타입 검사" 가 필요하면 pydantic 같은 라이브러리.

컬렉션 타입 — list[int]·dict[str, Any]

def avg(nums: list[int]) -> float:
    return sum(nums) / len(nums)

def header_map(rows: list[dict[str, str]]) -> dict[str, int]:
    return {r["name"]: int(r["score"]) for r in rows}

# 튜플 — 위치별 타입 정확히
def stats(nums: list[float]) -> tuple[float, float, float]:
    return min(nums), max(nums), sum(nums) / len(nums)

3.9 이전에는 from typing import List, Dict, Tuple 을 import 해 대문자로 적어야 했지만(List[int]), 3.9+ 부터 내장 소문자 그대로. 더 짧고 자연스럽습니다.

X | None·Union — 여러 타입 허용

"문자열이거나 None" 같이 여러 타입을 허용할 때 | 연산자(3.10+).

def find(name: str) -> User | None:
    for u in users:
        if u.name == name:
            return u
    return None         # 못 찾으면 None

# 옛 방식
from typing import Optional
def find(name: str) -> Optional[User]: ...
# == User | None

# 여러 타입 (3.10+)
def parse(value: int | str | float) -> float:
    return float(value)

None 도 타입이라 합집합에 그대로 적습니다. Optional[User]User | None 은 같은 의미.

mypy 정적 검사 — 사전에 버그 잡기

# 터미널에서
$ pip install mypy
$ mypy myapp.py

myapp.py:14: error: Argument 1 to "avg" has incompatible type
  "list[str]"; expected "list[int]"  [arg-type]
Found 1 error in 1 file

mypy 는 코드를 실행 없이 읽어 타입 위반을 찾아냅니다. 12편의 try/except 와는 다른 안전망 — try 가 런타임에 잡는 거라면 mypy 는 작성 시 잡는 거예요. 단위 테스트와 짝지어 실무 코드 품질을 올립니다.

⚠️ 타입 힌트는 점진적으로. 모든 함수에 다 적으려 들면 한 주 안에 지쳐요. 외부 호출되는 함수·복잡한 데이터 흐름·라이브러리 인터페이스부터. 내부 짧은 함수는 안 적어도 OK. --strict 모드는 신규 프로젝트에서나 권장.

VS Code 자동완성 + 마무리

VS Code 의 Pylance(파이썬 확장)는 타입 힌트를 읽고 정확한 자동완성을 줍니다. users: list[User] 라고 적어두면 users[0]. 까지 친 순간 User 의 속성·메서드가 다 떠요. 안 적었으면 users[0] 의 자료형을 추론 못 해 자동완성이 흐려집니다.

# 좋은 함수 시그니처 — IDE 가 모든 걸 알려줌
def filter_users(
    users: list[User],
    min_age: int = 0,
    active_only: bool = True,
) -> list[User]:
    """조건에 맞는 사용자만 반환."""
    return [u for u in users if u.age >= min_age and (not active_only or u.active)]

이 한 함수만 봐도 입력·출력·기본값이 명확. 동료가 docstring 안 읽어도 90% 사용 가능합니다.

다음 미션 — REPL/파일에서: ① def divide(a: float, b: float) -> float | None — 0 으로 나누면 None ② 14편 Student 클래스에 모든 속성 타입 힌트 추가 ③ mypy 깔고 본인 코드에 돌려보기.

다음 편 미리보기

19편 — "collections·itertools": 표준 라이브러리 고급. Counter·defaultdict·deque·chain·groupby 같은 실무 도구.

📚 27편 파이썬 교재 시리즈 — 18/27편
← 17편 "데코레이터" · 다음: 19편 "collections·itertools"

© 2026 주나이테크(주) @JUNAITECH