중첩된 클래스(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
는 클래스 자체를 참조하고, 외부 클래스의 인스턴스를 요구하지 않기 때문에 중첩 클래스에서 더 적합하게 사용될 수 있습니다.