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

5 분 소요

ex41. 객체지향 프로그래밍 용어의 정리

파이썬 객체지향 프로그래밍에서 자주 쓰이는 용어에 대해 정의해 보도록 하자.

용어의 정의

  • 클래스(class) 파이썬으로 하여금 새로운 형식의 뭔가를 만들도록 하는 것.
  • 오브젝트(object) 1. 가장 기본적인 형태, 2. 인스턴스.
  • 인스턴스(instance) 클래스를 만들 때 얻어지는 것.
  • 뎊(def) 클래스 안에 함수를 정의하는 방법
  • 셀프(self) 클래스 안의 함수 내부에서, 셀프는 인스턴스/오브젝트를 위해 접근될 수 있는 변수이다.
  • 상속(inheritance) 하나의 클래스가 다른 클래스에게 성질을 물려줄 수 있음.
  • 결합(composition) 하나의 클래스가 다른 클래스의 한 부분으로서 결합될 수 있다. 자동차와 바퀴의 관계와 같음.
  • 속성(attribute) 결합에서의 하위속성 클래스로서, 보통 변수이다.
  • is-a 어떤 것이 상속받을 때 쓰는 문구. ex) salmon is-a fish.(연어는 물고기의 속성을 상속받는다.)
  • has-a 어떤 것이 결합관계에 있을 때 쓰는 문구. ex) salmon has-a mouth

코드를 어떻게 읽을 것인가?

OOP에서 쓰이는 코드들을 읽는 방법을 알아보자.

  • class X(Y) Y의 상속을 받는 X라는 클래스를 만들어라.X는 Y다 라고 읽는다!!ex)사람은 동물이다. Make a class named X that is-a Y.
  • class X(object):def __init__(Self,J) 클래스 X는 selfJ를 매개변수로 갖는 __init__을 갖는다(결합).
  • class X(object):def M(self,J) 클래스 X는 selfJ를 매개변수로 갖는 M이라는 함수를 가진다.
  • foo = X() foo를 클래스 X의 인스턴스로 설정하라.
  • foo.M(J) foo에서 매개변수 selfJ와 함께 M함수를 get하라.
  • foo.K = Q foo에서 K를 get해서 Q로 설정하라.

ex42. 오브젝트와 클래스 구분하기

오브젝트와 클래스의 차이점을 구분하는 것은 아주 중요하다. 위에서 예로 든 연어와 물고기에 대해 생각해 보자. 이 둘이 진짜 다른 것인가? 실제로는 그렇지 않다. 대신에,

연어는 물고기의 종류 중에 하나다.

한 단계 더 나가 보도록 하자. 당신이 한 바켓의 연어를 갖고 있다고 하고, 각각의 연어들에 이름을 붙여본다고 가정하자. 영희, 철수, 길동 등등… 이때, ‘영희’와 ‘연어’는 어떻게 다른 것인가?

영희는 하나의 특별한 연어다. 즉 연어의 ‘인스턴스’다.

철수와 길동도 연어의 인스턴스들이다.

여기까지의 예를 다시 정리하자면, ‘물고기’는 클래스이고, ‘연어’도 클래스이다. ‘영희’는 하나의 특별한 오브젝트다.

###이 것들이 코드에서 어떻게 나타나는 지 직접 알아보도록 하자.

아래 코드에서 주석 부분을 유의하면서, 클래스 생성과 클래스 내부 구성, 인스턴스 생성 등을 지켜보자.

#동물은 object다!(헷갈린다. 계속 지켜보자)
class Animal(object):
    pass

#고양이는 동물이다!
class Cat(Animal):

    def __init__(self, name):
        # 고양이는 이름을 갖고 있다. (has-a)
        self.name = name

#개는 동물이다!
class Dog(Animal):

    def __init__(self, name):
        #개는 이름을 갖고 있다.
        self.name = name

#사람은 object다
class Person(object):

    def __init__(self, name):
        #사람은 이름을 갖고 있다.
        self.name = name

        #사람은 어떤 종류의 애완동물을 갖고 있다.
        self.pet = None

#노동자는 사람이다.
class Employee(Person):

    def __init__(self, name, salary):
      # super()는 겹치는 상속 구조시 하나의 속성을 받아쓰게 하는 건데..http://bluese05.tistory.com/5 을 참고해보자
      #Person.__init__(self, name) 으로 써도 무방하다.
      super(Employee, self).__init__(name)
      #노동자는 봉급을 갖고 있다.
      self.salary = salary

#물고기는 object다!
class Fish(object):
    pass

#연어는 물고기다.
class Salmon(Fish):
    pass

#넙치는 물고기다.
class Halibut(Fish):
    pass


# huchu는 고양이다. (클래스 생성과 같은 형식의 문장이지만, 인스턴스 만드는 부분)
huchu = Cat("Huchu")

# rover는 개다.
rover = Dog("Rover")

# michael은 사람이다.
michael = Person("Michael")

#마이클의 고양이는 후추다. (원래 None으로 설정해 놨던 pet변수에 인스턴스를 설정하자.)
michael.pet = huchu

#Frank는 연봉 5000d의 노동자다.
frank = Employee("Frank", 5000)

#Frank의 애완동물은 rover다 (Employee클래스에는 pet 변수가 없음에 주목)
frank.pet = rover


# flipper는 물고기다.
flipper = Fish()

# mary는 연어다.
mary = Salmon()

# tranks 는 넙치다.
tranks = Halibut()

class Name(object)에 대해서

파이선3에서는 클래스 이름 뒤에 (object)를 붙이지 않아도 된다. 하지만 파이선 커뮤니티에서는 명확한 것이 애매한 것보다 낫다는 믿음이 있어, 많은 파이선 전문가들이 그것을 표기한다. 하지만 붙이지 않아도 완벽하게 구동한다.

파이썬2에서는 두가지 다른 타입의 클래스가 있었다. 하지만 지금 3을 배우고 있으면서 걱정할 필요는 없다. 위에서 나온 class Name(object)는 그냥 “이것은 가장 기본적이고 간단한 클래스”라고 생각해도 무방하다.

‘explicit is better than implicit.’

댓글남기기