[Python] 객체지향프로그래밍 - OOP (Object Orientated Programming)

1. [Python] 객체지향프로그래밍 - OOP (Object Orientated Programming)

Object Orientated Programming in Python

https://www.youtube.com/watch?v=JeznW_7DlB0 를 참고하여 작성하였습니다.

모든 Python의 구현은 Class의 Instance인 Object로 이루어집니다.

1.1. 오버로딩 / 오버라이딩

  • 오버로딩 : 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개 변수의 개수나 타입이 다르면 다르게 정의되는 것을 의미합니다.
  • 오버라이딩 : 상속관계에 있는 부모클래스에서 이미 정의된 메소드를 자식클래스에서 같은 시그니쳐를 갖는 메소드로 재정의하는 것을 의미합니다.

1.2. 특수한 메서드

파이썬에는 내장된 많은 자료형들에, 해당하는 자료형에 대한 연산을 정의하는 메소드들이 있습니다.

그 메소드들은 메소드의 이름 앞뒤에 __ (double underscore)를 지니고 있습니다.

이런 것처럼 사용자는 특장 클래스가 기능할 수 있는 특수한 메서드를 만들 수 있습니다.

이 중 두가지만 알아보겠습니다.

  • __init__

    생성자 : 클래스 생성시 자동으로 실행되는 메서드입니다.

  • __str__

    객체 자체로 호출하는 메서드 : 클래스 자체의 내용을 출력할 때 형식을 지정하는 메서드입니다.

아래 예제는 이 두가지 메서드가 구현된 Pet 클래스 예제입니다.

class Pet():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'name : {self.name}, age : {self.age}'

my_pet = Pet('Happy', 1)
print(my_pet)
# name : Happy, age : 1

1.3. 상속 / 오버라이딩 OOP 예제

상속과 오버라이딩을 포함한 아래의 OOP 예제를 통해 보며 이해해보면 도움이 될 것입니다.

class Pet():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'name : {self.name}, age : {self.age}'

    def show(self):
        print(f'I am {self.name} and I am {self.age} years old')

    def speak(self):
        print("I don't know what I say")

class Cat(Pet):
    # 상속받는 클래스의 메서드를 그대로 복붙해도 되지만 이렇게 구현해줄 수 있습니다.
    # 복붙하는 것과 같은 동작은 아닙니다.
    # 1. 복붙할 경우(self.name = name, self.age = age), Cat의 attribute로 name과 age가 생겨 대입됩니다.
    # 2. super()로 부모 메서드를 사용할 경우 Pet의 attribute로 name과 age가 생겨 대입됩니다.
    def __init__(self, name, age, color):
        super().__init__(name, age)
        self.color = color

    def speak(self):
        print("Meow")

    def show(self):
        print(f"I am {self.name} and I am {self.age} and I am {self.color}")

    def __str__(self):
        return f'이름 : {self.name}, 나이 : {self.age}, 색깔 : {self.color}'

class Dog(Pet):
    def speak(self):
        print("Bark")

my_pet = Pet('Happy', 1)
print(my_pet)
# name : Happy, age : 1

kitty = Cat("kitty", 10, 'yellow')
print(kitty)
# 이름 : kitty, 나이 : 10, 색깔 : yellow
  • self : 넘겨받은 self를 이용해서 method에서 attribute에 생성자로 넘겨받은 데이터를 대입해줄 수 있습니다.
    • 각 method에 self를 인자로 넘겨서 method가 method를 사용하는 object의 attribute에 접근할 수 있도록 해주는 것입니다.