✅ 클래스 변수 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를 적극 활용해보세요!