본문 바로가기
SK 행복성장캠퍼스/Python 기초

0907_6일차_상속

by NickNuma 2020. 9. 7.

클래스 상속에 대한 설명입니다.

 


클래스의 상속이란 자식 계층의 클래스에서 공통된 속성과 기능을 뽑아내어 새로운 클래스에 정의하고 자식 계층이 해당 클래스 (부모 클래스)의 속성과 기능을 상속받는 것을 말합니다.
상속을 위해 class 자식(부모)로 정의합니다.  # 파이썬은 자바와 다르게 다중 상속이 가능합니다.
  # class Child(Parent, Parent2)
상속 구현을 하기 위해서는 반드시 is a 관계가 성립해야합니다.   자식 계층 클래스 is a 부모 계층 클래스
그리고 자식 계층에서 부모 계층의 메서드를 사용하되 자식 계층의 특수 기능을 위해 값을 수정하게되면 해당 메서드는 오버라이딩 메서드(Overriding method)라고 지칭됩니다.

모든 클래스는 상속구조(계층구조)로 되어 있으며 모든 클래스의 부모 클래스, 최상의 클래스는 Object 클래스입니다.

클래스 계층 구조를 확인하려면 print(클래스명.mro())로 확인 가능합니다.

"""
   상속 (inheritance)
      가. 상속 전
         - 비슷한 속성과 동작이 반복된다.  ==> 재사용하기 위한 방법으로 상속을 적용

      나. 상속 후
         1. 목적 : 재사용성
         2. 적용 방법:
                  -(1) 클래스들 간에 공통된 속성(인스턴스 변수)과 기능(메서드)을 뽑아내어 새로운 클래스에 정의한다.
                  -(2) 상속구현      ==> 반드시 is a 관계여야 한다.
                        class Parent:
                           pass

                        class child(Parent, Parent2):    # 다중 상속 가능 (java = 단일 상속)
                           pass

                           ===> 특별한 관계가 성립된다.
                                 예 > Child is a Parent
                                      Cat is a Pet
         3. 오버라이딩 메서드 ( overriding method )
               ==> 부모의 메서드를 자식이 그냥 사용할 수 있지만 때에 따라서 자식 클래스에서 부모의 메서드를 수정해서 사용할 수 있다.
                    자식에서 부모의 메서드를 수정(재정의)해서 선언된 메서드 => 오버라이딩 메서드

         4. 모든 클래스는 상속구조 (계층구조)로 되어 있다. ==> 부모 / 자식 관계
               최상위 클래스는 Object 클래스

               class 클래스명:       ===> class 클래스명(Object):
                      pass

         5. 클래스 계층 구조 확인
            print(클래스명.mro())
"""

 


부모 클래스와 자식 클래스를 만들어 봅시다.

개념 정리부터

"""
   다음 클래스간 공통점?
   고양이
      - 속성 : 이름, 나이, 성별, ...
      - 동작 : 먹기, 울기, ...
   강아지
      - 속성 : 이름, 나이, ...
      - 동작 : 먹기, 울기, 으르렁거리기, ...

==> 더 큰 개념 : 애완 동물       
"""

"""
   공통 속성 name과 age가 어디에 선언되어 있는가?
   1) Pet 
   
"""

 

개념 정리 후, Pet과 Cat, Dog 클래스를 생성합니다.

class Pet:
   def __init__(self, name, age):
      self.name = name
      self.age = age
   def cry(self):
      print("")
   def eat(self):
      print("")
   def info(self):
      print("")

class Cat(Pet):
   def __init__(self, name, age, sex):
      super().__init__(name, age)         # 부모의 값 참조  # 부모에서 선언된 변수를 초기화 하기 위해서 super()를 이용, 부모를 참조
      # self.name = name                  # self. 형식은 부모의 self값을 상속받는 것이 아니라 부모의 값과 자식의 값이 중복된 상황
      # self.age = age
      self.sex = sex
   def cry(self):    #재정의 메서드 : 오버라이딩 메서드
      print("야옹~")
   def eat(self):
      print("냠냠~")
   def info(self):
      return self.name+"\t"+self.age+"\t"+self.sex


class Dog(Pet):
   def __init__(self, name, age):
      super().__init__(name, age)         # 부모의 값 참조  # 부모에서 선언된 변수를 초기화 하기 위해서 super()를 이용, 부모를 참조
      # self.name = name
      # self.age = age
   def cry(self):
      print("멍멍~")
   def eat(self):
      print("쩝쩝쩝~")
   def dog_growl(self):
      print("으르렁~")
   def info(self):
      return self.name + "\t" + self.age

 

객체 생성과 질문

c = Cat("야옹이", 3, "F")  # Cat 객체 생성 (인스턴스 선언)
d = Dog("멍멍이", 2)       # Dog 객체 생성 (인스턴스 선언)

print("고양이 이름 : {}, 나이 : {}, 성별 : {}".format(c.name, c.age, c.sex))  # 고양이 이름 : 야옹이, 나이 : 3, 성별 : F
print("강아지 이름 : {}, 나이 : {}".format(d.name, d.age))      # 강아지 이름 : 멍멍이, 나이 : 2

c.cry()        # 야옹~
c.eat()        # 냠냠~
d.eat()        # 쩝쩝쩝~
d.cry()        # 멍멍~
d.dog_growl()  # 으르렁~

 


두번째 예제입니다.
부모 클래스로 고용인을 만들고 자식 클래스로 엔지니어와 관리자를 만들고 부모 클래스를 상속받습니다.

class Employee():

   #공통 속성 추출
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary

   #공통 동작 추출
   def employee_info(self):
      return self.name+"\t"+str(self.salary)

class Engineer(Employee):

   def __init__(self, name, salary, skill):
      super().__init__(name, salary)            # 부모 클래스의 초기화 상속
      self.skill = skill                        # 부모에 없는 자식 속성은 자식 클래스에서 초기화

   # Overriding                # 부모의 메서드를 상속받아서 수정을 거친 후 자식 메서드에서 사용
   def employee_info(self):                     # 부모 메소드 상속
      return self.name+"\t"+str(self.salary)+"\t"+self.skill


class Administer(Employee):

   def __init__(self, name, salary, depart):
      super().__init__(name, salary)
      self.deaprt = depart

   def employee_info(self):
      return self.name+"\t"+str(self.salary)+"\t"+self.deaprt

 

질문합니다.

eng = Engineer("홍길동", 1000, "Python")
print(eng.employee_info())          # 홍길동	1000	Python
adm = Administer("장길산", 2000, "Developer")
print(adm.employee_info())          # 장길산	2000	Developer

#클래스 계충구조 확인      클래스명.mro()
print("Administer 계층구조:", Administer.mro())
# Administer 계층구조: [<class '__main__.Administer'>, <class '__main__.Employee'>, <class 'object'>]

주중에는 간단하게 설명을 하고 주말에 복습겸 다듬도록 하겠습니다.

그럼 이만~

반응형

댓글