프로그래밍/Python

Python-9) 클래스의 상속, 오버로딩, 오버라이딩 : Python 설치, 클래스, 상속, 객체지향 언어

LeeSeunghyuk 2020. 11. 23. 15:20
반응형

안녕하세요 이승혁입니다.

 

지난 시간에는 클래스에 대해 실습을 진행해 보았습니다.

 

※ 클래스의 상속

 

     어떤 클래스가 가지고 있는 모든 멤버나 메소드를, 상속 받는 클래스가 모두 사용할 수 있습니다.

     상속을 해주는 클래스 : 부모클래스, 슈퍼클래스

     상속을 받는 클래스 : 자식클래스, 서브클래스

 

      상속 선언은 class 자식클래스(부모클래스): 형태로 정의합니다.

 

     클래스는 상속이 가능해서 중요하고 기본적인 코드는 상속을 받고 나는 다른 기능만 구현하면 된다.

 

     팀장                      팀원1                    팀원2

      ↓                           ↓                         ↓

    기본카드 클래스         영화 할인 카드          주유 할인 카드

    기본적인 기능         

 

     자식 클래스는 부모 클래스 여러 개를 상속 받을 수 있습니다.

     calss 자식클래스(부모클래스1,부모클래스2...): 형태로 정의합니다.

 

실습 1. 총 클래스 대신 카드 클래스 만들어보기

 

https://lsh-story.tistory.com/27

 

Python-8) Class : Python, Python 설치, 파이썬 클래스, 객체

안녕하세요 이승혁입니다. 이번 포스팅은 객체 지향 언어의 핵심인 클래스와 객체에 대해 실습을 진행해 보도록 하겠습니다. ※ 객체 지향 언어 vs 절차 지향 언어 객체 : 객체라는 것 주변에 보

lsh-story.tistory.com

위 포스팅의 마지막 부분을 확인하면 되겠습니다.

 

card 1=Card()

카드가 발급되었습니다.

card1.charge(10000)

10000원이 충전되었습니다.

card1.consume(1400)

1400원 사용되었습니다.

잔액은 8600원입니다.

 

위와 같은 문구가 출력되도록 클래스를 생성합니다.

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

card1=Card()
card1.charge(10000)
card1.consume(1400)

 

실습 2. 영화 카드 할인 클래스 생성하기 , 위에서 만든 카드 클래스를 상속받는 Movie_card 클래스를 생성합니다.

같은 기능을 사용할 수 있는지 사용해 봅니다.

class Movie_card(Card):
    pass
movie_card=Movie_card()
movie_card.charge(10000)
movie_card.consume(1000)

Movie_card 클래스의 내용은 Card의 멤버와 메소드를 상속받아 동일하게 사용할 수 있는 모습입니다.

 

실습 3. Movie_card 클래스를 수정해 consume 메소드의 변수에 사용처를 추가하고, 영화관이면 20퍼센트 할인하는 코드를 작성해보기

class Movie_card(Card):
    def consume(self,money,loc):
        if loc=='영화관':
            money*=0.8
        if money<=self.money:
            self.money-=money
            print('%s에서 %d원이 사용되었습니다.'%(loc,money))
            print('잔액은 %d원입니다.'%self.money)
        else:
            print('잔액이 부족합니다.')
            
movie_card=Movie_card()
movie_card.charge(10000)
movie_card.consume(1000,'영화관')

Card() 클래스의 consume : 변수로 금액, 충전된 금액에서 차감

Movie_card() 클래스의 consume : 변수로 금액, 사용처, 영화관이면 할인, 충전 금액에서 차감

 

위와 같이 상속받은 메소드의 이름은 같지만, 변수를 다르게 설정하여 

다른 기능을 하게 하는 것을 오버라이딩 이라고 합니다.

 

오버라이딩 : 상속받는 자식 클래스가 부모 클래스의 특정 기능을 다른 코드로 대체 하는 것

 

부모클래스(card)  --------------------> 자식클래스(Movie_card)

    consume                                          consume

                                   부모 consume에 추가로 영화 할인 기능을 추가함

 

오버로딩 : 같은 이름의 함수에 매개 변수를 다르게 하여 여러 개 사용하는 방법

              파이썬에서는 사용하지 않습니다.

              주로 자바(Java)에서 사용하는 기능입니다.


※ 클래스 멤버 / 인스턴스 멤버

 

     클래스에서 선언된 변수는 클래스 멤버와 인스턴스 멤버가 있다.

     클래스 멤버 : 클래스 메소드 바깥에서 선언되는 변수이다.

     인스턴스 멤버 : 클래스 메소드 안에서 self와 함께 선언되는 변수이다.

class Employee:
    raise_amount=2 # 클래스 변수
    def __init__(self,first,last,pay): # 객체 생성자
        self.first=first
        self.last=last
        self.pay=pay
        self.email=first.lower()+'_'+last.lower()+'@gmail.com'
        self.raise_amount=1.1 # 인스턴스 변수
        
    def full_name(self):
        return '{} {}'.format(self.first,self.last)
    
    def instance_raise(self):
        self.pay=int(self.pay*self.raise_amount)
        
    def class_raise(self):
        self.pay=int(self.pay*Employee.raise_amount)
                     
emp_seunghyuk=Employee('seunghuyk','lee',3000)
print(emp_seunghyuk.full_name())
print('before raise :',emp_seunghyuk.pay)
emp_seunghyuk.instance_raise()
print('instance raise :',emp_seunghyuk.pay)
emp_seunghyuk.class_raise()
print('class raise :',emp_seunghyuk.pay)

                

이번 포스팅에서는 클래스의 상속과 오버로딩, 오버라이딩에 대해서 실습을 진행해 보았습니다.

다음 시간에는 예외처리(try ~ except)에 대해 실습을 진행해 보도록 하겠습니다.

반응형