본문 바로가기
개발&코딩/Python

[Python] - Class에 대해 그리고 상속과 메서드 오버라이딩

by 우동이 2020. 9. 8.
300x250

class와 상속 그리고 메서드 오버라이딩에 대해 배워보자

class는 파이썬의 대부분의 기능을 제작해서 사용되고 있다

정수형 int도 type을 살펴보면 class로 선언되어 있다

그렇게 만들어진 class를 상속받거나 오버라이딩 하면 더욱 간결한

코딩이 가능하다

class의 선언과 구조

class Human:
    def __init__(self,age,name):
        self._age=age
        self._name=name

    def __repr__(self):
        return "제 나이는 : {}살이고 이름은 : {}입니다.".format(self._age, self._name)

cheolsu=Human(22,"kimcheolsu")
print(cheolsu)

>>> 제 나이는 : 22살이고 이름은 : kimcheolsu입니다.

 

위 코드는 간단한 클래스를 구현한 것이고 클래스의 이름은 Human이다

내부에 존재하는 함수들은 method 함수 ,static 함수 등 용도에 따라 다양한 이름으로 불리우며

method 들은 용도에 따라 instatnce method 혹은 class method로 분류된다

이미 제작되어 있는 libray class들을 사용해서 그 기능을 그대로 사용할 수도 있고

새로운 method를 제작해서 나만의 클래스를 만들어 사용할 수도 있다.

그럼 클래스의 구조에 대해 간략히 알아보자

위 __init__ 메서드는 초기화 메서드(initialize)고 클래스가 사용될 경우 첫번째로 자동 호출되어

클래스의 정보를 초기화 하는 역할을 한다

self라는 매개 변수는 클래스 내부 속성의 인스턴스 역할이며 self를 통하여

내부 메서드와 속성에 접근함과 사용할 수 있다

__init__메서드에서 클래스의 정보중 age와 name을 받은 후 초기화 해주고

__repr__메서드 (표현 메서드) 에서 age와 name의 값을 return 해줄건데

cheolsu 라는 객체를 하나 생성해서 출력하면 표현메서드 __repr__의 리턴값이 출력된다.

비슷한 기능으로 __str__메서드도 존재하는데

__str__ 와 __repr__메서드의 차이점은 개발자를 위한 표현식과 사용자를 위한 표현식이라는 차이점이 존재한다.

Class 상속받아 사용하기

class Human:
    def __init__(self,age,name):
        self._age=age
        self._name=name

    def __repr__(self):
        return "제 나이는 : {}살이고 이름은 : {}입니다.".format(self._age, self._name)
class Man(Human):
    def __init__(self,name,age,tall):
        super().__init__(name,age)
        self._tall=tall

man1=Man("cheolsu",22,172.5)

print(man1)
>>> 제 나이는 : cheolsu살이고 이름은 : 22입니다.

위 코드는 클래스가 두개 만들어져 있고 Human클래스를 상속받은 Man클래스를 통해 man1이라는 객체를 생성해서

출력한 코드다 Man의 코드를 살펴보면 __init__생성자에서 super()라는 코드를 찾아볼 수 있는데

이는 Man이 Human클래스를 상속받은 자식 클래스라는걸 알 수 있고 Human 클래스는 Man의 부모 클래스가 된다

클래스 선언부에서 class Man(상속받을 클래스)로 선언한 다음

super()를 통해 __init__메서드의 즉 Human클래스의 name과 age변수의 사용권한도 받아와서 사용할 수 있게 된다

Man자체에는 출력기능이 없지만 Human클래스의 __repr__메서드를 상속받았기에 사용할 수 있다

Class - 메서드 오버라이딩 method overriding

class Human:
    def __init__(self,age,name):
        self._age=age
        self._name=name
    def __repr__(self): #부모 클래스의 메서드
        return "제 나이는 : {}살이고 이름은 : {}입니다.".format(self._age, self._name)
class Man(Human):
    def __init__(self,name,age,tall):
        super().__init__(name,age)
        self._tall=tall
    def __repr__(self): #부모 클래스의 메서드를 상속받아 오버라이딩 한 새로운 메서드
        return "제 나이는 : {}살이고 이름은 : {}이며 키는 : {}cm입니다".format(self._age, self._name,self._tall)

man1=Man("cheolsu",22,172.5)

print(man1)
>>> 제 나이는 : cheolsu살이고 이름은 : 22이며 키는 : 172.5cm입니다

메서드 오버라이딩은 상속받은 클래스의 기능을 추가하거나 삭제하여 덧씌워 사용한다

아까 상속부분에서 __repr__기능이 구현되지 않은 Man클래스의 객체를 출력했을때

Human클래스의 __repr__메서드를 통해 출력이 가능했지만 지금 코드에서 Man은 Human과는 다르게 하나의 변수를 더 입력받기에

출력해야할 정보를 3개로 늘린 새로운 __repr__메서드를 오버라이딩 해서 사용하게된다.

 

300x250

댓글