개발자 블로그

[윤성우의 열혈 파이썬 중급편] - 21. 클래스 메소드와 static 메소드 본문

파이썬/윤성우의 열혈 파이썬 중급편

[윤성우의 열혈 파이썬 중급편] - 21. 클래스 메소드와 static 메소드

hayongwoon 2022. 5. 18. 15:57

클래스 메소드와 static 메소드를 이해하기 전에 클래스 변수와 인스턴스 변수에 대한 이해를 하고 넘어가자!

  • 클래스 변수: 클래스 내부의 변수로 self(객체)로 전달받지 않는다.(클래스에 속한 변수)
    클래스 내부에 직접적으로 연결되어 있고, self를 인자로 받지 않고 변수 명 그대로 쓰인다.

  • 인스턴스 변수: 객체 안에 있는 변수로 self(객체)에 의해 전달받은 변수.(객체에 속한 변수)
    보통 클래스 안의 메소드 내부에 있음.  ex) self.name = 'hayongwoon'

둘의 차이는 실제로 값에 접근을 할 때에도 있다.

클래스 변수의 경우 '클래스이름.변수명' 으로 접근 가능하고, 객체를 생성해서 '객체.변수명'으로도 접근이 가능

하지만, 인스턴스 변수의 경우 객체를 만들어야만 객체이름으로 접근이 가능하다.

 

*클래스 변수의 경우 두가지 방법 모두 접근이 가능하므로 헷갈리지 않게 보편적으로 클래스 이름으로 접근하는 방법을 사용한다.

클래스 변수와 인스턴스 변수

클래스 내부에도 변수의 종류를 두 가지로 나눌 수 있었다. 클래스에 속한 변수인지 객체에 속한 변수인지! 메소드 또한, 클래스에 속한 메소드인지(self를 인자로 받지 않는) 우리가 일반적으로 알고 있는 객체에 속한(self를 인자로 받고있는) 메소드인지로 나눌 수도 있겠다!

 

static 메소드 - 클래스에 속하는 메소드

본론으로 들어가기 까지 꽤 서두가 길었다. 스태틱 메소드는 앞에서 설명한 클래스 변수와 매우 유사하다. 객체를 통해 메소드로 접근하고 싶지 않을 때 즉, 클래스를 통해 메소드로 바로 접근하려 할 때 스태틱 메소드를 활용하자!

 

단순히, self를 인자로 주지 않는 것으로 보일 수 있겠지만 관습적으로 데코레이터 @staticmethod 를 통해 스태틱 메소드를 만들 수 있다.

static 메소드 활용

객체를 생성할 때 마다 Simple 클래스 변수 count가 올라간다. 하지만 객체를 생성하지 않아도 그 변수에 접근하고 싶을 때, 위와 같이 스태틱 메소드를 활용해서 해당 변수에 접근할 수 있다.

 

클래스 메소드  

스태틱 메소드와 매우 흡사하지만, 약간의 차이가 있다. 인자로 class 자기 자신을 인자로 받는 것이다. 그리고 인자의 이름은 관습적으로 cls라고 쓰인다. 그리고 함수 위 데코레이터 @classmethod라고 쓰고 사용하고 경우에 따라 클래스 메소드가 더 어울리는 상황들이 있다. 

 

클래스 메소드가 스태틱 메소드 보다 더 적합한 상황

*1) 팩토리 메소드를 만드는 경우, 클래스를 통해 생성 된 객체를 인자로 받아서 새로운 객체를 반환 및 생성하는 메소드

 

**2) 상속을 받아 부모의 메소드를 활용하여 새로운 객체(자식 클래스의)에 적용하고 싶은 경우 -> 더 클래스 메소드가 어울리는 경우

next_day 메소드가 존재하는 곳은 Date 클래스 이지만, 상속을 받았기 때문에 KDate, JDate 에서도 접근이 가능하다. 그리고 해당 메소드에 전달된 인자는 각 각 KDate 클래스 JDate 클래스의 객체이다.

 

생성된 클래스 객체를 인자로 사용하여 새로운 객체를 반환하는 경우에 이렇게 클래스 메소드를 사용해보자!

스태틱 메소드와 유사하게 클래스에 바로 접근하여 메소드를 접근할 수 있다는 점이 공통적인 부분이지만, 클래스 메소드는 클래스를 인자로 받을 수 있기에 위와 같은 상황에서 훨씬 적합하게 사용될 수 있다.