기술블로그-Fastapi편

✅ 클래스 변수 vs 인스턴스 변수 vs ClassVar 완벽 정리

Chansman 2025. 5. 27. 13:34

✅ 클래스 변수 vs 인스턴스 변수 vs ClassVar 완벽 정리

1. 🎯 개념 요약

항목 클래스 변수 (Class Variable) 인스턴스 변수 (Instance Variable) ClassVar

정의 위치 클래스 안, 메서드 밖 메서드 내부 (self. 사용) 클래스 안에서 타입 힌트로 사용
값 공유 여부 ✅ 모든 인스턴스에서 공유 ❌ 인스턴스마다 별도로 존재 ✅ 클래스 전체 공유 (명시 목적)
수정 시 영향 전체 인스턴스에 영향 해당 인스턴스에만 영향 타입 검사기용 (실행에는 영향 없음)
주 사용 목적 공통 설정값, 상수 등 개별 속성 저장 정적 타입 분석 정확도 향상

2. 📌 코드 예시 비교

✅ 클래스 변수

class Dog:
    species = "Canine"  # 클래스 변수

    def __init__(self, name):
        self.name = name  # 인스턴스 변수

✅ 인스턴스 변수

a = Dog("바둑이")
b = Dog("멍멍이")

print(a.name)  # 바둑이
print(b.name)  # 멍멍이

✅ 클래스 변수는 공유됨

print(a.species)  # Canine
Dog.species = "강아지"
print(b.species)  # 강아지 ← 클래스 변수는 전체 공유

3. ✅ ClassVar란?

from typing import ClassVar

class Dog:
    species: ClassVar[str] = "Canine"  # 명시적 클래스 변수

    def __init__(self, name: str):
        self.name = name
  • ClassVar는 타입 힌트용 키워드로, 이건 인스턴스 변수가 아니다! 라는 의도를 분명히 전달합니다.
  • 런타임엔 영향이 없고, mypy/pyright 같은 정적 분석기에서만 검사합니다.

4. 🧠 요약 정리

질문 답변

클래스 변수는 어디서 정의? 클래스 본문 내 (함수 밖)
인스턴스 변수는 어디서 정의? __init__ 등 메서드 내 self. 사용
ClassVar는 왜 쓰나요? 정적 분석기에게 클래스 변수임을 명확히 알려주기 위해
런타임에서 강제되나요? ❌ 아니요. 타입 검사기에만 사용됨

🔚 마무리 팁

  • 공통값은 클래스 변수로, 개별값은 인스턴스 변수로 구분해서 사용하세요.
  • ClassVar는 협업 시 변수의 역할을 명확히 구분해주는 의사소통 도구입니다.
  • 정적 분석기를 사용한다면 ClassVar를 적극 활용해보세요!