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

2017. 8. 2. 16:49·빅데이터 프로그래밍/Python
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
반응형

'빅데이터 프로그래밍 > Python' 카테고리의 다른 글

[Python] 13. [IO] IO(입출력), File 클래스 다루기, 파일 이동, 디렉토리 조작, 파일 목록, 파일 복사  (0) 2017.08.02
[Python] 12. 예외처리(Excetption), try, except ~ else ~ finally 실습  (0) 2017.08.02
[Python] 10. Class 선언, 클래스 멤버, 메소드, 인스턴스 멤버, 메소드의 실습, 생성자, 소멸자, 모듈 분리  (0) 2017.08.02
[Python] 09. 모듈과 패키지의 사용, import의 사용, Template  (0) 2017.08.02
[Python] 08. 함수 다루기, 함수의 인자, 지역 변수와 전역 변수, 리턴값, 디버깅  (0) 2017.08.02
'빅데이터 프로그래밍/Python' 카테고리의 다른 글
  • [Python] 13. [IO] IO(입출력), File 클래스 다루기, 파일 이동, 디렉토리 조작, 파일 목록, 파일 복사
  • [Python] 12. 예외처리(Excetption), try, except ~ else ~ finally 실습
  • [Python] 10. Class 선언, 클래스 멤버, 메소드, 인스턴스 멤버, 메소드의 실습, 생성자, 소멸자, 모듈 분리
  • [Python] 09. 모듈과 패키지의 사용, import의 사용, Template
밍글링글링
밍글링글링
mingling - 밍글링, 밍글밍글링. 코드와 어우러지다. IT/ 프로그래밍/소스
    반응형
    250x250
  • 밍글링글링
    mingling
    밍글링글링
  • 전체
    오늘
    어제
    • 밍글링글링 (407) N
      • Flutter (2)
      • 일상생활 (8)
        • 리뷰 (1)
        • 생활정보 (4)
        • 맛집 (0)
        • 여행 (0)
        • 모든정보 (3)
      • JAVA (126)
        • 개념 (6)
        • 예제 (115)
        • Exception (2)
      • C (1)
        • C (1)
        • C++ (0)
        • C# (0)
      • JS (29)
        • JavaScript (18)
        • JQuery (5)
        • AJax (0)
        • NODE.JS (6)
        • Angular.JS 2.0 (0)
      • WEB (87)
        • HTML (6)
        • CSS (61)
        • JSP (20)
        • JSTL (0)
      • FrameWork (8)
        • Spring (8)
        • BootStrap (0)
        • MyBATIS (0)
        • JUnit (0)
      • 외부 라이브러리 (5)
      • 공유 소스 관리 (5)
        • Git (5)
        • SVN (0)
      • 빅데이터 프로그래밍 (37)
        • Python (37)
        • R Programming (0)
      • DB (7)
        • ORACLE (0)
        • MySql (6)
      • Development Tools (7)
        • StarUML (0)
        • eXERD (0)
        • Eclipse (4)
      • SKILL (6)
        • Migration (0)
        • Security (6)
      • MicroSoft (0)
        • Excel (0)
        • Word (0)
      • Android (0)
      • Server (21)
        • Ubuntu (5)
        • Linux (15)
      • IOS (0)
      • XML (0)
      • 미디어 (0)
      • 공지사항 (3)
      • NETWORK (1)
      • 게임 (4)
        • 피파 (1)
        • 리니지M (0)
        • 배틀그라운드 (1)
        • 듀랑고 (2)
      • 세상 이슈 (6)
      • 일렉트론 (0)
      • 대회 소식 (4)
      • 업무 (2)
      • Express, Vue (6)
      • docker (11)
      • svelte (3)
      • 블록체인 (1)
      • IT (10) N
      • Rust (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    css float
    클론코딩
    ssl 인증서 발급
    API 설계
    VS Code 팁
    자바 exception
    Node
    SSL 인증서
    리눅스 설치
    vue 설치
    lang rust
    에디터 팁
    vscode
    css block
    vue cli
    러스트
    css table
    nginx ssl 설정
    오류
    Extension Bisect
    svelte
    자바 객체 지향
    docker
    css tb
    mysql db
    nginx ssl 적용
    gitlab 설치
    spring java
    자바 for문
    nginx
    AI 코딩 에이전트
    servlet class
    java casting
    Java Array
    React Compiler
    자바 생성자
    티스토리 자동화
    Rust lang
    프런트엔드
    ubuntu
    jsp parameter
    css list
    proxy pass
    rust linux
    css perspective
    브라우저 자동화
    jsp include
    자바 배열
    자바 클래스
    css transition
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
밍글링글링
[Python] 11. 상속(ingeritance), 부모클래스의 생성자호출, 생성자/메소드 오버로딩, 다중 상속
상단으로

티스토리툴바