22.10.17 - 파이썬 OOP(상속과 오버라이딩)(1)

LaMelo·2022년 10월 17일
0

jupyter

목록 보기
17/29
post-thumbnail

1. 상속

  • 상속은 부모 클래스의 정보를 활용해 자식 클래스를 이끌어내는 것을 의미합니다.

  • 문법의 형태는

class 클래스명(부모클래스):
____내부 정의
_____...
_____.

  • 현실에서의 상속과 마찬가지로 프로그래밍의 상속에서도 부모는 자식에게 자신이 가진 요소를 물려줍니다.(변수, 메서드)

  • 현실과 다른 점은 프로그래밍의 상속은 자식이 부모를 지목해 이루어지며 부모쪽에서 물려받은 변수,

  • 메서드 및 자식쪽에서 새로 정의한 변수, 메서드 그리고 물려받은 메서드를 재정의(오버라이딩)해 사용할 수 있습니다.

(1) 상속은 상위 개념을 먼저 클래스화시켜놓고 하위 개념에서 상속받아서 쓰는 순서로 이루어집니다.

  • 상위 클래스 생성
  • 하위 클래스 생성
    • Student는 Person의 상속을 받았다.
      • 상속을 받았기 때문에 부모 클래스의 변수인 name, age, height를 끌어와서 쓸 수 있습니다.
    • 다른 하위 클래스를 생성해봅시다.
      • Person의 상속을 받은 Salary(샐러리맨) 함수 역시 부모클래스의 변수들을 공유받습니다.
      • 이렇듯 공통적인 정보가 들어가는 부분들을 부모 클래스에 깔아두고 세부 정보들을 자식 클래스에 부여한다면 BD를 구축하듯 효율적인 출력망을 만들 수 있습니다.(다형성)
  • 다만 다중상속(두개의 부모 클래스에서 상속받는 등 중첩을 두는 경우)은 금기시되는 형식입니다. (죽음의 다이아몬드 참조)
    • 위 그림에서 ComboDrive를 보면 CD버너와 DVD버너를 상속받는다면 두 함수에서의 메소드의 명칭이 burn()으로 같아지는 상황이 나오게 됩니다.
      • 이럴때 burn()메소드 호출 시 어떤 함수가 실행될 것인가?
      • 또한 i를 ComboDrive에서 사용한다면 둘 중 어떤 것을 사용할 것인가?
    • 이러한 문제들이 발생하기 때문에 여타의 언어들은 단순하게 기능을 막아 두었습니다.
    • 하지만 파이썬에서는 다중상속도 허용이 되는데 쓰지 않는 것이 좋다고 생각합니다.
  • 위에서 짜놓은 Student(Person)과 Salary(Person)은 부모클래스를 공유하는 것이지 부모 클래스가 여럿이라거나 클래스의 층이 다층인 상황이 아니므로 문제가 없는 상황이다.

(2) 상속의 개념

  • Person() 클래스의 상속을 받은 Student 클래스의 개략적인 메모리 작동 순서를 살펴봅시다.

    • (1) 부모 클래스 선언(Person) : 아무 변화 없음

    • (2) p1 변수가 생성 : 힙에 100번지 형성 자료를 넣을 수 있는 형식 마련 스택의 Person 역시 100번지 주소를 갖게됨

    • (3) p1 변수가 생성됨에 따라 힙에 p1변수가 200번지(p1인스턴스)에 따로 자료값을 가지게 되고 스택에 주소(200번지)가 생기게 된다.

    • (4) 자식 클래스 선언(Student) : 아무 변화 없음

    • (5) s1 변수 생성 : 부모 클래스의 변수들 형식(name, age, height) 밑에 Student 클래스의 하위 변수가 붙음(major)

    • (6) 하지만 자료값이 들어가는 힙의 저장소에는 p1변수와 s1변수는 엄연히 다른 변수이자 다른 자료값을 가지기 때문에 저장소를 따로 쓰게 된다. 그래서 400번지에 s1의 자료값들을 따로 저장(s1인스턴스)한다.

    • (7) 힙에 따로 저장한 주소(400번지)를 스택에 표시

    • (8) s1 인스턴스(400번지)의 자료들을 출력 후 종료

      (출력 후 보통 그렇듯 스택에서의 p1과 s1의 주소가 사라질 줄 알았는데 사라지지 않고 있는데 왜인지 모름)

profile
가즈아~

0개의 댓글