자료실/파이썬(Python)

파이썬(Python) - 클래스 _ 상속

자료수집중 2020. 7. 15.
반응형

이번에는 상속에 대해 알아보겠습니다.

클래스는 클래스를 상속받아서 사용할 수 있습니다.

보통 상속받을 클래스를 부모 클래스 상속받는 클래스를 자식 클래스라고도 합니다.

 

 

먼저 클래스를 상속받기 위해서는 다음과 같습니다.

class 클래스이름(부모클래스 이름):
	멤버

이제 예제를 통해서 보겠습니다.

먼저 class Person으로 이름과 나이를 출력해주는 클래스를 만들었습니다.

추가로 새롭게 학생을 관리하는 class Student를 만들었습니다.  근데 생각해보면 학생도 결국 이름과 나이를 저장해야하기때문에 class Person을 상속받음으로 class Student 내부에서 class Person을 사용할 수 있게 합니다.

class Person:
    __count = 0  # 멤버 변수

    def __init__(self, name, age, count=None):
        self.name = name  # 인스턴스 변수
        self.age = age
        Person.__count += 1

    def _show(self):
        print("이름 : ", self.name)
        print("나이 : ", self.age)
        print("등록된 사람 수 : ", Person.__count)


class Student(Person):
    def __init__(self, name, age, classN):
        super().__init__(name, age)
        print("반 이름 : ", classN)
        super()._show()


a = Student("홍길동", 10, "해바라기 반")

super()는 부모 클래스의 메서드를 호출할 때 사용합니다.

클래스를 상속받게 되면 부모 클래스의 메서드를 사용할 수 있기 때문에 자식 클래스는 중복되는 새로운 메서드를 작성할 필요 없이 필요한 부분을 가져와 사용하면 되므로 더 빠르게 작성할 수 있습니다.

그리고 접근 권한에서 protected에 대해 설명했을 때 _변수명 또는 함수명 앞에 _(언더바1개)를 붙여주면 된다고 했었습니다.

class Person의 메서드 _show()는 class Person상속받은 class Student내부에서는 사용이 가능합니다.

 

 

다음으로는 오버라이딩(overriding)에 대해서 알아보겠습니다.

상속을 받은 후에는 자식 클래스의 인스턴스도 부모 클래스의 public상태인 변수와 메서드를 호출할 수 있습니다.

class Person:
    __count = 0  # 멤버 변수

    def __init__(self, name, age, count=None):
        self.name = name  # 인스턴스 변수
        self.age = age
        Person.__count += 1

    def show(self):
        print("이름 : ", self.name)
        print("나이 : ", self.age)
        print("등록된 사람 수 : ", Person.__count)


class Student(Person):
    def __init__(self, name, age, classN):
        super().__init__(name, age)


a = Student("홍길동", 10, "해바라기 반")
a.show()

a는 Student의 인스턴스지만 상속받은 Person의 메서드 show()를 사용할 수 있습니다.

하지만 부모 클래스의 메서드가 마음에 들지 않는 경우 부모 클래스를 직접 수정해도 되지만 자식 클래스에서 똑같은 이름의 메서드를 생성해서 수정할 수 있습니다.

이 경우 자식 클래스의 인스턴스에서 메서드를 호출하게 되면 자식 클래스의 메서드가 호출되게 됩니다.

이런 방법을 오버라이딩이라고 합니다.다시 위의 예제에서 show()를 오버라이딩해서 조금 더 내용을 보충해보겠습니다.

class Person:
    __count = 0  # 멤버 변수

    def __init__(self, name, age, count=None):
        self.name = name  # 인스턴스 변수
        self.age = age
        Person.__count += 1

    def show(self):
        print("이름 : ", self.name)
        print("나이 : ", self.age)
        print("등록된 사람 수 : ", Person.__count)


class Student(Person):
    def __init__(self, name, age, classN):
        super().__init__(name, age)
        self.classN = classN

    def show(self):
        print("학생 정보 열람")
        print("반 이름 : ", self.classN)
        super().show()


a = Student("홍길동", 10, "해바라기 반")
a.show()

이제 Student의 인스턴스에서 호출한 show()는 Person의 메서드가 아닌 Student의 메서드임을 알 수 있습니다.

 

 

오버라이딩을 이용하면 부모 클래스의 메서드 중 부족한 부분을 자식 클래스에서 수정 및 보충 후 사용할 수 있습니다.

 

댓글