티스토리 뷰

상속이 필요한 이유

상속이란 것은 무엇인가를 물려받는 다는 뜻입니다. 클래스는 상속이라는 개념을 가지고 있습니다. 누구한테서 무엇을 물려받을까요?

class Car:
    def countWheels(self, wheel):
        print("my wheels is", wheel)

class Bmw(Car):
    def whatColor(self, color):
        print("my color is", color)

car1 = Bmw()
car1.countWheels(4) #my wheels is 4
car1.whatColor("balck") #my color is balck


클래스 Car와 Bmw를 정의했습니다. Bmw를 정의할 때 괄호에 Car라는 클래스명을 적어줬습니다. 이런식으로 적어주면 상속이 일어납니다. 상속을 받는 쪽이 자식, 상속하는 쪽이 부모클래스(슈퍼클래스)라고 표현합니다. 상속을 "누구"한테서 받냐는 질문에는 이제 답할 수 있습니다. 상속은 부모한테서 받습니다. 그럼 무엇을 받을까요? 이제 그 밑에 코드들을 같이 볼까요. car1이라는 Bmw의 인스턴스를 만들고 ca1에 메소드들을 실행해보았습니다. 중요한건 Bmw에는 직접 정의한 적이 없는 countWheels()라는 메소드를 car1이 사용한다는 것입니다. 즉 상속받았기 때문에 부모 클래스에 정의되어 있는 메소드나 프로퍼티를 사용할 수 있다는 것입니다.


상속은 부모 클래스한테서 메소드와 프로퍼티를 물려받습니다.


"왜 상속이 필요할까요?" 라는 질문에 대해서 좀 더 고민해볼까요. 함수를 배울 때 반복해야할 것이 있으면 함수로 정의해서 여러 편의성을 얻을 수 있었습니다. 반복되는 내용이 많으면 코드만 길어지고, 불편해지는 등 단점이 아주 많습니다. 그렇다면 클래스에서도 똑같지 않을까요? Car에 있는 countWheels라는 메소드를 Bmw에도 똑같이 정의하지 말고, 상속을 받아서 사용하면 반복할 필요도 없습니다. 더 편하기까지 하구요. 상속이 필요한 이유는 이런 것들이 아닐까요.

클래스의 오버라이딩

오버라이딩은 덮어쓴다는 것입니다. countWheels(4)라는 메소드를 실행시키면 "my wheels is 4"라는 구문이 나옵니다. bmw는 더 멋있게 "4 wheels"라고 나오게 하고 싶어한다면 어떻게 해야할까요? 덮어쓰면 됩니다. 즉 자식 클래스에 똑같은 메소드를 정의하면 메소드를 실행했을 때 이제 자식 클래스에 정의된 메소드가 나오게 되는 것입니다.


class Car:
    def countWheels(self, wheel):
        print("my wheels is", wheel)

class Bmw(Car):
    def whatColor(self, color):
        print("my color is", color)
    def countWheels(self, wheel):
        print(wheel, "wheels.")

car1 = Bmw()
car1.countWheels(4) #4 wheels


오버라이딩을 통해서 똑같은 이름의 다른 메소드를 사용할 수 있게 되었습니다.

부모클래스에 접근할 수 있는 super() 메소드

위에서 배운 것들을 __init__메소드로 다시 적용시켜보겠습니다.

class Car: def __init__(self, wheels): self.wheel = wheels class Bmw(Car): def __init__(self, wheels, color): self.color = color car1 = Bmw(4, "black") car1.wheel


위의 소스코드는 에러가 날까요 안 날까요? Car라는 클래스에 wheel이라는 프로퍼티가 정의되어 있고, Bmw클래스는 Car를 상속받았습니다. 하지만 에러가 납니다. __init__이 오버라이딩 되었기 때문에 Car의 생성자는 실행되지 않기 때문입니다. 이런 경우엔 Bmw에 다시 정의해줘야 합니다. 이럴 때 사용하는 것이 super() 메소드입니다.


class Car:
    def __init__(self, wheels):
        self.wheel = wheels

class Bmw(Car):
    def __init__(self, wheels, color):
        super().__init__(wheels)
        self.color = color

car1 = Bmw(4, "black")
car1.wheel #4


super()는 부모클래스에 접근할 수 있게 해줍니다. 그래서 super().__init__()은 부모클래스의 생성자를 실행합니다. wheels라는 인수를 전달하면 이제 car1.wheel이라고 치면 4라는 값을 반환합니다.


기존 메소드를 수정하려고 해도 super().메소드를 부모 클래스의 메소드를 불러오시면 됩니다. 



다음 포스팅에서는 모듈을 불러오는 방법에 대해서 다룰 예정입니다. 다른 모듈을 불러올 수 있는 것 까지 배운다면 이제는 재미있는 것들을 만들어볼 수 있겠군요.



공감은 제작자에게 큰 힘이 됩니다.


'Backend-dev > python' 카테고리의 다른 글

파이썬 예외처리를 알아봅시다.  (0) 2018.04.19
파이썬의 모듈을 불러오는 방법과 pip  (0) 2018.04.11
파이썬의 클래스(class)  (0) 2018.04.09
파이썬의 유효범위(scope)  (0) 2018.04.07
파이썬의 함수  (1) 2018.04.06
댓글