[python] 클래스(class)

이번 글에서는 파이썬에서 클래스(class)를 만드는 법에 대해 간단히 알아보겠습니다.

클래스의 개념

객체지향프로그래밍(Object Oriented Programming)에서는 모든 데이터를 객체(Object)로 취급하여 다룹니다.

개발자 관점에서 인식되는 개념, 논리, 사물 등등  모든 것들은 객체로 다룰수 있습니다. 클래스는 그러한 객체를 설계하는 것을 말합니다. 예를들어 자동차(객체)와 자동차설계도(클래스) 관계로 이해하시면 됩니다.

클래스 만들기

예시를 자동차로 들었으니, 자동차에 대한 클래스를 만들어보겠습니다. 아래는 아무런 동작을 하지 않는 자동차 클래스를 만든 코드 입니다.

# 클래스 Car
class Car:
    pass

# 인스턴스 car1
car1 = Car()

여기서 Car는 클래스이고 car1를 인스턴스(instance)라고 합니다. 위는 “클래스 Car에 대한 인스턴스 car1을 생성했다”라고 합니다.

클래스 함수

클래스에는 함수를 추가 할 수 있습니다. 아래는 클래스 함수 형태입니다.

class 클래스:
    def 함수이름(self, 매개변수1, 매개변수2):
        # 수행할 코드

이전 글에 알려드린 함수와 방식과 유사하지만 클래스 함수는 첫번째 매개변수는 무조건 self를 입력해야 하는 것이 특징입니다. self로 전달되는 것은 함수를 호출하는 인스턴스입니다.

예시로 자동차 클래스에 차종을 입력하고, 시동을 ON/OFF하고, 현재 상태를 출력하는 클래스 함수들도 추가해보겠습니다.

class Car:
    # 차종 입력
    def SetCarType(self, car_type):
        self.car_type = car_type
        
    # 시동 ON
    def PowerOn(self):
        self.power_on = True
        print(self.car_type, "시동 ON")
    
    # 시동 OFF
    def PowerOff(self):
        self.power_on = False
        print(self.car_type, "시동 OFF")
    
    # 현재 상태 출력
    def print_status(self):
        if self.power_on is True:
            print(self.car_type, "상태: 시동 ON")
    
        else:
            print(self.car_type, "상태: 시동 OFF")


car1 = Car()
car2 = Car()
car1.SetCarType("람보르기니")
car2.SetCarType("벤틀리")

car1.PowerOn()
car2.PowerOn()
car1.PowerOff()

print("="*7, "자동차 상태", "="*7)
car1.print_status()
car2.print_status()

car1과 car2를 생성하였고, car1과 car2에 각각 람보르기니와 벤틀리를 설정하였습니다.
현실에서 람보르기니의 시동을 켰다고 옆에있던 벤틀리의 시동이 켜지지 않듯이, 생성된 인스턴스는 각각의 객체로서의 역할을 합니다.

생성자(Constructor)

위에서 만든 클래스를 아래와 같이 사용하면 에러가 발생합니다.

car1 = Car()
car1.print_status()
car1.PowerOn()
car1.SetCarType("람보르기니")

오류 메시지를 보면 Car’ object has no attribute ‘power_on’이라고 써있습니다.

직역하면 Car 객체에 power_on이라는 속성이 없다는 의미인데, PowerOn 또는 PowerOff 함수를 호출해야 power_on 변수가 생성되는데 print_status 함수를 먼저 사용하면 power_on 변수가 없다는 의미입니다.

이런 경우 생성자(Constructor)를 구현하여 power_on 변수를 생성해야합니다.
파이썬에서는 __init__ 함수를 사용합니다.

class Car:
    # 생성자
    def __init__(self, car_type): # 생성자에서 car_type을 받게 함
        self.car_type = car_type
        self.power_on = False
    
    # 기타 함수 생략...


car1 = Car("람보르기니") # 앞으로 Car 객체를 만들 땐 차종을 입력해야함
car1.print_status()
car1.PowerOn()

소멸자(Destructor)

소멸자(Destructor)는 인스턴스가 소멸할때 호출되는 함수 입니다. 소멸자는 __del__ 함수 이며 인스턴스 앞에 del 을 입력하면 인스턴스가 소멸합니다.

class Car:
    # 소멸자
    def __del__(self):
        print(self.car_type, "폐차 하였습니다.")
    
    # 그 외 함수 생략

car1 = Car("람보르기니")
del car1
# car1.PowerOn() car1는 소멸했으므로 사용하면 안됨

기타

인스턴스에 type 함수를 사용하면 어떤 클래스 타입인지 알 수 있습니다.

print(type(car))

isinstance 함수를 사용하면 인스턴스의 클래스 타입을 비교할 수 있습니다.

print(isinstance(car, Car))

이상으로 클래스에 대해 정리하였습니다.