class method란? 중첩클래스에서 nested된 클래스 매서드 접근하는방법?

minsing-jin·2024년 11월 28일
1

중첩된 클래스(nested class)에서 메서드를 사용할 때 인스턴스 메서드가 아닌 클래스 메서드를 사용하는 이유는 중첩 클래스와 외부 클래스 간의 관계인스턴스 메서드와 클래스 메서드의 동작 방식의 차이점에서 비롯됩니다.


1. 중첩 클래스와 외부 클래스 간의 관계

  • 중첩 클래스(nested class)는 외부 클래스 내부에 정의된 클래스입니다.
  • 중첩 클래스는 외부 클래스의 인스턴스와 직접적으로 연결되어 있지 않습니다.
    • 즉, 외부 클래스의 인스턴스가 생성되지 않은 상태에서도 중첩 클래스를 독립적으로 사용할 수 있습니다.

이 특성 때문에, 중첩 클래스 내부에서 외부 클래스의 인스턴스를 사용하려면 인스턴스 간 연결이 명시적으로 필요합니다. 반면, 클래스 메서드는 외부 클래스의 인스턴스 없이도 호출 가능하기 때문에 유용합니다.


2. 인스턴스 메서드와 클래스 메서드의 차이

(1) 인스턴스 메서드

  • 첫 번째 매개변수self로, 호출한 인스턴스를 참조합니다.
  • 인스턴스가 생성된 이후에만 호출 가능하며, 해당 인스턴스의 속성 및 메서드에 접근합니다.

(2) 클래스 메서드

  • 첫 번째 매개변수cls로, 호출한 클래스 자체를 참조합니다.
  • 클래스 레벨에서 동작하며, 인스턴스가 없어도 호출할 수 있습니다.
  • 클래스 속성이나 다른 클래스 메서드에 접근할 때 유용합니다.

3. 중첩 클래스에서 인스턴스 메서드가 안 되는 이유

  • 중첩 클래스는 외부 클래스의 인스턴스와 자동으로 연결되지 않습니다.
  • 인스턴스 메서드는 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)와 연결되지 않기 때문에, 인스턴스 메서드에서 외부 클래스의 속성에 접근할 수 없습니다.

4. 클래스 메서드로 해결되는 이유

  • 클래스 메서드는 외부 클래스의 인스턴스 없이도 호출 가능합니다.
  • 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를 통해 클래스 레벨에서 동작하므로 외부 클래스와의 인스턴스 연결이 필요 없습니다.

5. 인스턴스 메서드와 클래스 메서드의 차이를 정리

특징인스턴스 메서드클래스 메서드
호출 주체인스턴스(self)클래스(cls)
첫 번째 매개변수self (인스턴스 참조)cls (클래스 참조)
외부 클래스의 인스턴스 필요필요함필요하지 않음
사용 가능 시점인스턴스 생성 후클래스 정의 후 바로
주로 사용하는 경우인스턴스 속성/메서드 조작클래스 속성/메서드 접근, 팩토리 메서드 생성 등

6. 언제 클래스 메서드를 사용할까?

  1. 클래스 레벨의 작업:
    • 클래스 속성이나 클래스 레벨의 작업이 필요할 때.
  2. 외부 클래스와의 연결 없이 독립적인 작업:
    • 중첩 클래스처럼 외부 클래스와의 인스턴스 연결이 필요하지 않을 때.
  3. 팩토리 메서드:
    • 클래스 메서드를 활용해 특정 조건에 따라 객체를 생성.

7. 요약

  • 중첩 클래스에서 외부 클래스와의 인스턴스 연결이 필요하지 않은 경우, 클래스 메서드(@classmethod)를 사용하여 문제를 해결합니다.
  • 인스턴스 메서드는 외부 클래스의 인스턴스와 직접 연결될 필요가 있으며, 이 연결이 없다면 작동하지 않습니다.
  • cls는 클래스 자체를 참조하고, 외부 클래스의 인스턴스를 요구하지 않기 때문에 중첩 클래스에서 더 적합하게 사용될 수 있습니다.
profile
why not? 정신으로 맨땅에 헤딩하고 있는 코린이

0개의 댓글