기술블로그-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를 적극 활용해보세요!