[짤막] Class

Jeong SeongYun·2022년 7월 16일
0

짤막

목록 보기
3/16
post-thumbnail

Class는 딥러닝을 할 때 없어서는 안 되는 개념입니다. 특히 Pytorch를 다룰 때 class의 개념을 모른다면 정말 손도 못 댈 지경이죠.

그만큼 중요한 개념이기에 이 기회에 한번 체크하려고 합니다.

Class 왜 필요함?

class를 설명할 때 가장 많이 나오는 비유가 쿠키를 만들 때 사용하는 쿠키틀 혹은 붕어빵틀 입니다. 예시로 나오는 것만 봐도 유추할 수 있듯이 객체를 반복해서 만들어야 할 때 class를 사용하죠. 붕어빵 틀의 결과로 나오는 붕어빵을 좀 어려워 보이는 말로 인스턴스(Instance)라고 합니다.

동시에 class 안에 여러 함수를 넣을 수도 있어서 "여러 함수의 모음"이라고 생각하셔도 될 것 같습니다.

어쨌든, Class는 그 예시에서도 필요성을 유추할 수 있듯이, 반복 작업을 여러번 수행해야 할 때 필요합니다. 딥러닝에서 train Class를 따로 만들어놓고 나중에 train(~~) 으로 그냥 학습을 시켜버리는 것처럼요!

Class의 기본 구조

class {ClassName}({상속받는 객체(없어도 됨)}) :
	def __init__ (self, param1, pram2 ... )
    	self.param1 = param1
        self.param2 = param2
        
 	def {function_name} (self, param3) :
    	

어우... 어지럽습니다. __init__은 뭐하는 녀석이고 self는 또 뭘까요?

__init__

객체를 초기화 한다는 뜻입니다. 쉽게 말해,
"이 class는 이걸이걸 사용할 거야~~!" 미리 알려주는 역할을 하죠.
왜 하필 앞과 뒤에 __ 이 붙냐구요?

Python은 기본적으로 예약함수라는 기능을 제공합니다. 이미 자체적으로 특수한 기능을 하는 여러 함수들을 많이 넣어놨죠.

그 중 하나가 __init__ 이고, 이 함수는 객체를 처음에 선언하고 초기화 시키는 역할을 합니다.

self 옆에 오는 파라미터를 class 생성시에 넣지 않으면 Error가 납니다.
self 까지 설명하고 언제 에러가 뜨고 언제 어떻게 작동 되는지를 보면 쉽게 이해하실 수 있을 겁니다.

self

__init__ 함수 아래를 보시면 self.param1 = param1로 되어있습니다. 이게 도대체 뭘 의미하는 걸까요? 하나하나 뜯어보겠습니다.

다들 아시겠지만 Python은 오른쪽의 값을 왼쪽의 것에 할당해주는 개념입니다.
'aa' = 123 이라면 123을 aa에 할당해주는 순서적 느낌이죠.

Python에서 .은 ~의 와 같습니다. 어느 class.def 라면 class의 def 이 정도의 의미죠.

즉, 이를 종합해보면
param을 self.param에 할당하는 개념이 됩니다.

여기서 self는 class를 통해 찍어낸 인스턴스 그 자체가 됩니다.

뭔 말인지 모르겠으니 예시를 들어보겠습니다.

class BoongAeoBbang() :
    def __init__ (self, menu : str, num : int) :
        self.menu = menu
        self.num = num

붕어빵을 찍어주는 class를 만들었습니다.
Type Hint로 메뉴는 문자열로, 갯수는 정수로 입력해야 한다고 개발자에게 알려줬습니다.
(Type Hint는 주석과 같은 역할일 뿐, 에러를 뜨게 하거나 제약하는 기능은 없습니다.)

joomoon = BoongAeoBbang(menu = '크림', num = 5)

그러고 이렇게 만들어준 class에 parameter로 menu와 num을 입력해주면 해당 정보가 class로 인해 생성된 Instance인 'joomoon'에 들어갑니다.

이 joomoon이 바로 위에서 말한 self가 됩니다

우리가 아까 위에서

self.menu = menu
self.num = num

으로 정의해줬습니다.
즉 여기서는 이제

joomoon.menu = '크림'
joomoon.num = 5

로 정의된 것이죠. 진짜 그런지 한번 볼까요?

joomoon = BoongAeoBbang(menu = '크림', num = 5)
print(joomoon.menu)
print(joomoon.num)

output
크림
5

이런 식으로 우리는 class를 통해 여러개 찍을 수 있는 것이죠.

Method

class 안에 있는 다른 함수들을 말합니다. 위의 class에서 함수 몇개를 추가해보겠습니다.

class BoongAeoBbang() :
    def __init__ (self, menu : str, num : int) :
        self.menu = menu
        self.num = num
        
    def change_order(self, to_this : int) :
        print(f'사장님 죄송한데 {self.num}개 말고 {to_this}개 주세요ㅠㅠ')
        self.num = to_this

손님이 주문을 변경했을 때를 가정한 change_order 함수가 추가되었습니다.
함수 안에 print()구문을 넣음으로써 함수가 호출될 때 print 내용도 같이 출력되게 해주었습니다.

그리고 self.num의 정이를 다시 to_this parameter에 들어가는 정수로 바뀌게 했죠.

joomoon.change_order(6)
print(joomoon.num)

Output
사장님 죄송한데 5개 말고 6개 주세요ㅠㅠ
6

함수가 호출되자 print로 넣었던 구문이 출력되고
joomoon.num을 호출하니 5가 아니라 6으로 바뀐 것을 확인했습니다.

이제 __init__의 역할과 self의 의미, Method의 활용이 어떻게 될 수 있는지 감이 오죠?

class는 워낙 중요하니까 class의 중요한 속성인 상속에 대해선 또 다음에 짤막하게 쓰도록 하겠습니다~

profile
물어보면 대답해줄 수 있는 데이터쟁이

0개의 댓글