[TIL: 0131] 객체지향 프로그래밍2

ryun·2023년 1월 31일
0

TIL

목록 보기
11/34
post-thumbnail

📍 객체 지향 프로그래밍

추상화

  • 현실 세계를 프로그램 설계에 반영
    복잡한 것은 숨기고, 필요한 것만 드러내기

상속

코드의 재사용성을 늘리면서 기능을 확장하기 위한 것

  • 두 클래스 사이 부모-자식 관계를 정립하는 것
  • 클래스는 상속이 가능함
    모든 파이썬 클래스는 object를 상속 받음
  • 하위 클래스는 상위 클래스에 정의된 속성, 행동, 관계 및 제약 조건을 모두 상속 받음
  • 부모클래스의 속성, 메서드가 자식 클래스에 상속되므로 코드 재사용성이 높아짐 (코드도 줄일 수 있다 & 코드가 구조적으로 더 깔끔)중복되는 부분은 부모 클래스로 올려버리고 아래에 각 특성에 따라 상속받는다 > 코드가 구조적으로 더 깔끔

상속 관련 함수와 메서드

  • isinstance(object, classinfo)
    인스턴스거나 subclass인 경우도 True 출력
  • issubclass(class, classinfo)
    class가 classinfo의 subclass면 True
    classinfo의 모든 항목을 검사클래스인포라서 (Person 이기도 하고 Student 이기도 하니?) 라고 들어올 수도 있다
    *bool은 참거짓을 0과 1로 표현할 수 있기 때문에 int의 subclass이다
  • super
    자식 클래스에서 부모 클래스를 사용하고 싶은 경우

상속 정리

파이썬의 모든 클래스는 object로 부터 상속된다. 부모 클래스의 모든 요소(속성(변수)과 메소드)가 상속된다
super()를 통해 부모 클래스의 요소를 호출할 수 있다
메서드 오버라이딩을 통해 자식 클래스에서 재정의가 가능하다
상속관계에서의 이름 공간은 인스턴스 자식 클래스, 부모클래스 순으로 탐색한다

다중 상속

두개 이상의 클래스를 상속 받는 경우
상속받은 모든 클래스의 요소를 활용 가능함
중복된 속성이나 메서드가 있는 경우 상속 순서에 의해 결정된다

다중상속일 때는 상속의 순서가 중요하다
나한테 메소드가 있으면 내꺼 먼저 사용
누가 먼저 상속받았냐? Dad
따라서 아빠껄 먼저 사용


- mro 메서드 (Method Resolution Order) 해당 인스턴스의 클래스가 어떤 부모 클래스를 가지는지 확인하는 메서드 기존 인스턴스 > 클래스 순으로 이름 공간 탐색하는 과정에서 상속 관계에 있으면 인스턴스 > 자식 > 부모로 확장 뒤로 갈수록 더 높은 클래스 `print(Class명.mro())`

다형성

각자의 특성에 따라 다른 결과를 얻는 것

  • 여러 모양을 뜻하는 그리스어
  • 동일한 메서드가 클래스에 따라 다르게 행동할 수 있음을 의미
  • 서로 다른 클래스에 속한 객체들이 동일한 메시지에 대해 다른 방식으로 응답할 수 있음

메서드 오버라이딩

  • 상속받은 메서드를 재정의
    부모 클래스에서 정의한 메서드를 자식 클래스에서 덮어씀
    메서드와 기본 기능은 그대로, 특정 기능 바꾸고 싶을 때 사용같은 이름이지만 동작이 다르다. super() 상위 클래스를 사용하고 아래에 또 프린트 추가로 출력

캡슐화

데이터 보호하기

  • 클래스 안쪽의 데이터들은 클래스 안쪽에서만 변경할 수 있어야 한다
  • 객체 내부를 외부에서 직접적으로 접근하는 것을 차단한다
  • 파이썬에서 암묵적으로 존재하지만, 언어적으로 존재하지 않는다(벗어나면 에러가 떨어지는 엄격한 로직은 아니다)

직점 접근
개발자의 휴먼 에러를 막기 위한 것이다
웹 개발할 때 모든 유저는 악성유저 라는 것 전제 하에 유효성 검사를 해야 한다
접근 제어자를 보여주지 않으면 휴먼 에러가 날 수 있다
이를 최대한 방지 하기 위해 접근 제어자를 사용

접근 제어자 종류

  • Public Access Modifier : 모두 가능
  • Protected Access Modifier : 상속 관계에서만 가능
  • Private Access Modifier : 나만 가능

Public Member

  • 언더바 없이 시작하는 메서드나 속성
  • 어디서나 호출이 가능, 하위 클래스 override 허용
  • 일반적으로 작성되는 메서드와 속성의 대다수를 차지

Protected Member

  • 언더바 1개로 시작하는 메서드나 속성
  • 암묵적 규칙에 의해 부모 클래스 내부와 자식 클래스에만 호출 가능
  • 하위 클래스 override 허용
  • 개념적으로만 존재하기 때문에 접근해도 접근은 되지만 쓰면 안좋은 방식

퍼블릭이 아니면 메서드를 통해서 접근하고 변경하는 것이 좋다
프로텍티드를 변경하고 싶다면 메소드를 또 만들면 된다

def set_age(age):
	self._age = age

하나 줄래? 해서 받는 것
변경해줄래? 해서 변경하는 것

Private Member

  • 언더바 2개로 시작하는 메서드나 속성
  • 본 클래스 내부에서만 사용이 가능
  • 하위 클래스 상속 및 호출 불가능(오류)
  • 외부 호출 불가능(오류) > AttributeError가 난다
    메소드에서 실제 값을 변경하기 전에 검증 로직을 넣을 수 있다

getter 메서드와 setter 메서드

  • 변수에 접근할 수 있는 메서드를 별도로 생성
    getter 메서드 : 변수의 값을 읽는 메서드 (@property)
    setter 메서드 : 변수의 값을 설정하는 성격의 메서드 (@변수.setter)

더 쉽게 하기 위한 방법

  • @property 데코레이터 사용
  • @변수.setter 사용마치 내부에 age라는 퍼블릭 변수가 있는 것처럼 생각이되고 쓸 수 있게 된다

📍 에러와 예외처리

디버깅

잘못된 프로그램을 수정하는 것
de(없앤다) + bugging(버그)

  • 에러 메시지가 발생하는 경우
    해당 위치를 찾아 메시지를 해결
  • 로직 에러가 발생하는 경우
    정상 동작했던 코드 이후 작성된 코드를 생각해봄
    전체 코드 확인
    누군가에게 설명

에러와 예외

  • 문법 에러
  • 예외
    예상치 못한 상황을 맞이하면 프로그램 실행을 멈춤
    실행 중에 감지되는 에러들을 예외라고 부름

0개의 댓글