객체지향프로그래밍이란 5편 - 추상화, 상속 -
1. 객체지향의 핵심개념
추상화, 상속, 다형성, 캡슐화
2. 추상화
함수, 변수, 클래스
blackbox같은 내부의 복잡한 원리는 잘 몰라도 필요한 것만 드러내고 쓰는것
User.login()하면 로그인.. 로그인을 어떻게 하는건데?? 그건 좀 복잡하지만 아무튼 로그인 잘하면 그만
User.logout()하면 로그아웃.. 로그아웃을 어떻게 하는건지 모르겠지만 아무튼 로그아웃이 잘 되면 그만
세상에 다양한 사람이 있지만 필요에 따라 Professor와 Student 두 그룹으로 나누는 것
그러면 professor나 student라고 하는 나만의 정의, 모음집이 생겨??
이렇게 복잡하게 정의된 student, professor 코드에서 그냥 student.talk()하면 어떻게 말을 하는건지는 모르겠지만 일단 student가 말을 하고
student의 gpa를 알고싶다면.. 내부에서 어떻게 추적하는지는 잘 모르겠지만 student.gpa하면 그냥 써지는
3. 상속
두 클래스 사이에서 부모 - 자식 관계를 정립하는 것
혹은 상위클래스(super class)와 하위 클래스(sub class)를 정립하는 것
상위클래스의 기능, 행동, 속성 등을 모두 하위클래스에 물려주는 것
상속을하면 하위클래스에서 직접 만든것이 아닌데도 상위클래스의 기능,행동,속성,관계,제약 등 모든 것을 사용 가능
그러므로 코드의 재사용성이 증가함
파이썬의 모든 클래스는 상속이 가능
실제로 모든 파이썬의 class는 맨 꼭대기까지 타고 올라가보면 object를 상속받고 있다
ParentClass로부터 상속받는 ChildClass
4. 왜 상속이 필요한가?
Person이라는 클래스로 학생과 교수라는 instance를 각각 생성하는 코드
이런 경우 학생, 교수 각각의 정보를 나타낼려면 일일이 코드 정의를 해줘야함
class의 경우가 많아지고 정의해야하는 속성들이 많아지면 당연히 비효율적
그래서 일단 student class와 professor class를 정의해보면
talk()라는 instance 메소드가 중복되어 정의되고 있는
다른 class도 많이 만든다고 한다면 중복되는 method가 당연히 많아지면서 비효율적
만약 중복 method인 talk()가 잘못되었다면 ..? 다른 class 100개의 talk()도 전부 고쳐야하는
그래서 상속을 이용해 중복되는 method를 재사용한다
student와 professor에서 공통되는 부분을 뽑아서 상위 class로 만든 다음에
이것을 상속시켜서 각각의 class에 재활용시킨다
그리고 각자 class에서 따로 쓰는 부분은 각자 class에 쓰면 그만
class Student(Person):하면 Person에 존재하는 모든 내용을 Student에서도 사용 가능
p1.talk()하면 p1의 class내부에 talk()이 있는지 확인해보고 없으면 상속받은 부모인 Person class를 확인해봐서 사용함
부모클래스의 변수를 그대로 사용할거면 반드시 자식 클래스에서 다시 선언할 필요는 없음
하지만 필요에 따라 재정의하거나, 똑같이 정의해도 된다
예를 들어 위에서 self.name, self.age부분은 부모 클래스에도 있지만 일단 professor, student 클래스에서도 그대로 사용했다
5. isinstance(object,info)
object가 info의 instance이거나, subclass인 경우 True
6. issubclass(class,classinfo)
class가 classinfo의 subclass인지 검사
bool은 False, True인데 0,1로 바꿀 수 있어서 int의 subclass
float는 int의 subclass가 당연히 아니니까
Professor은 Person에 상속받았으니 subclass이고
isinstance()와 issubclass 모두 classinfo부분이 튜플로도 가능함
isinstance(x,(A,B,C,D,...))는 isinstance(x,A) or isinstance(x,B) or isinstance(x,C),...와 동일함
issubclass도 마찬가지고
실제로도 코드를 보면
bool은 int의 subclass지만, float의 subclass는 아님.. 그렇지만 True or False면 True
마찬가지로 p1은 Professor의 인스턴스로 Person이 부모클래스라 True지만 Student와는 무관하여 False로 True or False니까 True
그리고 isinstance(object,classinfo)에서 첫번째인자 object가 object가 아닌 class 등등이면 반드시 False임
issubclass(class,classinfo)는 첫번째인자 class가 반드시 class여야함
7. super()
자식클래스에서 부모클래스를 사용하고 싶은 경우에 부모클래스를 나타내는 class
부모클래스와 자식클래스간 중복되는 부분이 특히 많을 때, 상당히 효과적
중복되는거 줄이고싶으면 super()를 활용해서
super().__init__(name,age,number,email) 한줄로 작성가능
여기서 super().__init__()안에 self를 쓰면 에러나고
super().__init__()에 name,age,number,email있다고 해서
Student의 __init__ method에서 def __init__(self,student_id)라고만 쓰면 에러나고
근데 부모의 기능,속성 등을 전부 사용할 수 있다면 생성자에 name,age,.. 이런거 써놔야하냐??
상속받았다고 부모의 생성자에서 찾겠지라고 생각하고 자식 클래스에 생성자 정의 안하면 못찾아
그래서 __init__은 뭔가 예외느낌으로 정의해놔야한다고 생각해야하나??
대신 부모꺼 그대로 가져올려면 super().__init__(~~~)
8. 상속 정리
파이썬의 모든 클래스는 최초 object로부터 상속된다(가장 먼 조상이 object)
부모 클래스의 모든 요소(속성, 메소드 등)가 상속된다
super()를 통해 부모 클래스의 요소를 호출할 수 있다
method overriding을 통해 자식 클래스에서 부모 클래스의 내용을 재정의할수있다
상속관계에서 이름 공간은 인스턴스 > 자식클래스 > 부모클래스 이다
변수에 접근을 시도하면 인스턴스 공간을 먼저 탐색하고, 자식 클래스 공간을 탐색하고, 부모 클래스 공간을 탐색해서 변수를 찾는다
9. 다중상속
여러개의 클래스를 상속받는 경우
상속받은 모든 클래스의 요소를 활용 가능함
안되는 언어도 있는데 파이썬은 일단 가능함
여러개의 클래스가 중복된 속성이나 메소드를 가질 수 있는데, 상속 순서가 먼저인경우에 의해 결정된다?
예시)
다음과 같이 Person, Mom, Dad가 정의된 경우
만약 다음과 같이 Dad, Mom을 상속받은 firstchild가 있다면?
Dad와 Mom에 gene가 있는데 만약 baby1.gene을 한다면 Dad를 먼저 상속받은 FirstChild는 Dad의 gene인 XY를 갖는다
근데 당연한게 baby1.gene을 하면 baby1에 있는지 보고, FirstChild에 있는지 보고, 없으면 부모 클래스에서 찾는데 먼저 넣은 Dad를 먼저 보겠지
다음과 같이 순서를 바꾸면 Mom의 gene을 가진다는 것도 확인 가능
10. Method Resolution Order
mro 메소드
class.mro()로 사용
해당 인스턴스의 클래스가 어떤 부모 클래스를 가지는지 확인해주는 메소드
왼쪽부터 가까운 클래스(먼저 상속받는 클래스)
FirstChild는 Dad, Mom 순으로 상속받고 있고 SecondChild는 Mom, Dad순으로 상속받고 있다
그리고 마지막에는 object에 상속받고 있다(모든 클래스는 object가 최초의 조상)
'프로그래밍 > Python' 카테고리의 다른 글
딕셔너리의 메소드 (0) | 2022.08.01 |
---|---|
객체지향프로그래밍이란 6편 -다형성,캡슐화- (0) | 2022.07.31 |
객체지향프로그래밍이란 4편 - method에 대한 모든것- (0) | 2022.07.31 |
객체지향프로그래밍이란 3편 -class를 생성하는 방법과 attribute의 모든 것- (0) | 2022.07.30 |
객체 지향 프로그래밍이란 2편 -객체는 무엇인가- (0) | 2022.07.30 |