
클래스 속성은 __init__ 밖에서 클래스에 바로 선언하는 속성입니다. 클래스에 속해 있으며 모든 인스턴스가 공유합니다. 반면 인스턴스 속성은 인스턴스별로 독립되어 있어 서로 영향을 주지 않습니다.
class Person:
species = "사람" # 클래스 속성: 모든 인스턴스가 공유
def __init__(self, name):
self.name = name # 인스턴스 속성: 인스턴스별로 독립
클래스 속성에 접근할 때는 클래스이름.속성명 형태로 접근하면 코드 의도가 더 명확해집니다.
james = Person("james")
maria = Person("maria")
# 클래스 속성: 모든 인스턴스에서 동일한 값
print(Person.species) # 사람
print(james.species) # 사람
print(maria.species) # 사람
# 클래스 속성 변경 → 모든 인스턴스에 반영
Person.species = "인간"
print(james.species) # 인간
print(maria.species) # 인간
# 인스턴스 속성: 인스턴스별로 독립
print(james.name) # james
print(maria.name) # maria
두 속성의 차이를 표로 정리하면 다음과 같습니다.
| 구분 | 클래스 속성 | 인스턴스 속성 |
|---|---|---|
| 선언 위치 | 클래스 바로 아래 | __init__ 안 (self.속성) |
| 공유 여부 | 모든 인스턴스가 공유 | 인스턴스별로 독립 |
| 접근 방법 | 클래스명.속성 (권장) | 인스턴스.속성 |
| 비공개 선언 | __속성명 | __속성명 |
클래스 속성도 이름 앞에 밑줄 두 개(__)를 붙이면 비공개 속성으로 만들 수 있습니다.
함수와 마찬가지로 클래스와 메서드에도 독스트링(Docstring) 을 작성할 수 있습니다. 클래스나 메서드의 역할을 문서화할 때 사용합니다.
class Person:
"""사람을 표현하는 클래스입니다.""" # 클래스 독스트링
def greet(self):
"""인사말을 출력하는 메서드입니다.""" # 메서드 독스트링
print("안녕하세요!")
# help() 또는 __doc__으로 확인 가능
print(Person.__doc__) # 사람을 표현하는 클래스입니다.
print(Person.greet.__doc__) # 인사말을 출력하는 메서드입니다.
@staticmethod정적 메서드(Static Method) 는 메서드 위에 @staticmethod 데코레이터를 붙여서 만듭니다. self를 매개변수로 받지 않기 때문에 인스턴스 속성이나 인스턴스 메서드에 접근할 수 없습니다.
💡 메서드 위에 붙는
@로 시작하는 것을 데코레이터(Decorator) 라고 합니다.
class Calculator:
# 정적 메서드: self 없음, 인스턴스 상태와 무관
@staticmethod
def add(a, b):
return a + b
@staticmethod
def is_positive(n):
return n > 0
# 클래스 또는 인스턴스 모두로 호출 가능
print(Calculator.add(3, 5)) # 8
print(Calculator.is_positive(-1)) # False
calc = Calculator()
print(calc.add(10, 20)) # 30 (인스턴스로도 호출 가능)
정적 메서드는 인스턴스의 상태를 변경하지 않는 유틸리티성 기능을 클래스 안에 묶어두고 싶을 때 사용합니다.
@classmethod클래스 메서드(Class Method) 는 메서드 위에 @classmethod 데코레이터를 붙이고, 첫 번째 매개변수로 cls(클래스 자기 자신) 를 받습니다. self 대신 cls를 통해 클래스 속성에 접근하거나 클래스 자체를 다룰 수 있습니다.
class Person:
count = 0 # 클래스 속성: 인스턴스 생성 횟수 추적
def __init__(self, name):
self.name = name
Person.count += 1
@classmethod
def get_count(cls):
print(f"현재까지 생성된 인스턴스: {cls.count}명")
@classmethod
def create_anonymous(cls):
return cls("익명") # 클래스 메서드로 인스턴스 생성
james = Person("james")
maria = Person("maria")
Person.get_count() # 현재까지 생성된 인스턴스: 2명
anonymous = Person.create_anonymous()
print(anonymous.name) # 익명
| 구분 | 인스턴스 메서드 | 정적 메서드 | 클래스 메서드 |
|---|---|---|---|
| 데코레이터 | 없음 | @staticmethod | @classmethod |
| 첫 번째 매개변수 | self | 없음 | cls |
| 인스턴스 속성 접근 | ✅ 가능 | ❌ 불가 | ❌ 불가 |
| 클래스 속성 접근 | ✅ 가능 | ❌ 불가 | ✅ 가능 |
| 주요 사용 목적 | 인스턴스 상태 변경 | 유틸리티 기능 | 클래스 상태 관리, 팩토리 패턴 |