[python] python3 힘들게 배우기 #16

6 분 소요

ex40. 모듈, 클래스, 오브젝트(Module, Class, Object)

object-oriented programming language

파이썬은 bject-oriented programming language, 우리말로는 객체지향 프로그래밍 언어라고 한다. 이 말은, 파이썬은 클래스class라고 불리우는 것을 이용한 특별한 방법으로 당신의 소프트웨어를 만들게 한다는 것이다. 클래스를 이용한다면, 일관성을 유지하면서도 아주 깨끗하게 사용할 수 있다. 최소한 그것이 이론이다.

OOP를 설명하기 위해서 module과 class에 대해 설명할 예정이다.

module은? dictionary와 같다

이미 딕셔너리 자료형에 대해서는 배운 바 있다.

myDict = {'bread' : 'A staple food prepared from a dough of flour and water, usually by baking.'}
print(myDict['bread'])
A staple food prepared from a dough of flour and water, usually by baking.

위 예시에서 볼 수 있듯이, 우리는 ‘bread’라는 key값으로 그에 해당하는 value에 접근할 수 있다. key와 value값이 있고, key를 이용해 value를 이끌어 낸다는 컨셉을 머릿속에 갖고 있자.

모듈이란, 일련의 function과 variable를 갖고 있는 하나의 .py파일이다. 그리고 import 를 통해 불러들일 수 있으며, 해당 모듈 안에 있는 정보들은 .(dot)오퍼레이터를 통해 접근할 수 있다.

아래 예시를 보자. 아래와 같은 bread()함수와 bagel 변수가 있는 코드를 작성한 후, mybread.py로 저장하자.

def bread():
    print('A staple food prepared from a dough of flour and water, usually by baking.')

bagel = 'A bagel also spelled beigel, is a bread product originating in the Jewish communities of Poland.'

이후 해당 파일에 있는 bread() 함수를 사용하려면, 아래와 같이 다른 파일에서도 mybread.py파일을 import하여 함수에 접근할 수 있게 되는 것이다!

import mybread
mybread.bread() #본 파일에 bread()함수가 없더라도, import한 파일의 것을 빌려서 이용가능!

(해당 파일을 import할 때는 같은 폴더에 두거나 경로를 포함해 import 하자)

bagel 변수 역시 마찬가지로, import되는 파일에 선언되어 있다면 문제없이 빌려쓸 수 있다.

‘key’를 통해 ‘value’에 접근하는 것은 파이썬의 아주 빈번한 패턴 인 것이다.

단지 딕셔너리의 경우는 [], 모듈인 경우는 . 으로 접근하는 문법이 다를 분이다.

myDict['bread']
mybread.bread()
mybread.bagel

클래스class는 모듈과 같다!

아니 모듈은 딕셔너리랑 같다며! 결국 다 똑같은거 아니여 이거? 맞다. 다 비슷하다. 클래스도 함수들과 데이터를 grouping해서 모아놓은 집합에 지나지 않는다.

클래스 하나를 예로 들어 작성해 보자. 위에 작성한 dict, module과 똑같은 기능을 할 수 있는 class를 만들어 보겠다.

class MyBread(object): #클래스명은 대문자로 시작한다.

    def __init__(self):
      self.bagel = "A bagel also spelled beigel, is a bread product originating in the Jewish communities of Poland."

    def bread(self):
      print('A staple food prepared from a dough of flour and water, usually by baking.')

모듈에 비해 훨씬 복잡하게 느껴질 수 있지만, bread()함수를 보면 이것이 마치 미니-모듈 같다는 생각이 들 것이다. 가장 헷갈리는 건 __init()__함수와 그에 따른 bagel 변수 선언일 것이다. 일단 여기서는 bagel 이 인스턴스 변수instance variable 이라고 불리우는 것만 알고 넘어가자.

클래스와 모듈에 다른 점은 무엇일까? 이 MyBread클래스를 이용해 엄청나게 많은 복제품을 만들어낼 수 있다는 . 예시에 쓰인 예제는 이해를 돕기 위해 변수선언이나 함수가 변형불가능하게 선언 완료되어있는 형태지만, 인수argument를 통해 해당 변수값을 설정할 수 있거나 함수에 접근할 수 있다면 말이다.

반면에 모듈을 이용한다면, 해당 모듈에 있는 내용을 그대로 이용해야만 한다.

그럼 여기서 대망의 오브젝트가 뭔지 알아보도록 하자.

오브젝트object

클래스가 미니-모듈과 같은 것이라면, 모듈의 import에 해당하는 것이 클래스에도 있을 것이다. 그것을 바로 ‘인스턴스화instantiate’라고 한다. 무슨 말인고로, ‘만든다create’를 멋지게 말하는 것이다.

그리고 클래스를 인스턴스화한다는 것은 하나의 오브젝트를 만든다는 것이다. 방법은 아래와 같다.

thing = MyBread() #인스턴스화! thing이라는 object를 만들어 내었다
thing.bread()
print(thing.bagel)

인스턴스화는 마치 function을 부르는 것과 비슷해 보이지만, 내부적으로는 조금 더 복잡하게 돌아가고 있다. 어떤 일이 일어나고 있는지 한번 알아보자.

  • 파이썬은 MyBread()를 보고, 이것이 미리 정의해 놓은 class임을 깨닫는다.
  • 해당 class에 선언된 모든 function을 포함하여, 하나의 빈 오브젝트를 생성한다.
  • 파이썬은 이후 마법의 __init__ 함수가 있는 지 조사한 후, 있으면 그것을 불러서 새로 생성된 빈 오브젝트를 발동(?)시킨다.
  • MyBread 클래스에서의 __init__함수에서는, 추가 변수인 self를 받아들이는데 이것이 바로 파이썬이 만들어 준 빈 오브젝트를 말한다.self를 통해 각종 변수들을 설정할 수 있게 된다.
  • 마지막으로 이 오브젝트를 thing에 부여한다.

바로 이것이 mini-import의 정체이다. 명심해야 할 것은 이 작업은 클래스 자체를 주는 것이 아니라, 클래스를 설계도면(blue print)삼아서 복제인스턴스 를 준다는 점이다.

정리하자면,

  • 클래스는 미니모듈을 생성하는 설계도와 같다.
  • 인스턴스화는 import를 통해 미니 모듈을 만드는 것이며, 하나의 오브젝트(인스턴스)를 만든다고 한다.
  • 만들어진 미니 모듈에는 변수를 부여하여 활용할 수 있다.

클래스 만들어보기

위에서 배운 내용을 바탕으로 실제 활용가능한 클래스를 만들어 보자.

#클래스를 선언하고
class SaveList(object):

    def __init__(self, myList):
        self.input = myList

    def show(self):
        for e in self.input:
          print(e)

#변수를 선언한 후 만든 클래스를 통해 인스턴스화! SaveList라는 설계도를 통해 bread가 어떤 인스턴스인지 construct하는 것이다. 
breads = SaveList(['plain', 'bagel', 'donut'])

numbers = SaveList([1,2,3,4,5])

#클래스에 있던 함수를 수행해보자.
breads.show()

numbers.show()

실행하면?

plain
bagel
donut
1
2
3
4
5

댓글남기기