본문 바로가기

[일상봇 만들기] 나의 하루하루를 도와줄 친구!

level_04_part_1

 

Level

04

01_클래스, 메소드, 그리고 모듈

 

 

 

 

 0_이미 알고 있던 것

 

1) 붕어빵과 천원 한 장.

 

단팔 붕어빵은 밀가루 반죽 안에 팥을 넣고 틀에 익혀내는 것 입니다.

슈크림 붕어빵은 밀가루 반죽 안에 슈크림을 넣고 틀에 익혀내는 것이죠.

흑임자 붕어빵은 밀가루 반죽에 흑임자 가루를 섞어 틀에 익혀냅니다.

 

같은 단팥 붕어빵이라도 가게마다, 사장님의 반죽 비율에 따라 그때그때 조금씩 다릅니다.

 

그.러.나

위 모든 것들은 전부 우리가 '붕어빵' 이라고 호칭하죠.

 

 

천 원짜리 한 장은 여러 가지 형태가 있습니다.

메모를 적어놓아도, 모서리가 찢어져있거나 해도

오든 경우에 대해 우리는 전부 '천 원짜리 한 장' 이라고 부릅니다.

 

 

클래스(class) 라는 단어를 사전에서 검색해보면

학교의 반 또는 수업 을 의미하기도 하지만

 

'부류' 또는 '종류' 를 의미하는, 학급이나 수업 보다도 더 근본적인 의미가 있습니다.

 

붕어빵 반죽에 뭐가 섞이건 안에 팥이 아닌 다른게 들어가건 할 것 없이

전부 같은 부류인 '붕어빵' 이라는 그룹으로 묶여있다는 것입니다.

 

클래스 라는 것은 결국

'부류' 나 '종류' 를 의미합니다.

 

우리는 지금까지 자료형, 함수와 같은 것들을 사용했었는데요

그러면 이 붕어빵에서의 클래스 개념을 파이썬에서 어떻게 적용시켜 볼 수 있을 지 알아봅시다.

 

 

 

2) 우리가 지금까지 사용하던 것들은 사실 클래스 입니다.

이미 여러 번 사용해보았던 숫자, 문자열, 그리고 함수도 예로 들어볼까요?

 

예)

a = 10

b = 'Hello'

def  multiply(a, b):

    c = a * b

    return c



print(type(a))

print(type(b))

print(type(multiply))

[코드 실행시 아래와 같은 결과가 나오게 됩니다.]

<class 'int'>

<class 'string'>

<class 'function'>

 

type() 은 함수 안에 판별하고자 하는 것을 넣으면

그것이 어떤 형태(종류, 부류)의 것인지 판별해주는 내장함수 입니다.

 

정수형인 int, 문자열인 string, 함수인 function 인 것이죠.

 

a, b, 그리고 multiply 는 각기 다른 형태(종류, 부류)의 것이기 때문에

서로 다른 클래스 입니다.

 

그렇다면, 같은 종류인 문자열이지만 다른 값이 들어있는 것을 볼까요?

 

예)

a = 'Hello'

b = 'World!'



print(type(a))

print(type(b))

 

[코드 실행시 아래와 같은 결과가 나옵니다.]

<class 'string'>

<class 'string'>

 

서로 다른 값을 갖고 있는 변수 a 와 b 이지만, 같은 종류인 '문자열' 입니다.

 

단팥 붕어빵과 슈크림 붕어빵은 당연히 맛이 다를 겁니다.

하지만 우리는 그 둘을 '붕어빵' 이라는 분류로 통틀어 칭하는 것처럼

 

a 와 b 는 서로 근본이 같은 '문자열 클래스' 인 것입니다.

 

 

 

 

1_ 이제는 직접 만들어보자.

함수를 만들 때 def 를 사용했었죠?

클래스는 class 를 사용해서 만드는데, 함수를 만드는 과정과 거의 유사합니다.

 

===========================

함수를 만드는 방법과 여기까지 동일해요!



def 이름():

    들여쓰기 된 부분



class 이름()

    들여쓰기 된 부분

===========================

 

1) 클래스는 '정보를 저장하는 기능' 이 있습니다.

 

클래스 안에는 함수들을 만들 수 있고, 가장 기초가 되는 __init__ 이라는 함수를 알아볼게요.

이 특별한 이름을 가진 __init__ 함수는, 클래스가 만들어질 때 한 번 실행됩니다.

그리고, 클래스를 만들 때 입력값을 받는 역할을 수행합니다.

 

[가장 처음 단계에서는 self 라는 것을 무시한 상태에서 코드를 보겠습니다.]

 

예)

class calculator(): 
    def __init__(self, new_data): 
        self.stored = new_data



a = calculator(10)    # 10 이라는 값을 calculator 클래스에 소속되게 만들어 a 라는 변수에 넣었습니다.

                           #  클래스가 만들어질 때 __init__ 함수가 실행되어 self.stored 이름으로 저장됩니다.

print(a.stored)         # 클래스 뒤에 . 을 넣으면, 그 안에 들어있는 것을 가져올 수 있게 됩니다. 

                           # 지금의 경우는, self.stored 이름으로 저장된 값을 불러왔습니다.

                           # 저장한 값인 10 이 나옵니다.





# 이제 우리가 다루었던 기초문법을 클래스를 이용하여 알아보면 다음과 같습니다.

sample = 10    # int 클래스에 소속된 10 이라는 값을 만들어 sample 변수에 넣었습니다.

 

 

정수 클래스를 우리가 만들어 본 클래스와 비교해본다면

1) 만드는 방법이 간단합니다.

2) 조회하는 방법이 간단합니다.

 

이는 사람들이 많이 사용하는 것이기 때문에 단계와 절차를 간편하게 바꾼 것 뿐입니다! 

 

 

 

 

 

 

2) 내장된 함수? 내장함수? 메소드!

 

클래스는 저장된 정보를 다루기 위해 내장된 함수들이 있습니다.

 

우리가 지금까지 해왔던...

requests.get()

dictionary.keys()

와 같은 것들은 전부 해당 클래스 안에 내장되어있는 내장함수를 실행했던 것이죠.

 

여기서 용어를 하나 소개하겠습니다.

메소드(method) 라고 하는 것입니다.

 

이는 '방법' 을 뜻하는 영어단어입니다.

해당 클래스에 대해 특정한 '방법' 을 수행하는 것이지요.

 

백문이 불여일타 라고 하지요?

한 번 만들어서 써보겠습니다.

 

 예)

 

class calculator(): 
     
    def __init__(self, my_type): 
        self.my_type = my_type 
         
    def plus(self, plus_value): 
        self.my_type = self.my_type + plus_value 
        print(self.my_type) 
         
    def minus(self, minus_value): 
        self.my_type = self.my_type - minus_value 
        print(self.my_type) 
         
    def multiply(self, multi): 
        self.my_type = self.my_type * multi 
        print(self.my_type) 
         
    def divide(self, sub): 
        self.my_type = self.my_type / sub 
        print(self.my_type)





a = calculator(10)    # 10 이라는 값으로 calculator 클래스를 만들고, 이것을 a 라는 변수에 넣었습니다.
b = calculator(5)     # 5 라는 값으로 calculator 클래스를 만들고, 이것을 b 라는 변수에 넣었습니다.

a.plus(4)                # calculator 클래스인 a에, 해당 클래스의 plus 메소드(내장된 함수) 를 사용하였습니다.
b.minus(7)             # calculator 클래스인 b에, 해당 클래스의 minus 메소드(내장된 함수) 를 사용하였습니다.



지금까지 변수 뒤에 점을 찍고 사용했던 모든 내장함수들은 

사실 해당 클래스의 '메소드' 이었던 것입니다.

 

기존 시간에 문자열과 리스트가 얼마나 유사한지를 보았었는데요,

문자열과 리스트는 서로 다른 클래스입니다.

 

클래스가 다르면, 안에 들어있는 메소드들도 당연히 다르겠지요?

클래스 내부를 알아보는 방법 은 여러 가지가 있는데, 일단 가장 간단한 방법 2 가지를 알아볼게요.

 

예)

a = [1, 3, 5]

b = 'Hello'



print(dir(a))

print(dir(b))



# dir() 내장함수는 클래스를 입력값으로 받아서, 해당 클래스에 어떤 메소드들이 있는지 보여줍니다.

# 여기에서 __ 로 시작하여 __ 로 끝나는 것들은, 현재 단계에서 대부분 몰라도 되는 부분입니다.



# 두 번째 방법은 코드를 실행시켜 확인하는 것이 아닙니다.

# 점을 찍고나서 키보드의 tab(탭) 을 누르는 것이죠.

a.

b.

 

 

 

 

3) 바텀-업과 탑-다운!

 

가장 기초가 되는 부분부터 시작해서 한 단계씩 쌓아올리는 것을 바텀-업 이라고 하고,

이미 완성되어 있는 것으로부터 한 단계씩 분해하면서 내려가는 것을 탑-다운 이라고 합니다.

 

우리가 메소드에 대해 자세히 알아보는 방법도, 이처럼 두 가지 방법이 있는데요

 

 

[바텀-업]

help() 이라는 파이썬 기본 내장함수를 사용하면 메소드의 가장 기본적인 사용법을 알 수 있습니다.

 

우리는 dir() 으로 메소드들이 어떤 것들이 있는지를 알아보았었는데요

help()는 메소드들 하나하나 마다 어떤 입력값을 넣어주어야 하고, 어떤 값이 기본값인지에 대한 정보를 보여줍니다.

 

이는 도큐먼트(document), 또는 '공식문서' 라고 부르기도 합니다.

여기서 보여지는 내용들은 공식 홈페이지에서 구할 수 있는 내용과 동일하기 때문이죠.

 

 

[탑-다운]

사용하고자 하는 메소드를 구글에 검색하면 전 세계의 많은 사람들이 이미 만들어 둔,

해당 메소드를 사용해 만든 완성된 코드들을 볼 수 있습니다.

 

지난 시간에 BeautifulSoup 을 사용해 보았는데요

구글에 이 키워드로 검색하면 이 라이브러리를 사용해 만들어진,

그리고 잘 돌아가는(매우 중요함!) 코드를 접할 수 있습니다.

 

운이 좋다면, 내가 원하는 기능이 전부 완성되어 있고

필요 없는 부분만 지우면 사용할 수 있는 경우도 있어요.

 

난 코딩을 한 줄도 하지 않았는데도 코드가 완성되는 마술!

현대사회에서 가장 강력한 코딩 도구는 단연컨데 '북붙' 입니다.

 

 

 

 

 

 

 

 

'[일상봇 만들기] 나의 하루하루를 도와줄 친구!' 카테고리의 다른 글

level_04_part_3  (0) 2019.07.23
level_04_part_2  (0) 2019.07.09
level_03_part_2  (0) 2019.07.03
level_03_part_1  (0) 2019.07.02
level_02_part_2  (0) 2019.06.24