본문 바로가기
Python/기초

[파이썬/Python] Class 심화: 상속에 대한 모든 것

by 모두의 케빈 2023. 7. 11.

이전 시간에는 파이썬 Class의 정의와 기본적인 사용법에 대해 배웠습니다. 이번 시간에는 파이썬 Class의 상속에 대해 알아보도록 하겠습니다. 

 

Class 상속이란?


상속의 정의에 대해 알려주세요.

 

Class 상속이란 기존에 정의된 Class의 속성과 메서드를 물려받아서 새롭게 Class를 정의하는 것을 의미합니다. 물려주는 Class는 부모, 상속받는 Class는 자식 Class가 됩니다.

상속을 활용하는 대표적인 이유는 코드 재사용을 위해서입니다. 공통되는 속성이나 메서드를 정의하지 않고 활용함으로써 업무 효율성이 높아집니다.

인간(human) - 아시아인(Asian) - 한국인(Korean)의 Class를 구현하여 상속에 대한 실습을 해보도록 하겠습니다.

 

 

상속은 어떻게 하면 되나요?

 

상속을 위해서는 먼저 상위의 Class를 만들어야 합니다. 우선 human이라는 Class를 만들었습니다. 그리고 저는 인간이기 때문에 me라는 변수에 human Class의 인스턴스(Instance)를 할당했습니다. human 안의 show 메서드는 human Class의 정보를 보여주는 역할을 합니다.

class human:
    """최상위 Class"""
    
    species = '영장류'
    features = ['이족 보행','지적 능력']
    scientific_name = '호모 사피엔스'
    
    def show(self):
        print(f"human은 {self.species}이고, 
        {self.features} 특징이 있으며 
        학명은 {self.scientific_name}이다.")
        
        
me = human()
me.show()

#위 코드의 실행 결과
human은 영장류이고, ['이족 보행', '지적 능력'] 특징이 있으며 학명은 호모 사피엔스이다.

 

이제 아시아인(Asian)이라는 Class를 만들어보겠습니다. 아시아인도 인간이므로 인간의 특성을 공유합니다. 따라서 human Class를 상속받아서 코드를 재활용하겠습니다.

Class 이름 옆의 소괄호에 상속받고자 하는 상위 class의 이름을 넣어줌으로써 Class 간 상속 관계가 성립됩니다. 상속 관계가 성립되면 상위 Class의 속성과 Class의 메서드를 사용할 수 있습니다.

class Asian(human):
    """ human Class의 자식 Class """
    def __init__(self):
        self.area_name = ['동아시아','동남아시아','남아시아','서아시아','중앙아시아','북아시아']
    

me = Asian()

# 부모 클래스의 메서드 사용
me.show() # human은 영장류이고, ['이족 보행', '지적 능력'] 특징이 있으며 학명은 호모 사피엔스이다.

# 부모 클래스의 속성 사용 가능
# 영장류 ['이족 보행', '지적 능력'] 호모 사피엔스
print(me.species, me.features, me.scientific_name) 

# 자신의 속성도 사용 가능
# ['동아시아', '동남아시아', '남아시아', '서아시아', '중앙아시아', '북아시아']
print(me.area_name)

 

 

 

메서드 오버라이팅(Over-Writing)과 Super()


부모와 자식 Class의 메서드 이름이 동일하면 어떻게 하나요?

 

자식이 부모의 속성과 메서드를 상속받아도, 자식 클래스에서 동일한 이름으로 새롭게 메서드를 정의하면 부모 클래스의 메서드는 무시됩니다. 이런 경우를 메서드를 다시 덮어쓴다고 하여 오버 라이팅(Over-writing)이라고 합니다.

자식인 Asian Class에 부모 Class의 show 메서드와 동일한 이름으로 메서드를 오버라이팅 해서 결괏값을 출력하는 코드입니다. 자식의 메서드만 실행되는 것을 볼 수 있습니다.

class Asian(human):
    """ human Class의 자식 Class """
    def __init__(self):
        self.area_name = ['동아시아','동남아시아','남아시아','서아시아','중앙아시아','북아시아']
    
    # 메서드 오버라이팅
    def show(self):
        print("저는 human이면서 동시에 Asian입니다.")
        
me = Asian()
me.show() # 자식 클래스의 show 메서드만 호출된다.


# 위 코드의 결과값
저는 human이면서 동시에 Asian입니다.

 

 

부모, 자식의 메서드를 함께 사용하려면 어떻게 하면 되나요?

 

부모, 자식의 메서드를 동시에 사용하고 싶다면 "super().상속받고자 하는 메서드 이름"의 명령어를 사용하시면 됩니다.  Super() 예약어는 부모의 메서드를 상속받아서 자식 Class의 메서드에서 함께 실행되도록 도와줍니다.

class Asian(human):
    """ human Class의 자식 Class """
    def __init__(self):
        self.area_name = ['동아시아','동남아시아','남아시아','서아시아','중앙아시아','북아시아']
    
    # 메서드 오버라이팅
    def show(self):
        super().show() # 부모 클래스의 메서드를 상속
        print("저는 human이면서 동시에 Asian입니다.")
        
        
me = Asian()
me.show() # 부모, 자식의 show 메서드가 함께  실행된다.

# 위 코드의 결과값
human은 영장류이고, ['이족 보행', '지적 능력'] 특징이 있으며 학명은 호모 사피엔스이다.
저는 human이면서 동시에 Asian입니다.

 

 

다중 상속: 여러 Class를 이어서 상속하다.


 

다중 상속이라고 해도 위에서 배운 개념과 크게 다르지 않습니다. 그저 상속을 여러 단계로 진행할 뿐입니다. 한국인은 아시아인이므로, Asian의 자식 Class로 Korean Class를 만들어 보겠습니다.

Korean의 show 메서드는 Asian의 show 메서드를 상속받았고, Asian의 show 메서드는 human의 show 메서드를 상속받았기 때문에 Korean의 show 메서드를 사용하면 모든 Class에서 정의된 show 메서드가 함께 호출됩니다.

class Korean(Asian):
    def __init__(self):
        self.country = '대한민국'
        self.language = '한국어'
    
    def show(self, mixed_blood = False):
        super().show()
        print(f"저는 한국인입니다. {self.country}에서 거주하고 {self.language}를 사용합니다.")
        if mixed_blood == True:
            print("아 참, 그리고 저는 혼혈입니다.")
               
me = Korean()
me.show()
   
   
# 위 코드의 결과값
human은 영장류이고, ['이족 보행', '지적 능력'] 특징이 있으며 학명은 호모 사피엔스이다.
저는 human이면서 동시에 Asian입니다.
저는 한국인입니다. 대한민국에서 거주하고 한국어를 사용합니다.

 

 

부모 Class에 인자를 전달하기 위해서는 super().메서드명(인자)를 활용


부모 Class로 인자를 전달하고 싶어요.

 

상속 관계에서 부모 Class에 인자를 전달해야 할 때가 있습니다. 그럴 때도 super() 예약어를 활용하면 됩니다. Korean의 자식 Class인 Person을 정의해 보겠습니다. 그리고 Korean의 혼혈(mixed_blood) 특성에 True 값을 전달해 보겠습니다.

참고로 Korean Class의 show 메서드는 Korean Class의 속성을 활용하므로 super() 명령어로 부모 클래스의 __init__ 메서드도 함께 상속받아야 합니다.

class Person(Korean):
    def __init__(self, name, gender):
        super().__init__()
        self.name = name
        self.gender = gender
    
    def show(self):
        super().show(mixed_blood = True) # 이렇게 부모 클래스로 인자를 전달할 수 있다.
        print(f"저의 이름은 {self.name}이고 성별은 {self.gender}입니다.")
        
        
me = Person('kevin', '남자')
me.show()


# 위 코드의 결과값
human은 영장류이고, ['이족 보행', '지적 능력'] 특징이 있으며 학명은 호모 사피엔스이다.
저는 human이면서 동시에 Asian입니다.
저는 한국인입니다. 대한민국에서 거주하고 한국어를 사용합니다.
아 참, 그리고 저는 혼혈입니다.
저의 이름은 kevin이고 성별은 남자입니다.

댓글