본문 바로가기
Programming/Python

[클래스] 클래스 메서드 사용하기

by 용스토리랜드 2023. 3. 13.

정적 메서드와 비슷하지만 약간의 차이점이 있는 클래스 메서드

 

클래스 메서드는 다음과 같이 메서드 위에 @classmethod 를 붙인다. 이때 클래스 메서드는 첫 번째 매개변수에 cls 를 지정해야 한다(cls : class) 

class 클래스이름 : 
  @classmethod
  def 메서드(cls, 매개변수1, 매개변수2 ... ) :
    << code >>
class Person : 
  count = 0 # 클래스 속성 
  
  # __init__ : 인스턴스가 만들어졌습니다 ~ 
  def __init__(self):
    Person.count += 1 # 인스턴스가 만들어질 때 클래스 속성 count 에 1을 더함.
    
  @classmethod 
  def print_count(cls) : 
    print('{}명 생성되었습니다'.format(cls.count)) # cls 로 클래스 속성에 접근.
    
    
james = Person() # count + 1 = 1 
maria = Person() # count + 1 = 2
 
Person.print_count()    # 2명 생성되었습니다.

먼저 인스턴스가 만들어질 때마다 숫자를 세야 하므로 __init__ 메서드에서 클래스 속성 count 에 1을 더해줍니다. 물론 클래스 속성에 접근한다는 것을 명확하게 하기 위해 Person.count 와 같이 만들어줍니다. 

class Person : 
  count = 0 # 클래스 속성 
  
  def __init__(self) : 
    Person.count += 1 # 인스턴스가 만들어질 때 클래스 속성 count 에 1을 더함

@classmethod 를 붙여서 클래스 메서드를 만듭니다. 클래스 메서드는 첫 번째 매개변수가 cls 인데 여기에는 현재 클래스가 들어옵니다. 따라서 cls.count 처럼 cls 로 클래스 속성 count 에 접근할 수 있다.

@classmethod 
def print_count(cls) : 
  print('{0}명 생성되었습니다.'.format(cls.count))    # cls로 클래스 속성에 접근

클래스 메서드는 정적 메서드처럼 인스턴스 없이 호출할 수 있다는 점은 같습니다. 하지만 클래스 메서드는 메서드 안에서 클래스 속성, 클래스 메서드에 저븍ㄴ해야 할 때 사용합니다.

 

특히 cls 를 사용하면 메서드 안에서 현재 클래스의 인스턴스를 만들 수도 있습니다. 즉, cls 는 클래스이므로 cls() 는 Person() 과 같습니다.

@classmethod
def create(cls) :
  p = cls() # cls 로 인스턴스 생성
  retur p

 

# 연습문제 : 날짜 클래스 만들기 

- 다음 소스 코드에서 Date 클래스를 완성하세요. is_date_valid는 문자열이 올바른 날짜인지 검사하는 메서드입니다. 날짜에서 월은 12월까지 일은 31일까지 있어야 합니다.

 

class Date : 
  @staticmethod 
  def is_date_valid(ate_string) : 
    year, month, day = map(int,date_string.split('-'))
    return month <= 12 and day <= 31

if Date.is_date_valid("2000-10-31") : 
  print("올바른 날짜 형식입니다.")

else : 
  print("잘못된 날짜 형식입니다.")
반응형