
중첩된 클래스(nested class)에서 메서드를 사용할 때 인스턴스 메서드가 아닌 클래스 메서드를 사용하는 이유는 중첩 클래스와 외부 클래스 간의 관계와 인스턴스 메서드와 클래스 메서드의 동작 방식의 차이점에서 비롯됩니다.
이 특성 때문에, 중첩 클래스 내부에서 외부 클래스의 인스턴스를 사용하려면 인스턴스 간 연결이 명시적으로 필요합니다. 반면, 클래스 메서드는 외부 클래스의 인스턴스 없이도 호출 가능하기 때문에 유용합니다.
self로, 호출한 인스턴스를 참조합니다.cls로, 호출한 클래스 자체를 참조합니다.self를 통해 외부 클래스의 인스턴스를 필요로 하기 때문에, 외부 클래스의 인스턴스 없이 호출하려고 하면 오류가 발생합니다.class Outer:
def __init__(self, name):
self.name = name
class Inner:
def greet(self): # 인스턴스 메서드
return f"Hello from {self.name}" # self.name에 접근 시 오류 발생
# 호출
outer = Outer("OuterInstance")
inner = outer.Inner() # 이 코드는 오류 발생
inner.greet()
AttributeError: 'Inner' object has no attribute 'name'
Inner 클래스는 Outer 클래스의 인스턴스(self.name)와 연결되지 않기 때문에, 인스턴스 메서드에서 외부 클래스의 속성에 접근할 수 없습니다.cls는 외부 클래스 자체를 참조하므로, 외부 클래스의 속성 및 메서드에 접근할 때 인스턴스와의 연결을 필요로 하지 않습니다.class Outer:
name = "OuterClass"
class Inner:
@classmethod
def greet(cls):
return f"Hello from {cls.__name__}"
# 호출
outer = Outer()
inner = outer.Inner() # 중첩 클래스 호출
print(inner.greet())
Hello from Inner
greet 메서드는 cls를 통해 클래스 레벨에서 동작하므로 외부 클래스와의 인스턴스 연결이 필요 없습니다.| 특징 | 인스턴스 메서드 | 클래스 메서드 |
|---|---|---|
| 호출 주체 | 인스턴스(self) | 클래스(cls) |
| 첫 번째 매개변수 | self (인스턴스 참조) | cls (클래스 참조) |
| 외부 클래스의 인스턴스 필요 | 필요함 | 필요하지 않음 |
| 사용 가능 시점 | 인스턴스 생성 후 | 클래스 정의 후 바로 |
| 주로 사용하는 경우 | 인스턴스 속성/메서드 조작 | 클래스 속성/메서드 접근, 팩토리 메서드 생성 등 |
@classmethod)를 사용하여 문제를 해결합니다.cls는 클래스 자체를 참조하고, 외부 클래스의 인스턴스를 요구하지 않기 때문에 중첩 클래스에서 더 적합하게 사용될 수 있습니다.