본문 바로가기

Study/class note

python / 클래스(상속)

054 클래스 상속 이해하기

클래스를 이용해서 코드를 작성하게 되면 장점? 

1. 상속

2. 같은 코드를 여러번 나열하지 않아도 됨

 > 코드가 간결해짐

ex) 우리도 처음에는 커피 키오스크를 하나의 코드 안에서 키오스크 기능들을 하나씩 구현하면서 코드를 늘려나감. 점점 기능이 많아지면서 코드가 길어지게 되었음. 클래스로 구성을 해서 코드를 정리함.

 

* 커피 키오스크 코드의 기능 

- 주문

- 메뉴판 이미지 시각화

- 매출 정산

- 쿠폰적립

 

위의 기능들중에서 이미지 시각화 기능은 클래스 코드 내에서 여러번 반복되어서 수행되어야 하는데 그럴때 함수로 만들어놓게 되면 함수를 호출하기만 하면 됨.

> 나중에 머신러닝 기능 함수를 추가하기만 하면 됨(+음성인식 기능도 음성인식 함수만 클래스에 추가하면 됨)

 

새로운 기능들이 생길때 클래스(설계도)에 추가만 하면 됨

 

* 함수 생성시 주의사항 2가지

1. 재사용 가능

2. 기능은 한가지만 부여할 것

 

보통 관리자가 클래스를 만들고 실무자가 클래스를 상속 받아 코드를 작성함. 

ex) 카드 만들기

1. 관리자가 카드의 주요기능을 담고 있는 Card() 클래스를 생성

 카드의 주요기능 3가지 : 카드가 발급되었을때 0원으로 설정하는 기능, 카드 충전기능, 카드를 사용하는 기능

class Card():
    def __init__(self):
        self.cash = 0
        print('카드가 발급되었습니다.', self.cash,'원이 있습니다.')
        
    def charge(self, num):
        self.cash = num
        print('%d원이 충전되었습니다.'%self.cash)
        
    def consume(self,num):
        if self.cash < num:
            print('충전이 필요합니다.')
        else:
            self.cash -= num
            print('%d원이 사용되었습니다.'%num)
            print('잔액은 %d원 입니다.'%self.cash)

 2. 실무자 Card()클래스를 상속받아 영화 할인카드를 만듦

# 클래스 상속받는 방법
#class 클래스 이름( 상속받을 클래스 이름):
#    함수 작성

class Movie_Card( Card ):
    pass                   # 일단 함수를 추가하지 않고 Card 클래스를 그대로 받기만 함.
    
m_card1 = Movie_Card()     # Card 클래스를 상속받아 잘 생성됨.
m_card1.charge(10000)      # 주요 기능 확인
m_card1.consume(2000)

클래스를 상속받았으므로 처음부터 기능을 코딩하지 않아도 됨. 이후의 기능들에 대해서만 코딩하면 됨.

 

3. 영화할인 코드를 작성

class Movie_Card(Card):      # 부모에게서 모든 변수와 함수를 상속받음
    def consume(self, num, place):    # 부모에게서 받은 consume함수를
        if place == '영화관':         # 내가 만든 함수로 덮어쓰기(overriding)
            num = 0.9*num         # 영화관에서 사용할 경우 10% 할인
            if self.cash >= num:
                self.cash -= num
                print(place,'에서',num,'원이 사용되었습니다.')
            else:
                print('잔액이 부족합니다.')
        else:                     # 영화관이 아닌 경우
            if self.cash >= num:
                self.cash -= num
                print(place,'에서',num,'원이 사용되었습니다.')
            else:
                print('잔액이 부족합니다.')

 

문제201. 위의 영화할인 카드에 할인 장소를 추가해서 주유소에서도 10% 할인될 수 있도록 코드를 수정하시오.

class Movie_Card(Card):      
    def consume(self, num, place): 
        if place in ('영화관', '주유소'):     
            num = 0.9*num         # 영화관, 주유소에서 사용할 경우 10% 할인
            if self.cash >= num:
                self.cash -= num
                print(place,'에서',int(num),'원이 사용되었습니다.')
            else:
                print('잔액이 부족합니다.')
        else:                     # 영화관이 아닌 경우
            if self.cash >= num:
                self.cash -= num
                print(place,'에서',num,'원이 사용되었습니다.')
            else:
                print('잔액이 부족합니다.')

문제202. 스타벅스에서 사용하면 20% 할인하는 카드 설계도를 생성하시오.

class StarBucks_Card(Card):      
    def consume(self, num, place): 
        if place == '스타벅스':     
            num = 0.8*num         # 스타벅스에서 사용할 경우 20% 할인
            if self.cash >= num:
                self.cash -= num
                print(place,'에서',int(num),'원이 사용되었습니다.')
            else:
                print('잔액이 부족합니다.')
        else:                     # 할인처가 아닌 경우
            if self.cash >= num:
                self.cash -= num
                print(place,'에서',num,'원이 사용되었습니다.')
            else:
                print('잔액이 부족합니다.')

 

문제203. 위의 커피 키오스크 클래스를 상속받아서 클래스를 만드는데 Starbucks_Class로 설계도를 생성하시오. 클래스를 객체화시키면 다음과 같은 메시지가 출력되게 하시오.

k1=Starbucks_Class()

스타벅스 키오스크 시스템을 시작합니다.

class Starbucks_Class(Coffee_Class):
    def __init__(self):     # overriding 
        self.image("c:\\data\\kioskimage.png")
        print('스타벅스 키오스크 시스템을 시작합니다.')

 

새로운 커피 가맹점에서 우리 키오스크 프로그램을 사용하겠다고 주문이 들어오면 상속을 이용해서 기존 키오스크 클래스를 상속받고 새로운 가맹점에 맞춰 몇가지 코드만 변경해주면 됨

 

반응형