[오브젝트] Chapter12 다형성

2022. 11. 17. 09:03·아키텍처/OOP

오브젝트

조영호님의 책 오브젝트를 보며 정리한 내용입니다.

문제가 될 시 해당글 삭제하겠습니다.


상속의 목적은 코드 재사용이 아닌, 타입 계층의 구조화를 위해서 사용해야한다.
→ 다형성을 위한 서브타입 계층을 구축하는 것의 진정한 목적을 가지고 있어야만 한다!

 

관점에 따른 상속

  • 데이터 관점의 상속 : 자식 클래스의 인스턴스 안에 부모의 인스턴스를 포함하는 것.
  • 행동 관점의 상속 : 부모 클래스가 정의한 일부 메서드를 자식 클래스의 메서드로 포함하는 것.
    → 런타임에 시스템이 자식 클래스에 정의되지 않은 메서드가 있을 경우, 이 메서드를 부모 메서드에서 탐색한다.
    → 객체의 경우에는 서로 다른 상태를 저장할 수 있도록 인스턴스별로 독립적인 메모리를 할당받아야한다.
    하지만 메서드의 경우에는 동일한 클래스의 인스턴스끼리 공유가 가능하기 때문에, 클래스는 한번만 메모리에
    로드하고 각 인스턴스별로 가리키는 포인터를 갖게 하는 것이 경제적이다.

업캐스팅과 동적 바인딩

  • 업캐스팅 : 부모타입으로 선언된 변수에 자식 클래스의 인스턴스를 할당하는 것이 가능하다.
  • 동적바인딩 : 객체지향 시스템은 메시지를 처리할 적절한 메서드를 컴파일 시점이 아니라 실행 시점에 결정하게 되는데, 이를 통해서 선언된 변수의 타입이 아니라 메시지를 수신하는 객체의 타입에 따라 실행되는 메서드가 결정된다.
  • 객체지향 언어가 제공하는 업캐스팅과 동적 바인딩을 이용하면, 부모 클래스 참조에 대한 메시지 전송을 자식 클래스에 대한 메서드 호출로 변환할 수 있다.

동적 메서드 탐색과 다형성

  • 메서드 탐색은 자식클래스에서 부모클래스로 역방향(자식클래스에 선언된 메서드가 높은 우선순위를 갖는다)으로
    이루어진다.
    → 동적 메서드 탐색은 두 가지 원리로 구성된다.
  1. 자동적인 메시지 위임
  2. 동적인 문맥(동적 바인딩)
  • 이해할 수 없는 메시지
    • 정적 타입 언어와 이해할 수 없는 메시지
      • 정적 타입 언어에서는 코드를 컴파일 할 때 상속 계층 안에 클래스들이 메시지를 이해할 수 없다고 판단하면 컴파일 오류를 발생시킨다.
    • 동적 타입 언어와 이해할 수 없는 메시지
      • 동적 타입 언어에는 컴파일 단계가 존재하지 않기 때문에, 실제 코드를 실행해보기 전까지는 메시지 처리 가능 여부를 판단할 수 없다.
      • 최상위 클래스에서도 메시지를 처리할 수 없다면 예외가 던져진다.
        → 예외 외에도 에러 메시지에 응답할 수 있는 메서드를 만드는 방법도 존재한다.

self 대 super

  • self 참조(C++, C#, Java 에서는 this 라고 부른다) : 객체가 메시지를 수신하면 컴파일러는 self 참조라는 임시 변수를 자동으로 생성 후 메시지를 수신한 객체를 가리키도록 설정한다.
    → 동적 메서드 탐색은 self 가 가리키는 객체의 클래스에서 시작해서 상속 계층의 역방향으로 이뤄지며 메서드 탐색이 종료되는 순간 self 참조는 자동으로 소멸된다.
  • super 의 진정한 의미 : 부모 클래스에 정의된 메서드를 실행하기 위한 것이 아닌, ‘지금 이 클래스의 부모 클래스에서부터 메서드 탐색을 시작하세요’ 가 정확한 의미이다.

'아키텍처 > OOP' 카테고리의 다른 글

[오브젝트] Chapter13 서브클래싱과 서브타이핑  (0) 2022.11.19
[오브젝트] Chapter10, 11 상속과 코드 재사용 / 합성과 유연한 설계  (0) 2022.11.09
[오브젝트] Chapter9 유연한 설계  (0) 2022.11.04
[오브젝트] Chapter8 의존성 관리하기  (2) 2022.11.04
[오브젝트] Chapter7 객체 분해  (0) 2022.11.03
'아키텍처/OOP' 카테고리의 다른 글
  • [오브젝트] Chapter13 서브클래싱과 서브타이핑
  • [오브젝트] Chapter10, 11 상속과 코드 재사용 / 합성과 유연한 설계
  • [오브젝트] Chapter9 유연한 설계
  • [오브젝트] Chapter8 의존성 관리하기
gugbab2
gugbab2
국밥과 커피를 사랑하는 개발자 gugbab2 입니다.
  • gugbab2
    개발하는 프로 국밥러
    gugbab2
  • 전체
    오늘
    어제
    • 분류 전체보기 (52)
      • 프로젝트 (5)
      • 생각정리 (0)
      • Backend (3)
        • 소소한 백엔드 개발 이야기 (2)
        • Spring (1)
        • JPA (0)
      • 언어 (13)
        • Java (13)
      • CS (17)
        • 네트워크 (17)
      • 아키텍처 (14)
        • OOP (14)
        • TDD (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JWT
    Executor
    공부하자
    개발
    리뷰
    설계
    제네릭
    개발자
    스위치
    책
    비동기
    비전공
    프로젝트
    자바
    github
    MC-LAG
    개발블로그
    방화벽
    의존성
    토큰
    언어
    객체지향
    동시성
    네트워크
    하드웨어
    타입
    오브젝트
    새해
    객체
    LACP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gugbab2
[오브젝트] Chapter12 다형성
상단으로

티스토리툴바