파이썬/파이썬(python) 중급

[21-4 파이썬] 클래스 상속 class inheritance

Olivia-BlackCherry 2022. 8. 31. 17:54

이번 시간에는 클래스 상속에 대해 알아본다. 

(복습: 객체에 속성, 메소드 만드는 방법? ----->클릭)

(복습: 클래스란? ----->클릭)

 

 

1. 클래스 복습!

이전에 백종원 사장님의 예를 들었으니, 

계속 이어서 이야기를 풀어보도록 하겠다. 

백종원 사장님이 수많은 음식점 프랜차이즈를 가지고 있는 것은 

'음식점'에 대한 청사진(▶클래스)이 있었기 때문이다.

종업원을 관리하는 방법, 손님을 관리하는 방법, 청소를 하는 방법(▶매소드)와

의자, 식탁, 주방용기, 가스레인지(속성)는

중식당, 한식당, 이탈리안 식당 등 어떤 음식점을 차리든 동일하게 적용되었다.

만드는 과정이 쉽고 빠르다.

 

백종원 사장은 Food 클래스로 서로 다른 객체를 많이 많이 만들어 대박이 났다...!!

그 객체들이 우리가 아는 

새마을회관, 역전우동, 홍콩반점 등이다.

그렇게 백종원 사장은 음식점 업계의 대부라고 불리게 되었다......

 

2. 클래스 상속을 하는 이유

그런데 음식점 가게를 너무 많이 내다보니

이번에는, 

사업을 확장해서 완전히 다른 분야에 진출하고 싶다.

카페, 가구점, 학원 같은 다른 분야 말이다.

 

먼저 같은 방법으로 Food 클래스에서 객체를 생성해보았다.

이 방법도 나쁘지는 않지만..

 

음식점과는 아무래도 성격이 많이 다르다 보니,

객체를 생성할 때마다

그 가게에 맞는 속성이나 매소드를

추가해주어야 하니,

같은 일을 반복하게 되어 효율이 떨어진다.

 

또 먼 미래를 생각해보면,

Food 클래스에서 사업을 확장했던 것처럼

유사한 방법으로 프랜차이즈를 내려면

아예 다른 청사진을 만들어 놓는 편이 좋을 것 같다고 판단한다.

 

똑똑한 백종원 사장님은

카페, 가구점, 학원의 청사진(▶클래스)도 만들어야겠다고 결심한다.

 

 

Food 클래스에서 상속하여  Cafe, Chair, Academy  클래스를 만듬

그런데 시간을 절약하기 위해,

Food class에 있는 메소드와 속성은 그대로 물려받되, 

해당 분야와 관련한 특별한 메소드와 속성만 추가하기로 한다.

 

여기서 

Food class에 있는 메소드와 속성을 그대로 물려받는 것을 

상속(inheritance)이라고 한다.

출처:위키피디아

우선 물려받는다는 것(=상속)의 의미를  생각해보자.

엄마, 아빠에게 자식이 유전자를 물려받는다고 하면

 

눈, 코, 입, 피부(▶속성)를 물려받을 수도 있고

웃는 표정, 생각하는 방법, 성실한 행동, 요리를 하는 방법(▶메소드)을 물려받을 수도 있다.

 

그런데 나는 엄마, 아빠와 완전 똑같지 않다.

 

비록 전체적인 부분은 비슷할지 몰라도 

부모의 속성, 메소드와는 차별화된

나만의 특성을 갖는다.

 

즉,

상속받은 클래스의 속성, 메소드에서 다른 것이 +더해지거나

기존의 것이 - 빠질 수도 있다. 

 

다시 본론으로 돌아가 보자.

 

백종원 사장님은  Food 클래스를 가지고 있다.

이 클래스를 가지고 Cafe, Chair, Academy 클래스를 만들 것이다.

'상속'의 개념을 이용해서 말이다. 

 

 

의자가게를 살펴보자.

의자가게는 Food클래스의 매소드와 속성은 그대로 상속받고,

의자를 수입하는 방법 메소드와 디자인샘플, 전화번호 속성을 추가했다. 

이런 새로운 청사진을 만들고 나면 관련 객체를 생성하기가 한결 편해진다. 

현대리바트 = Chair()

삼익가구 = Chair()

모던하우스 = Chair()처럼 말이다.

 

이처럼 상속은 내가 만들었거나, 다른 사람이 만든 클래스를 그대로 가져와서

내 입맛에 맞게 수정할 수 있다.

기존 클래스를 또 만드느라 걸리는 시간을 줄이고

효율적으로 코드를 작성할 수 있다.

 

3. 상속 클래스 만드는 방법

class Food:
    def __init__(self):
        self.chair = 4
        self.table = 5
        
    def manage_crew(self):
        pass
        
    def service_to_customer(self):
        pass
        
    def clean(self):
        print("청소하기")

Food 클래스의 코드는 위와 같다.

 

 

1. 클래스 선언하기
2. 상속받을 클래스명 적기
3. ( ) 괄호 안에, 상속해주는 클래스명 적기
class Chair(Food):

 

 

4. __init__ 함수 정의하기
5. super().init()     <------상속받은 클래스의 속성, 메소드를 그대로 가져온다는 것
6. 새롭게 추가되는 속성 적기
class Chair(Food):
    def __init__(self):
        super().__init__()
        self.designsample = 5
        self.phone_number = "010-0000-0000"

여기서 super은 상위 클래스, 즉 상속받은 클래스를 뜻한다. 

우리가 어렸을 때 엄마, 아빠를 슈퍼맨이라고 여겼듯이..^^

 

여기서 super().__init__()의 의미는

수퍼 클래스 Food에서 초기화했던 속성, 메소드들을 

상속받은 Chair 클래스에서도 똑같이 적용한다는 것이다.

 

즉, 상위 클래스의 속성, 메소드를 그대로 가져온다.

 

7. 새롭게 추가되는 함수 정의하기
class Chair(Food):
    def __init__(self):
        super().__init__()
        self.designsample = 5
        self.phone_number = "010-0000-0000"
        
    def make_chair():
        print("의자를 어떻게 만들까?")

 

만약 기존 상위 클래스의 매소드를 수정하고 싶다면

8. 하위 클래스에 새로운 메소드 정의하기
9. super(). 상속받은 메소드명 적기
10. 내용 적기
class Food:
    def __init__(self):
        self.chair = 4
        self.table = 5
        
    def manage_crew(self):
        pass
        
    def service_to_customer(self):
        pass
        
    def clean(self):
        print("청소하기")
class Chair(Food):
    def __init__(self):
        super().__init__()
        self.designsample = 5
        self.phone_number = "010-0000-0000"
        
    def make_chair():
        print("의자를 어떻게 만들까?")
        
    def clean():
        super().clean()
        print("의자를 물티슈로 닦는다.")

이렇게 되면 

나중에 Chair 클래스의 객체에서 clean 메서드를 호출하면

상속받은 내용인 "청소하기"와

추가된 내용인 "의자를 물티슈로 닦는다." 두 개가 나온다.