TIL) Python Class Method

Jiwon Lee·2022년 9월 4일
0

Class

  • class는 '부류'라는 의미를 지니고 있다. '부류'의 사전적 정의는
"동일한 범주에 속하는 대상들을 일정한 기준에 따라 나누어 놓은 갈래"

라고 한다.
즉, 공통점이 많은 것들을 가리켜 '동일한 부류'라고 하는 것이다.

예를 들어, 카페에 갔다고 치자. 메뉴판에 있는 메뉴들은 거의 '음료'에 해당하는 '마실 것'이 메인일 것이다. 아메리카노, 라떼, 자몽에이드, 초코 프라푸치노 등의 메뉴가 하나의 공통점을 지닌 '부류'로 묶이는 것이다.

위의 예시에서 class는 '음료'가 되는 것을 눈치 챘을 것이다.
그러나, '음료'는 개념 일 뿐, '음료'의 실체(instance)는 아메리카노, 라떼, 자몽에이드, 초코 프라푸치노 이다.
이 실체(instance)를 객체(object)라고 한다.

class 정의하기

이제 앞서 얘기했던 '음료'에 대한 클래스를 python 코드로 구현해보자.

먼저는 class가 정의되어야 한다. 파이썬에서 class를 선언하기 위해서는 다음과 같이 class 키워드를 사용하면 된다.

class Drink:
	pass

class가 정의되면, class로 부터 실체화(instantiate)를 할 수 있다. 말이 어렵지, 실체화를 하는 방법은 생각 보다 간단하다. 함수를 호출하듯, 클래스도 호출하면 된다.
americano = Drink()
latte = Drink()
  • Drink class를 실체(instance)화한 것이 americano, latte라는 객체(object)인 것이다.

그러나, Drink class는 아직 아무 것도 안하는 비어있는 class이다.
앞서 class는 '부류'라고 얘기했다. 그리고 '부류'란 어떠한 공통점을 가지고 있는 것을 이야기한다고 했다.
즉, 우리는 '공통점'을 중점으로 봐야한다는 것이다. 음료라고 한다면, 음료에 대한 카테고리는 무엇인지, 음료의 이름은 무엇인지, 가격은 얼마인지에 대한 것이 요소가 될 수 있는 것이다.
이러한 공통 요소들을 class에서 정의를 해줘야 한다.

class의 attribute(속성)

class에 정의되는 공통 요소들을 전문어로 attribute(속성)이라고 한다.
위에서 예시를 들었듯, 음료에는 다음과 같은 공통된 요소들을 지니고 있다.

  • category (coffee, ade, frappuccino등)
  • name (americano, grapefruit ade, choco frappuccino등)
  • price (4500, 5200, 5800등)

위의 3개의 속성들을 class에서 정의하기 위해서는 다음과 같이 __init__ 함수를 통해서 정의해주면 된다.

  • 참고로 class 안에서 정의하는 함수는 function이라고 하지 않고, method라고 한다.
class Drink:
	def __init__(self, category, name, price):
    	self.category = category
        self.name	  = name
        self.price    = price

__init__ 메소드는 좌우에 언더바가 2개가 있다. 이런 메소드들을 'special method'라고 한다. 그 중 __init__ method는 class가 실체화 될 때에 사용되는 함수이다.

흥미로운 점은, __init__ 메소드의 parameter는 총 4개인데, class를 실체화할 때에는 3개만 넘겨준 점이다. 이 'self' parameter는 뭘까?

self parameter

self의 뜻은 바로 '자신'이다. 즉, class의 실체(instance)인 객체(object)를 가르킨다. 그러므로 여기서 Drink의 class에서 'self'는 Drink class의 객체인 'americano'나 'grapefruit ade'를 가르키는 것이다.
그리고 클래스를 실체화할 때에 파이썬이 해당 객체(self)를 자동으로 __init__함수에 넘겨준다.

  • __init__ 메소드는 클래스가 실체화 될 때 자동으로 호출이 된다.
  • __init__ 메소드의 'self'파라미터는 클래스가 실체화된 객체를 넘겨주어야 하며, 파이썬이 자동으로 넘겨준다.
  • __init__ 메소드의 'self'파라미터는 항상 정의되어 있어야 하며, 맨 처음 파라미터로 정의되어야 한다. (그래야 파이썬이 알아서 넘겨줄 수 있으므로)

이제, __init__ 메소드 안의 코드를 살펴보자.

class Drink:
	def __init__(self, category, name, price):
    	self.category = category
        self.name	  = name
        self.price    = price

parameter로 넘겨진 'category', 'name', 'price' 값을 동일한 이름으로 'self'에 저장하는 것을 볼 수 있다. 이유는, 나중에 다른 메소드에서 사용하기 위해서 객체에 저장하는 것이다.

Class Method

클래스에서는 __init__ 메소드 이외에 다른 메소드를 원하는 대로 추가할 수 있다.

Method와 Attribute의 차이는 명사와 동사의 차이라고 생각하면 된다.

Attribute(속성)은 해당 객체의 이름 등의 정해진 성질인 반면, 메소드는 'Like', 'eat'등 객체가 행할 수 있는 어떠한 '행위' 같은 느낌이라고 설명할 수 있다.
그럼, Drink로 할 수 있는 '행위'로 주문하다 를 메소드로 추가해보려고 한다.

class Drink:
	def __init__(self, category, name, price):
    	self.category = category
        self.name	  = name
        self.price    = price
        
    def order(self):
    	return "저 이거 주세여"

'order'메소드에도 'self'가 들어가 있는 걸 알 수 있듯, 모든 메소드에는 'self'파라미터가 첫번재 파라미터로 들어가야 한다.
'order'함수는 다음 처럼 사용할 수 있다.

americano = Drink("coffee", "americano", 4500):
americano.order()
>>>"저 이거 주세여"

이렇게 객체에서 메소드를 사용할 때에는, (.)마침표를 사용하여 객체를 호출한다. 즉,

<객체>.<메소드>

이렇게 사용할 수 있고, <객체>.<속성>도 가능하다.


만약, 리턴값에 해당 메뉴의 이름을 넣어 주문하고 싶다면 어떻게 해야할까?
__init__ 메소드에서 'self'객체에 해당하는 정보들을 저장해놓았기 때문에, 아래와 같이 사용하면 된다.

class Drink:
	def __init__(self, category, name, price):
    	self.category = category
        self.name	  = name
        self.price    = price
        
    def order(self):
    	return f"저 '{self.name}' 이거 주세여"
americano = Drink("coffee", "americano", 4500)
americano.Drink()
>>>"저 'americano' 이거 주세여"

이렇게, 코드를 클래스 위주로 작성하는 것을 "Object Oriented Programming(객체 지향 프로그래밍)", 줄여서 "OOP"라고 한다.

0개의 댓글