Base/Python

[Python] 파이썬 기초 11 - 객체의 4대 특성 ( 상속화, 캡슐화, 다형성, 추상화)

반응형

# 객체의 4대 특성

1.<캡슐화>

말 그대로 캡슐로 보호하듯이 외부에서 데이터에 대한 접근을 막는 것이다.

이것을 인캡슐레이션이라고 한다. 데이터에 대한 접근을 get / set으로 만 하게끔 한다. 

변수명 앞에 _ 이것을 두 개 붙이면 __ private 개념으로 적용된다. 해당 class? 공간에서만 변수를 건들 수 있고 이외에서는 건들 수 없다.

__ 이게 없을 때는 public 개념이다. 모든 곳에서 해당 변수를 사용할 수 있다.

 

 

 

이렇게 get / set을 제외하고는 해당 변수를 다시 설정할 수 없는 식으로 만든다. 저 year값을 caller 부분에서 임의로 꺼낼 수 없다. 

get에서는 값을 가져오고 set에서는 값을 재설정한다. 이렇게 값을 설정한다.

 

 


2.<상속> + <다형성>

 

부모 클래스에서는 자식클래스에 있는 변수나 함수를 사용하지 못하지만 자식클래스는 부모클래스에 대한 접근이 가능하다. 그래서 부모에 따른 객체를 생성하지 않더라도 자식 클래스에서는 부모 클래스를 아무런 제약 없어 접근해서 쓸 수 있다. 

 

오버 라이딩 - 자식이 부모 함수를 다시 재정의해서 사용한다. 상속에서만 나오는 개념이다. 

오버 로딩 - 부모의 함수의 메서드에 매개변수나 / 타입 / 리턴 값을 다르게 줘 사용한다. 

 

부모가 가진걸 자식 쪽에서 상속받아서 사용한다. 

상속은 클래스의 매개변수를 클래스로 받는 것으로 상속을 받는다. 

객체를 생성한 후 부모가 가지고 있는 함수를 사용할 수 있다. ( getState() )

 

 

 

부모 생성자 호출하는 경우

이렇게 부모의 생성자를 호출해서 사용 가능하다. 

사용할 때는 super()를 통해 가져오고 super().__init__ 부모의 생성자인 __init__을 가져온다. 그 후 해당 매개변수를 넣어준다. 

그리고 자신의 변수는 따로 self로 정의해준다. 

 

 

 

예제문제 

 

 

<다중 상속>

파이썬은 다중상속을 권장하지 않는다. 

 


4.추상화

 

oop의 마지막 컨셉은 추상화가 있다. 부모에서 자식으로 내려올수록 구체화되고 자식에서 부모쪽으로 올라갈 수록 추상화 된다. 

상위클래스의 역할은 자식들에게 퍼주는 역할이다. 부모로서의 역할을 한다.

부모 클래스에서 추상메소드라는 것을 정의 할 수잇다. 

함수라는것은 반드시 구현부가 있어야한다. 근데 클래스에서는 구현부가 없는 함수를 가질수 있다. 

구현부가 없는 클래스는 추상클래스가 되고 이 추상클래스를 상속받는 하위 클래스는 부모의 정의되어 있는 추상클래스들을 구현화해야한다 (오버라이딩 해야한다.)

이건 강제성을 띄우고 안할경우 에러를 반환한다. 

추상화를 하는이유는 일정한 틀 or 형식을 유지하게끔 한다. 

부모 클래스에서 함수 부분에 비어있는 바디를 만들어놓고 자식클래스에게 함수 구현이라는 강제성을 띄운다. 자식들은 이걸 반드시 오버라이딩 해야 된다.  단 함수의 이름은 부모의 이름을 따르게끔 강제한다.

이렇게 강제함으로써 일정한 틀을 유지하게끔 한다. 어느정도의 표준을 제공한다고 보면 될 것 같다. 

 

@absractmethod 를 사용함으로서 추상클래스를 사용한다는 선언을 한다 

이와 더불어 class에서 받는 매개변수를 metaclass = ABCMeta 를 받아준다. 이런 문법형식을 따른다.

 

# 추상클래스(객체 생성이 불가하다.)

# 메서드의 목록만 가진 클래스

# 상속받는 클래스에서 메서드 구현을 강제하기 위해서 사용하는 문법

 

 

# 일반 클래스는 객체 생성이 바로 가능하지만 추상 메소드는 인스턴스 생성이 안된다.

# Can't instantiate abstract class Base with abstract methods goToAcademy, study

# 클래스에 대해 객체 생성을 했을때

# base = Base()

# 자식클래스에서 하나만 오버라이딩 했을때

# base = BaseSub() # Can't instantiate abstract class BaseSub with abstract methods goToAcademy

# print(base)

추상 메소드에 대한 모든 구현을 해야 객체를 생성 할 수 있다.

 

반응형