본문 바로가기
카테고리 없음

[Python] 클래스(Class)에서 사용할 수 있는 메소드(Method) 종류 정리

by JustJunsu 2024. 10. 21.

 

파이썬에서는 클래스에서 다양한 종류의 메소드를 정의할 수 있습니다. 이 포스팅에서는 인스턴스 메소드, 클래스 메소드, 정적 메소드의 차이와 그 각각의 사용법을 코드와 함께 알아보겠습니다.

1. 인스턴스 메소드 (Instance Method)

정의 및 특징

  • 인스턴스 메소드는 클래스의 인스턴스에서 호출되는 메소드입니다.
  • 메소드 내부에서 첫 번째 인자로 self를 받으며, 이를 통해 인스턴스 변수를 조작하거나 접근할 수 있습니다.
  • 클래스의 개별 인스턴스마다 다른 동작을 하도록 구현할 수 있습니다.

예시 코드:

class Car:
    def __init__(self, brand, model):
        self.brand = brand # 인스턴스 변수
        self.model = model 

    def display_info(self): # 인스턴스 메소드
   		return f"This car is a {self.brand} {self.model}." 

# 인스턴스 생성 
my_car = Car("Toyota", "Camry") 
print(my_car.display_info())
This car is a Toyota Camry.

주요 특징:

  • self를 통해 인스턴스 변수에 접근 가능.
  • 각 인스턴스마다 다른 상태(brand, model 등)를 유지할 수 있습니다.

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

정의 및 특징

  • 클래스 메소드는 클래스 자체에 속하는 메소드로, 클래스 변수를 조작하거나 클래스 전체에 적용되는 동작을 수행합니다.
  • 첫 번째 인자로 cls를 받으며, 이는 클래스 자체를 가리킵니다.
  • 클래스 메소드는 인스턴스가 없어도 호출할 수 있습니다.
  • @classmethod 데코레이터를 사용하여 정의합니다.

예시 코드:

class Car: 
    car_count = 0 # 클래스 변수 
    
    def __init__(self, brand, model): 
        self.brand = brand 
        self.model = model 
        Car.car_count += 1 # 클래스 변수 접근 
        
    @classmethod 
    def get_car_count(cls): # 클래스 메소드 
        return f"Total cars created: {cls.car_count}" 

# 인스턴스 생성 
car1 = Car("Toyota", "Camry") 
car2 = Car("Honda", "Accord") 

# 클래스 메소드 호출 
print(Car.get_car_count())
 
Total cars created: 2

주요 특징:

  • 클래스 변수를 조작하거나 클래스의 상태에 따라 동작.
  • 인스턴스 없이도 Car.get_car_count()처럼 클래스 이름으로 호출 가능.

3. 정적 메소드 (Static Method)

정의 및 특징

  • 정적 메소드는 클래스나 인스턴스와 관련이 없는 독립적인 동작을 수행하는 메소드입니다.
  • 클래스 내부에서 정의되지만, 클래스나 인스턴스 변수에 접근하지 않습니다.
  • 일반 함수처럼 동작하지만 클래스의 네임스페이스 안에 존재합니다.
  • @staticmethod 데코레이터를 사용하여 정의합니다.

예시 코드:

class Car: 
    @staticmethod 
    def car_types(): # 정적 메소드 
    	return ["SUV", "Sedan", "Truck"] 

# 정적 메소드 호출 
print(Car.car_types())
['SUV', 'Sedan', 'Truck']

주요 특징:

  • 클래스나 인스턴스 상태에 의존하지 않음.
  • 클래스의 네임스페이스 안에서 독립적으로 동작.

4. @property 데코레이터

정의 및 특징

  • 인스턴스 메소드를 속성처럼 접근할 수 있도록 만듭니다.
  • @property 데코레이터를 사용하여 정의하고, @<property_name>.setter를 사용하여 값을 설정하는 메소드도 정의할 수 있습니다.
  • 캡슐화된 인스턴스 변수를 읽거나 쓸 때 유용합니다.

예시 코드:

class Car: 
    def __init__(self, brand, model, price): 
        self.brand = brand 
        self.model = model 
        self._price = price # 캡슐화된 변수 
        
    @property 
    def price(self): # 읽기 전용 속성 
    	return self._price 
        
    @price.setter 
    def price(self, new_price): # 값을 설정하는 메소드 
    	if new_price > 0: 
    		self._price = new_price 
    	else: 
    		print("Price must be positive!") 

# 인스턴스 생성 
my_car = Car("Toyota", "Camry", 30000) 

# 읽기 및 쓰기 
print(my_car.price)
my_car.price = 35000
print(my_car.price)
 
30000 
35000

주요 특징:

  • 인스턴스 변수에 직접 접근하지 않고 getter/setter를 통해 값을 읽고 쓸 수 있습니다.
  • 캡슐화와 데이터 검증을 쉽게 구현할 수 있습니다.

5. 클래스에서 사용할 수 있는 메소드 비교 정리

메소드 유형 첫 번째 인자 인스턴스 접근 클래스 접근 주요 용도
인스턴스 메소드 self O X 인스턴스 변수를 조작하거나 인스턴스별 동작을 구현
클래스 메소드 cls X O 클래스 변수나 클래스 전체에 적용되는 동작 구현
정적 메소드 없음 X X 클래스나 인스턴스와 관련 없는 독립적인 동작 구현
@property self O X 인스턴스 변수를 속성처럼 읽고 쓸 수 있게 구현

결론

파이썬에서 클래스 메소드는 각 메소드 유형에 따라 다르게 동작합니다. 인스턴스 메소드는 객체의 상태를 관리하고, 클래스 메소드는 클래스의 상태를 제어하며, 정적 메소드는 클래스와 독립적인 동작을 구현합니다. @property는 캡슐화된 데이터를 간단하게 다룰 수 있게 도와줍니다.

각 메소드의 특성에 맞게 사용하여 코드의 유지보수성과 확장성을 높일 수 있습니다.

 

Reference

https://docs.python.org/3/tutorial/classes.html

 

9. Classes

Classes provide a means of bundling data and functionality together. Creating a new class creates a new type of object, allowing new instances of that type to be made. Each class instance can have ...

docs.python.org