본문 바로가기
Python

[Python methods] 인스턴스 메소드, 클래스 메소드, 스태틱 메소드

2023. 1. 6.

파이썬 Class에서 선언하는 메소드의 종류로 인스턴스(Instance) 메소드, 클래스(Class) 메소드, 스태틱(Static) 메소드가 있다. 모두 클래스 내부에 작성되는 공통점이 있는데, 각각의 메소드의 개념과 서로 어떤 차이점이 있는지 알아보자.

1. 인스턴스 메소드 (Instance method)
- 객체를 이용하여 메소드를 호출한다.
- 다른 객체에 영향이 없고 메소드를 호출한 해당 객체에만 영향을 준다.
- 메소드의 첫번째 파라미터로 객체 자기 자신을 의미하는 self를 사용한다.

2. 클래스 메소드 (Class method)
- 클래스를 이용하여 메소드를 호출한다.
- 클래스 객체 전체에 영향을 준다.
- 메소드의 첫번째 파라미터로 클래스를 의미하는 cls를 사용한다.
- 생성된 객체의 초기 변수값을 모두 수정할 경우 유용하다.
- @classmethod 데코레이터를 사용한다.

3. 스태틱 메소드 (Static method)
- 객체나 클래스 없이 메소드를 호출한다.
- 클래스 내부에 정의되었지만 일반 함수와 다를 바 없다.
- 클래스와의 연관성을 내포할 수 있다.
- @staticmethod 데코레이터를 사용한다.


코드와 실행 결과를 통해 이해

class Account:
    interest = 3   # 이자율 3%

    def __init__(self, asset=10000):
        self.asset = asset

    def change_interest(self, interest):  # 이자율 변경 인스턴스 메소드
        if interest < 10:
            self.interest = interest
        else:
            print('이자율을 10% 미만으로 설정해주세요')

    @classmethod
    def cls_change_interest(cls, interest):  # 이자율 변경 클래스 메소드
        if interest < 10:
            cls.interest = interest
        else:
            print('이자율을 10% 미만으로 설정해주세요')

    @staticmethod
    def interest_grade(interest):   # 이자율 등급 확인 스태틱 메소드
        if interest > 7:
            print('high interest')
        elif interest > 5:
            print('middle interest')
        else:
            print('low interest')

Account 클래스의 interest(이자율) 초기값을 3으로 설정하고
인스턴스 메소드 change_interest,
클래스 메소드 cls_change_interest,
스태틱 메소드 interest_grade를 선언했다.

account1 = Account(15000)
account2 = Account()
account3 = Account(30000)
account4 = Account(25000)

print(f'account1 이자율 : {account1.interest}%')
print(f'account2 이자율 : {account2.interest}%')
print(f'account3 이자율 : {account3.interest}%')
print(f'account4 이자율 : {account4.interest}%')

# 실행 결과
account1 이자율 : 3%
account2 이자율 : 3%
account3 이자율 : 3%
account4 이자율 : 3%

객체 4개를 생성하고 각각 이자율 초기값 3임을 확인

# 인스턴스 메소드 사용
account1.change_interest(9)  # account1객체의 이자율 9%로 변경
print(f'account1 이자율 : {account1.interest}%')
print(f'account2 이자율 : {account2.interest}%')
print(f'account3 이자율 : {account3.interest}%')
print(f'account4 이자율 : {account4.interest}%')

# 실행 결과
account1 이자율 : 9%
account2 이자율 : 3%
account3 이자율 : 3%
account4 이자율 : 3%

객체.메소드명 형태로 인스턴스 메소드 호출 결과 객체 account1의 이자율만 변경된 것을 알 수 있다.

# 클래스 메소드 사용
# 해당 클래스로부터 만들어진 객체의 변수(초기값인 경우)를 한꺼번에 변경
Account.cls_change_interest(5)
print(f'account1 이자율 : {account1.interest}%')
print(f'account2 이자율 : {account2.interest}%')
print(f'account3 이자율 : {account3.interest}%')
print(f'account4 이자율 : {account4.interest}%')

# 실행 결과
account1 이자율 : 9%
account2 이자율 : 5%
account3 이자율 : 5%
account4 이자율 : 5%

클래스.메소드명 형태로 클래스 메소드 실행 결과 이자율 초기값이었던 객체 3개의 이자율이 동시에 변경된 것을 알 수 있다. 이자율이 변경되어 초기값이 아닌 account1의 경우 변화가 없다.

# 인스턴스 메소드 사용
account3.change_interest(7)  # account3객체의 이자율 7%로 변경
print(f'account1 이자율 : {account1.interest}%')
print(f'account2 이자율 : {account2.interest}%')
print(f'account3 이자율 : {account3.interest}%')
print(f'account4 이자율 : {account4.interest}%')

# 실행 결과
account1 이자율 : 9%
account2 이자율 : 5%
account3 이자율 : 7%
account4 이자율 : 5%

다시 인스턴스 메소드 호출 결과 객체 account3의 이자율만 변경된 것을 알 수 있다.


스태틱 메소드는 클래스명.메소드명 형태로 호출하여 일반 함수처럼 사용한다.

# 스태틱 메소드 사용
# 일반 함수처럼 사용
Account.interest_grade(account1.interest)
Account.interest_grade(account2.interest)
Account.interest_grade(account3.interest)
Account.interest_grade(account4.interest)

# 실행 결과
high interest
low interest
middle interest
low interest

일반 함수를 사용하는 것처럼 각 객체의 이자율 숫자값을 argument로 사용하여 각각의 이자율 등급을 얻었다.
객체의 상태를 변화시키지 않는 메소드를 구현할 때 스태틱 메소드를 활용할 수 있다.

반응형

댓글