Data/Python

[Python] 파이썬 클래스 - 변수와 메소드

재은초 2023. 6. 17. 22:06
반응형

클래스 변수

  • 클래스에서 생성된 객체라도 서로 완전히 독립적이지만, 클래스 변수를 사용하면 같은 클래스에서 생성된 객체들끼리 정보를 공유할 수 있다.
>>> class Alphabets:
...     __str = ""                         # 클래스 변수 선언
...     def __init__(self, text):
...         self.text = text
...         Alphabets.__str += text
...     def print_class_variable(self):
...         print (Alphabets.__str)        # 클래스 변수 사용
 
>>> if __name__ == '__main__':
...     o1 = Alphabets('p')                # 알파벳 클래스의 6개 객체 생성
...     o2 = Alphabets('y')
...     o3 = Alphabets('t')
...     o4 = Alphabets('h')
...     o5 = Alphabets('o')
...     o6 = Alphabets('n')
...     o1.print_class_variable()
...     o5.print_class_variable()
python
python

 

클래스 메소드

  • 클래스 메소드는 클래스의 데이터인 객체(Object)를 처리하는 동작 부분으로, 함수의 형태로 객체 내부에서 연산을 수행한다.
  • 클래스 메소드는 해당 클래스의 객체에서만 호출이 가능하며, 멤버 함수라고도 한다.
# 객체명.메소드명()
a = list()
print(a.append(0))

 

메소드 오버라이딩

  • 부모 클래스의 메소드를 동일한 이름으로 다시 만드는 것을 오버라이딩(overriding, 덮어쓰기)이라고 한다.
  • 자식 클래스의 객체로 메소드를 호출하면 재정의된 메소드가 호출된다.
# FourCal 클래스 실행시 오류
>>> a = FourCal(4, 0)
>>> a.div()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    result = self.first / self.second
ZeroDivisionError: division by zero         # 4를 0으로 나누려고 하기 때문에 오류

# 0으로 나눌 때 오류가 아닌 0을 리턴하도록 만들고 싶다면
>>> class SafeFourCal(FourCal):        # FourCal클래스를 상속
...     def div(self):                 # FourCal > div 메서드와 동일 이름
...         if self.second == 0:       # 나누는 값이 0이면 0을 리턴하도록 수정
...             return 0
...         else:
...             return self.first / self.second
>>> a = SafeFourCal(4, 0)              
>>> a.div()
0



클래스 메소드 종류

1. 객체 메소드(Instance Method)

  • 객체 메소드는 클래스를 통해 생성한 객체에서 호출되는 메소드로, 해당 메소드를 통해 호출한 객체에서만 영향을 미친다.
  • 객체 메소드는 객체 변수에 접근할 수 있도록 항상 첫번째 인자로 객체 자신을 뜻하는 self 매개변수를 넘겨받는다. self 인자를 통해 __init__에서 정의한 인스턴스 변수에 접근한다.

2. 정적 메소드(Static Method)

  • 정적 메소드는 @staticmethod라는 데코레이터로 선언하며, 기본 인자로 넘어오는 것이 아무것도 없어 객체와 독립적이다.
  • 보통 정적 메소드는 다른 외부 상태에 영향을 미치지 않는 순수 함수, 즉 입력 값이 같으면 언제나 출력값이 같은 용도로 사용된다.

3. 클래스 메소드(Class Method)

  • 클래스 메소드는 @classmethod라는 데코레이터로 선언하며, 클래스로 생성된 객체가 아니라 클래스 자체에서 직접 호출된다.
  • 그래서 객체의 속성이나 메서드에는 접근이 불가능하나, 클래스를 의미하는 cls라는 매개변수를 사용하면 클래스 메서드 내부에서 현재 클래스의 객체를 만들 수 있다. 
  • 객체 없이 호출이 가능하다는 점에서 정적 메서드와 비슷하고, self 매개 변수를 가진 객체 메서드처럼 cls 라는 매개 변수를 가진다.
객체 자신을 의미하는 self, 객체명.속성 = self.속성
현재 클래스를 의미하는 cls, cls() = 현재클래스명()
>>> class Test():
>>>     age = 10                         # 클래스 변수(속성)
>>> 
>>>     def __init__(self, name):          
>>>         self.name = name             
>>> 
>>>     def say_hi(self):                 # 객체 메소드
>>>         print(f"hi, {self.name}")     # 클래스 내 호출법, self.메소드명
>>>
>>>     @staticmethod                     # 정적 메소드 
>>>     def good_bye():                   # 어디서 접근하든 똑같은 방식으로 실행
>>>         print("bye bye")
>>>
>>>     @classmethod                      # 클래스 메소드  
>>>     def greeting(cls):                # 클래스 속성에 접근 가능
>>>         print(f"{cls.age} years old")

>>> ppl = Test('jane')
>>> ppl.say_hi()                           # 객체 메서드 호출
hi, jane
>>> ppl.good_bye()                         # 정적 메서드 호출
bye bye
>>> ppl.greeting()                         # 클래스 메소드
10 years old


Reference

반응형