빅데이터 프로그래밍/Python

[Python] 11. 상속(ingeritance), 부모클래스의 생성자호출, 생성자/메소드 오버로딩, 다중 상속

밍글링글링 2017. 8. 2.
728x90

01. 상속(Ingeritance)

- 부모 클래스의 메소드와 변수등이 자식 클래스로 자동으로 전달된다. 
- 클래스들이 공통적으로 사용하는 기능을 부모 클래스에 저장 한 후 
상속받아 사용하면 개발 속도를 향상 시킬 수 있다. 
- 소스 재사용으로 인한 개발자의 개발 부담이 감소된다. 
- Python은 C++ 처럼 다중 상속을 지원한다.
- 개발시에 상속을 권장하지 않는데 그 이유는 2개 이상의 클래스가 
서로 결합되어 객체지향이라는 독립성을 위배하기 때문에 사용을 추천하지 않습니다.
예) 부모 클래스와 자식 클래스가 서로 관련되어 자식 클래스가 독립적으로
기능을 실행할 수 없습니다. 소스 변경시 예상하지 못한 다른곳에서 에러 발생
- 형식: class 자식 클래스(부모 클래스): class 자식 클래스(부모 클래스 1, 부모 클래스 2): 

1. 새로운 기능이 추가되며 부모 기능을 상속하는 경우
 
[실행 화면]
모토롤라
전화 기능
문자 기능
------------------
Sumgsung
전화 기능
문자 기능
멀티미디어 메시지
------------------
Android
전화 기능
문자 기능
멀티미디어 메시지
인터넷
▷ /oop1/Class6.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

# class Phone:  # 모든 클래스는 object class를 상속받음, 생략 가능
class Phone(object):    
    phone_name = "모토롤라"
    
    def tel(self):
        print('전화 기능')
    
    def sms(self):
        print('문자 기능')    

class PDA(Phone):
    pda_name = "Samsung" 
    def mms(self):
        print("멀티미디어 메시지")      
        
class Smart(PDA):
    smart_name = "Android" 
    def internet(self):
        print("인터넷")
            
        
if __name__ == '__main__':
    phone = Phone()
    print(phone.phone_name)
    phone.tel()
    phone.sms()
    print("---------------")
    pda = PDA()
    print(pda.pda_name)
    pda.tel()
    pda.sms()
    pda.mms()
    print("---------------")
    smart = Smart()
    smart.tel()
    smart.sms()
    smart.mms()
    smart.internet()
    print("---------------")
     
           

-------------------------------------------------------------------------------------
 

 

2. 공통 기능을 공유하며 다양한 유형으로 기능이 분류되는 경우

[실행 화면]

 
---------------------
      주문 내역       
---------------------
메뉴: 짜장면
가격: 5,000 원
수량: 2
합계: 10,000 원
---------------------
 현금 결재를 합니다.
 
---------------------
      주문 내역       
---------------------
메뉴: 김밥
가격: 2,500 원
수량: 3
합계: 7,500 원
---------------------
카드 결재를 합니다.
 
---------------------
      주문 내역       
---------------------
메뉴: 아메리카노
가격: 2,000 원
수량: 1
합계: 2,000 원
---------------------
포인트 결재를 합니다.
▷ /oop1/Class7.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

import locale

class Payment(object):
    def order(self, menu, price, count):
        self.menu = menu
        self.price = price
        self.count = count
    
    def calc(self):
        # locale.setlocale(locale.LC_ALL, '') # 시스템 지역 사용
        # locale.format('%d', 1000, True)
        # locale.format('%.1f', 1000, True)
        self.total = self.price * self.count
        print()
        print('---------------------')    
        print('      주문 내역       ')
        print('---------------------')
        print('메뉴: ' + self.menu)
        print('가격: ' + format(self.price, ',') + ' 원')
        print('수량: ' + str(self.count))
        print('합계: ' + format(self.total, ',') + ' 원')
        print('---------------------')

class Cash(Payment):
    def cash(self):
        print(' 현금 결재를 합니다.')

class Card(Payment):
    def card(self):
        print('카드 결재를 합니다.')            

class Tel(Payment):
    def tel(self):
        print('전화 결재를 합니다.')
        
class Point(Payment):
    def point(self):
        print('포인트 결재를 합니다.')        
            
if __name__ == '__main__':
    cash = Cash()
    cash.order("짜장면", 5000, 2)
    cash.calc()
    cash.cash()
    
    card = Card()
    card.order("김밥", 2500, 3)
    card.calc()
    card.card()
     
    point = Point()
    point.order("아메리카노", 2000, 1)
    point.calc()
    point.point()
    

-------------------------------------------------------------------------------------
 

 

* 객체지향 분석 설계 분야에서 상속은 콤포넌트의 분리를 방해함으로
  사용을 권장하지 않습니다. 부모 자식간에 강한 결합이 발생하여 어떤 쪽에서
  변화가 발생하면 다른쪽도 심하게 영향을 받음(나비 효과 발생).

 

3. 부모클래스의 생성자 호출

[실행 화면]

PDA 객체 생성
Smart 객체 생성
LTE
Android
전화 기능
문자 기능
음악 Play
▷ /oop1/Class8.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

class PDA:
    def __init__(self, os): # 생성자
        self.os = os
        print('PDA 객체 생성')
        
    def tel(self):
        print("전화 기능")
    def sms(self):
        print("문자 기능")


class Smart(PDA):
    def __init__(self, comm, os):
        self.comm = comm
        
        # 부모 클래스의 생성자 호출, 호출 순서 상관 없음.
        PDA.__init__(self, os) 
        print('Smart 객체 생성')
        
    def bluetooth(self):
        print("음악 Play")


smart = Smart("LTE", "Android") # comm, os
print(smart.comm) # LTE
print(smart.os) # Android

smart.tel()
smart.sms()
smart.bluetooth()

         
-------------------------------------------------------------------------------------

 

 

 

4. 생성자/메소드 오버로딩

- Python은 메소드 오버로딩은 지원하지 않으나, 메소드로 전달되는 인수의 갯수를 조절하여 기능을 구현 할 수 있다.

[실행 화면]

Smart 객체 생성
brand: 
price: 0
음악 Play
----------------------------------------
Smart 객체 생성
brand: Android
price: 0
음악 Play
----------------------------------------
Smart 객체 생성
brand: Android
price: 400000
음악 Play
----------------------------------------
▷ Class9.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

class Smart():
    def __init__(self, brand='', price=0):
        print('Smart 객체 생성');
        
        self.brand = brand;
        self.price = price;
        
        print("brand: " + self.brand)
        print("price: " + str(self.price))
        
    def bluetooth(self):
        print("음악 Play")
        print('----------------------------------------')


smart = Smart()       # 생성자에 아무런 값도 할당하지 않은 경우
smart.bluetooth()

smart = Smart("Android")  # 생성자에 하나의 값을 할당
smart.bluetooth()

smart = Smart("Android", 400000)  # 생성자에 2개의 값을 할당
smart.bluetooth()

# ERROR, 인수가 너무 많음
# smart = Smart("Android", 400000, "LTE")  # 생성자에 3개 이상의 값을 할당
# smart.bluetooth()



-------------------------------------------------------------------------------------
 

 

5. 다중 상속

- 속성 상속은 권장하지 않음

[실행 화면]

Smart 객체 생성
name: 모토롤라
전화 기능
문자 기능
멀티미디어 메시지
▷ Class10.py
-------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-

class Phone:
    name = '모토롤라'

    def __init__(self):            # 생성자
        self.env = "Android"   # 상속 안됨
        
    def tel(self):
        print("전화 기능")
        
    def sms(self):
        print("문자 기능")

class PDA:
    def __init__(self, brand): # 생성자
        self.brand = brand    # 상속 안됨
        print('PDA 객체 생성')
       
    def mms(self):
        print("멀티미디어 메시지")


class Smart(Phone, PDA):
    def __init__(self):
        print('Smart 객체 생성')
        
smart = Smart()
print('name: ' + smart.name)
# print(smart.env)      # 상속 안됨
# print(smart.brand)   # 상속 안됨
smart.tel()
smart.sms()
smart.mms()


-------------------------------------------------------------------------------------

 

 

 

 

728x90

댓글