Coding & Programming/Python 기초(A-Z)

[Python:파이썬:기초] 17. 클래스 상속, 메소드 오버라이딩, super 함수 예제-Class Inheritance, Method Overriding , super function examples

mainCodes 2021. 5. 29. 08:24

[Python:파이썬:기초] 17. 클래스 상속, 다중 상속, 메소드 오버라이딩, super 함수 예제- Class Inheritance, Method Overriding , super function examples

 

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

 

클래스를 지원하는 파이썬도 클래스 상속(Inheritance)을 지원합니다. 클래스가 베이스(부모) 클래스로부터 상속받기 위해서는 클래스 이름 뒤에 괄호를 이용하여 상속받을 클래스의 이름을 입력합니다.

 

class 클래스이름(베이스클래스):
    코드
    ...

 

일반적으로 클래스의 상속은 파생(자식) 클래스 기능을 확장시킬 때 사용합니다. 예제에서 footballPlayer과 computerEnginner 클래스는 Person 클래스를 상속하므로 Person의 기능을 그대로 이어받게 됩니다.

 

#베이스 클래스(부모 클래스)
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
#파생 클래스        
    class footballPlayer(Person):
        def __init__(self, name, age, job, level):
            self.job = job
            self.level = level
            super().__init__(name, age) #Person 클래스 초기화
 #파생 클래스        
    class computerEnginner(Person):
        def __init__(self, name, age, job):
            self.job = job
            super().__init__(name, age)  #Person 클래스 초기화                  

 

메소드 오버라이딩(Overriding)

예제는 메소드 오버라이딩 코드인 printInfo() 포함하고 있습니다. printInfo()  메소드는 베이스 클래스인 Person, 파생클래스인 footballPlayer, computerEngineer 에도 동일한 이름으로 정의되어 있습니다.

 

베이스 클래스에 정의된 메소드를 파생 클래스에서 동일한 이름으로 재정의하는 것을 메소드 오버라이딩이라 합니다. 메소드 오버라이딩은 파생클래스에서 베이스클래스에 정의된 메소드의 기능을 추가할 수 있습니다. footballPlayer 클래스에 정의된 printInfo() 메소드는 베이스 클래스의 printInfo() 메소드에 추가된 코드를 실행합니다.

 

def printInfo(self):     #메소드 오버라이딩(Overriding)
    super().printInfo()  #name, age는 베이스 클래스 메소드 이용(코드 재활용)
    print("job = {}".format(self.job )) #파생클래스에서 추가된 코드

 

super() 함수

super() 함수는 파생 클래스에서 베이스 클래스의 메소드 등을 참조할 때 사용됩니다.

 

🔗 클래스 상속, 메소드 오버라이딩, super 함수 예제(Examples):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#베이스 클래스(부모 클래스)
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def getName1(self):
        return "Class Person"
    
    def printInfo(self):
        print("name = {}, age = {}".format(self.name,  self.age) )
        
#파생 클래스(자식 클래스)  
class footballPlayer(Person):
    def __init__(self, name, age, job, level):
        self.job = job
        self.level = level
        super().__init__(name, age) #Person 클래스 초기화
        
    def getSkillLevel(self):
        return self.level
    
    def getName2(self):
        return "Class footballPlayer"    
    
    def printInfo(self):     #메소드 오버라이딩(Overriding)
        super().printInfo()  #name, age는 베이스 클래스 메소드 이용(코드 재활용)
        print("job = {}".format(self.job ))
        
#파생 클래스(자식 클래스)     
class computerEngineer(Person):
    def __init__(self, name, age, job):
        self.job = job
        super().__init__(name, age)  #Person 클래스 초기화      
        
    def getName3(self):
        super().getName1()           
        
    #메소드 오버라이딩(Overriding), age, name은 베이스클래스와 중복임           
    def printInfo(self):  
        print("name = {}, age = {}, job = {}".format(self.name,  
                    self.age, self.job) )        
 
 
print("")
#객체 생성/초기화/출력
p1 = footballPlayer("Mike"34"football.player"99
print("name = ", p1.name, ", age = ", p1.age, ", job = ", p1.job, ", level = ", p1.level)
 
#객체 생성/초기화/출력
p2 = computerEngineer("Mark"28"computer.enginner")        
print("name = ", p2.name, ", age = ", p2.age, ", job = ", p2.job)
 
 
#super() 함수 예
print("p1.getName2 = ", p1.getName2()) #자신의 메소드 호출
print("p2.getName1 = ", p2.getName1()) #베이스 클래스 메소드 호출(참조)
 
#메소드 오버라이딩(Overriding)
#베이스 클래스에 있는 printInfo() 메소드를 재정의 함
print("")
p1.printInfo()  #베이스(Person) 클래스의 printInfo()도 함께 호출(코드 재사용)
p2.printInfo()  #computerEnginner 클래스의 printInfo()만 호출
cs

 

🔗 실행결과(Output):

 

이상 JollyTree였습니다 (•̀ᴗ•́)و