Python 09 - Type Hints

KjjeddΒ·2026λ…„ 1μ›” 13일

Python

λͺ©λ‘ 보기
9/10
post-thumbnail

🧠 Python νƒ€μž… 힌트(Type Hints)

νƒ€μž… 힌트(Type Hints)λŠ”
파이썬 μ΄ˆλ³΄μžμ—κ²ŒλŠ”
β€œμžˆμ–΄λ„ 되고 없어도 λ˜λŠ” μž₯μ‹β€μ²˜λŸΌ 보인닀.

β€œμ–΄μ°¨ν”Ό νŒŒμ΄μ¬μ€ νƒ€μž… μ•ˆ 써도 λ˜μž–μ•„?”
β€œμ‹€ν–‰λ„ 잘 λ˜λŠ”λ° μ™œ ꡳ이?”


πŸ€” νƒ€μž… νžŒνŠΈλŠ” μ™œ μ‘΄μž¬ν• κΉŒ?

문제 상황: νŒŒμ΄μ¬μ€ μžμœ λ‘­λ‹€

def add(a, b):
    return a + b

add(3, 5)        # OK
add("3", "5")    # OK
add(3, "5")      # λŸ°νƒ€μž„ μ—λŸ¬

이 ν•¨μˆ˜μ˜ λ¬Έμ œλŠ” λ¬΄μ—‡μΌκΉŒ?

  • aκ°€ μˆ«μžμΈμ§€ λ¬Έμžμ—΄μΈμ§€ μ•Œ 수 μ—†λ‹€
  • μ‹€ν–‰ν•˜κΈ° μ „κΉŒμ§€ 였λ₯˜λ₯Ό μ•Œ 수 μ—†λ‹€
  • IDE도 도와쀄 수 μžˆλŠ” 정보가 μ—†λ‹€

❌ λ¬Έμ œλŠ” β€œν‹€λ¦° νƒ€μž…μ„ 넣을 수 μžˆλ‹€β€κ°€ μ•„λ‹ˆλΌ,
❌ 아무도 이 ν•¨μˆ˜μ˜ μ˜λ„λ₯Ό λͺ¨λ₯Έλ‹€λŠ” 것이닀


✨ ν•΄κ²°μ±…: Type Hints

def add(a: int, b: int) -> int:
    return a + b

이 ν•œ μ€„λ‘œ 바뀐 것은 μ‹€ν–‰ κ²°κ³Όκ°€ μ•„λ‹ˆλ‹€.

  • IDEκ°€ μ΄ν•΄ν•œλ‹€
  • μ‚¬λžŒμ΄ μ΄ν•΄ν•œλ‹€
  • 도ꡬ가 κ²½κ³ λ₯Ό μ€€λ‹€

βœ… νƒ€μž… νžŒνŠΈλŠ” νŒŒμ΄μ¬μ„ μ—„κ²©ν•˜κ²Œ λ§Œλ“œλŠ” κΈ°λŠ₯이 μ•„λ‹ˆλ‹€
βœ… μ˜λ„λ₯Ό λ¬Έμ„œλ‘œ λ‚¨κΈ°λŠ” κΈ°λŠ₯이닀


🎭 λΉ„μœ λ‘œ μ΄ν•΄ν•˜κΈ°

  • νƒ€μž… 힌트 μ—†μŒ β†’ β€œμ•„λ¬΄ μ„€λͺ… μ—†λŠ” ν•¨μˆ˜β€
  • νƒ€μž… 힌트 있음 β†’ β€œμ‚¬μš© μ„€λͺ…μ„œκ°€ 뢙은 ν•¨μˆ˜β€

βœ” νƒ€μž… νžŒνŠΈλŠ” κ°•μ œκ°€ μ•„λ‹ˆλ‹€
βœ” ν•˜μ§€λ§Œ μ½λŠ” μ‚¬λžŒμ„ λ°°λ €ν•œλ‹€

πŸ‘‰ νƒ€μž… νžŒνŠΈλŠ” 컴퓨터보닀 μ‚¬λžŒμ„ μœ„ν•œ κΈ°λŠ₯이닀


🧩 νƒ€μž… 힌트 κΈ°λ³Έ 문법

λ³€μˆ˜μ— νƒ€μž… 힌트

name: str = "jay"
age: int = 25
height: float = 175.5
is_active: bool = True
  • name은 λ¬Έμžμ—΄
  • ageλŠ” μ •μˆ˜
  • heightλŠ” μ‹€μˆ˜

ν•¨μˆ˜μ— νƒ€μž… 힌트

def greet(name: str) -> str:
    return f"μ•ˆλ…•ν•˜μ„Έμš”, {name}"

μ—¬κΈ°μ„œ -> str의 의미:

β€œμ΄ ν•¨μˆ˜λŠ” λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€β€


πŸ“¦ μ»¬λ ‰μ…˜ νƒ€μž… 힌트

리슀트(list)

names: list[str] = ["철수", "영희", "민수"]

βœ” λ¬Έμžμ—΄λ§Œ λ“€μ–΄κ°€λŠ” 리슀트
βœ” IDE μžλ™μ™„μ„±μ΄ μ •ν™•ν•΄μ§„λ‹€


λ”•μ…”λ„ˆλ¦¬(dict)

scores: dict[str, int] = {
    "철수": 90,
    "영희": 95
}

βœ” keyλŠ” λ¬Έμžμ—΄
βœ” valueλŠ” μ •μˆ˜


νŠœν”Œ(tuple)

user: tuple[str, int, bool] = ("jay", 25, True)

βœ” μœ„μΉ˜λ§ˆλ‹€ νƒ€μž…μ΄ κ³ μ •λœλ‹€
βœ” ꡬ쑰가 λͺ…ν™•ν•΄μ§„λ‹€


πŸ”€ 선택적 κ°’ (None ν—ˆμš©)

μ–΄λ–€ 값은 μžˆμ„ μˆ˜λ„, 없을 μˆ˜λ„ μžˆλ‹€.

nickname: str | None = None

이 νƒ€μž…μ˜ μ˜λ―ΈλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

πŸ‘‰ λ¬Έμžμ—΄μ΄κ±°λ‚˜
πŸ‘‰ 아무 값도 없을 수 μžˆλ‹€

Python 3.10 μ΄μƒμ—μ„œλŠ” | 문법을 μ‚¬μš©ν•œλ‹€.


πŸ” μ—¬λŸ¬ νƒ€μž… ν—ˆμš©ν•˜κΈ°

user_id: str | int

βœ” λ¬Έμžμ—΄ ID ν—ˆμš©
βœ” 숫자 ID도 ν—ˆμš©

μ‹€λ¬΄μ—μ„œ 맀우 자주 λ“±μž₯ν•˜λŠ” νŒ¨ν„΄


🧠 νƒ€μž… 힌트의 μ§„μ§œ κ°€μΉ˜

  • μžλ™μ™„μ„± 정확도 μƒμŠΉ
  • μ‹€ν–‰ μ „ 였λ₯˜ 탐지
  • μ½”λ“œ μžμ²΄κ°€ λ¬Έμ„œκ°€ 됨

❗ νƒ€μž… νžŒνŠΈλŠ” β€œνƒ€μž… 체크용 κΈ°λŠ₯”이 μ•„λ‹ˆλ‹€
❗ μ˜μ‚¬μ†Œν†΅ 도ꡬ닀


πŸš€ FastAPIμ—μ„œμ˜ ν™œμš©

이제 νƒ€μž… νžŒνŠΈκ°€ μ™œ β€œμžˆμœΌλ©΄ 쒋은 것”이 μ•„λ‹ˆλΌ
β€œμ—†μœΌλ©΄ μ•ˆ λ˜λŠ” κ²ƒβ€μœΌλ‘œ λ°”λ€ŒλŠ” μˆœκ°„μ„ 보자.

πŸ‘‰ FastAPIλŠ” νƒ€μž… 힌트λ₯Ό μ½μ–΄μ„œ λ™μž‘ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬λ‹€


πŸ” 1. 데이터 검증 (Validation)

from fastapi import FastAPI

app = FastAPI()

@app.get("/users/{user_id}")
def get_user(user_id: int):
    return {"user_id": user_id}

이 μ½”λ“œμ—μ„œ 핡심: user_id: int

  • /users/123 β†’ 정상 λ™μž‘
  • /users/abc β†’ μžλ™μœΌλ‘œ 422 μ—λŸ¬ λ°˜ν™˜

❌ κ°œλ°œμžκ°€ if 문으둜 κ²€μ‚¬ν•˜μ§€ μ•ŠλŠ”λ‹€
❌ try / exceptλ₯Ό μ“°μ§€ μ•ŠλŠ”λ‹€

βœ… νƒ€μž… 힌트 ν•˜λ‚˜λ‘œ μš”μ²­ 데이터 검증이 λλ‚œλ‹€


πŸ”„ 2. μžλ™ νƒ€μž… λ³€ν™˜

@app.get("/items/{item_id}")
def get_item(item_id: int):
    return {"item_id": item_id}    

URL의 λͺ¨λ“  값은 기본적으둜 λ¬Έμžμ—΄μ΄λ‹€.

ν•˜μ§€λ§Œ FastAPIλŠ” μ΄λ ‡κ²Œ λ™μž‘ν•œλ‹€.

  • "42" β†’ int 42
  • "3.14" β†’ λ³€ν™˜ μ‹€νŒ¨ β†’ μ—λŸ¬

πŸ‘‰ νƒ€μž… νžŒνŠΈλŠ” λ³€ν™˜ κ·œμΉ™μ΄ λœλ‹€


πŸ“„ 3. API λ¬Έμ„œ μžλ™ 생성

@app.get("/search")
def search(
    keyword: str,
    page: int = 1,
    limit: int | None = None
):
    return {
        "keyword": keyword,
        "page": page,
        "limit": limit
    }

μ„œλ²„ μ‹€ν–‰ ν›„ /docs에 μ ‘μ†ν•˜λ©΄
λ†€λΌμš΄ 일이 λ²Œμ–΄μ§„λ‹€.

  • 각 νŒŒλΌλ―Έν„°μ˜ νƒ€μž…
  • ν•„μˆ˜ / 선택 μ—¬λΆ€
  • κΈ°λ³Έκ°’

이 λͺ¨λ“  것이 λ¬Έμ„œλ‘œ μžλ™ μƒμ„±λœλ‹€.

βœ… νƒ€μž… 힌트 = API μŠ€νŽ™ λ¬Έμ„œ


🧩 Request Body와 νƒ€μž… 힌트

FastAPIμ—μ„œ JSON μš”μ²­ 본문은
νƒ€μž… 힌트 μ—†μ΄λŠ” μ œλŒ€λ‘œ λ‹€λ£° 수 μ—†λ‹€.

from pydantic import BaseModel

class UserCreate(BaseModel):
    name: str
    age: int
    email: str | None = None

@app.post("/users")
def create_user(user: UserCreate):
    return user

μ—¬κΈ°μ„œ λ²Œμ–΄μ§€λŠ” 일:

  • ν•„μˆ˜ ν•„λ“œ μžλ™ 검사
  • νƒ€μž… 뢈일치 μžλ™ μ—λŸ¬
  • λ¬Έμ„œ μžλ™ 생성

πŸ‘‰ νƒ€μž… 힌트 ν•˜λ‚˜λ‘œ
πŸ‘‰ 검증 + λ³€ν™˜ + λ¬Έμ„œκ°€ λ™μ‹œμ— ν•΄κ²°λœλ‹€


⚠️ νƒ€μž… νžŒνŠΈκ°€ μ—†μœΌλ©΄ μƒκΈ°λŠ” 문제

  • μš”μ²­ 검증이 λΆˆκ°€λŠ₯ν•˜λ‹€
  • μžλ™ λ¬Έμ„œκ°€ λΆ€μ •ν™•ν•΄μ§„λ‹€
  • IDE μžλ™μ™„μ„±μ΄ λ¬΄λ„ˆμ§„λ‹€

❗ FastAPIμ—μ„œ νƒ€μž… νžŒνŠΈλŠ” 선택이 μ•„λ‹ˆλ‹€
❗ 섀계 κ·Έ μžμ²΄λ‹€


🧠 핡심 정리

  • νƒ€μž… νžŒνŠΈλŠ” 싀행을 μœ„ν•œ κΈ°λŠ₯이 μ•„λ‹ˆλ‹€
  • μ˜λ„λ₯Ό ν‘œν˜„ν•˜λŠ” μ–Έμ–΄λ‹€
  • FastAPIλŠ” κ·Έ μ˜λ„λ₯Ό μ½”λ“œλ‘œ λ°”κΏ”μ€€λ‹€

πŸ‘‰ νƒ€μž… 힌트λ₯Ό 잘 μ“°λ©΄
πŸ‘‰ API 섀계가 κ³§ μ½”λ“œκ°€ λœλ‹€


✨ μ΅œμ’… μš”μ•½

  • 파이썬 단독 β†’ νƒ€μž… νžŒνŠΈλŠ” ꢌμž₯
  • FastAPI β†’ νƒ€μž… νžŒνŠΈλŠ” ν•„μˆ˜
  • μ½”λ“œ = λ¬Έμ„œ = 검증 κ·œμΉ™

🧠 β€œFastAPIμ—μ„œ νƒ€μž… νžŒνŠΈλŠ” 선택지가 μ•„λ‹ˆλΌ 언어닀”

profile
Gongbuhaja

0개의 λŒ“κΈ€