오브젝트 - 부록 B 타입 계층의 구현

yshjft·2023년 12월 20일
0

오브젝트

목록 보기
17/18
  • 타입은 개념의 분류
  • 클래스는 타입을 구현하는 한 가지 방법

클래스를 이용한 타입 계층 구현

  • 상속은 자식 클래스를 부모 클래스의 구현에 강하게 결합시키기 때문에 구체 클래스를 상속받는 것은 피해야 한다.
  • 가급적 추상 클래스를 상속받거나 인터페이스를 구현하는 방법을 사용해야 한다.

인터페이스를 이용한 타입 계층 구현

  • 상속으로 인한 결합도 문제와 다중 상속 구현 제약을 해결하기 위해 인터페이스를 사용한다.
  • 여러 클래스가 동일한 타입을 구현할 수 있다.
  • 하나의 클래스가 여러 타입을 구현할 수 있다.
  • 타입은 동일한 퍼블릭 인터페이스를 가진 객체들의 범주이다.
  • 클래스는 타입에 속하는 객체들을 구현하기 위한 구현 매커니즘이다.
  • 중요한 것은 클래스 자체가 아니라 타입이다.
    • 타입이 식별된 후에 타입에 속하는 객체를 구현하기 위해 클래스를 사용하는 것이다.
    • 타입을 중심으로 객체를 설계해야 한다

추상 클래스를 이용한 타입 계층 구현

  • 구체 클래스 보다 추상 클래스를 사용하는 것이...
    • 유연하고 변화에 안정적인 코드를 만들 수 있다.
    • 결합도를 낮추고 결합도로 인한 부작용을 낮출 수 있다.

추상 클래스와 인터페이스 결합하기

  • 골격 구현 추상 클래스
    • 인터페이스와 추상 클래스를 함께 사용하는 방법
    • 인터페이스를 이용해 타입을 정의하고 특정 상속 계층에 국한된 코드를 공유할 필요가 있을 경우에는 추상 클래스를 이용해 코드 중복을 방지하는 것
    • 다양한 구현 방법이 필요한 경우 새로운 추상 클래스를 추가해서 쉽게 해결할 수 있다.
    • 이미 부모 클래스가 존재하는 클래스라고 하더라도 인터페이스를 추가함으로써 새로운 타입으로 쉽게 확장할 수 있다.
  • 상속 계층에 얽매이지 않는 타입 계층이 요구되는 경우 인터페이스로 정의
  • 추상 클래스로 기본 구현을 제공하여 중복 코드를 제거하라
  • 복잡성이 필요하지 않다면 타입을 정의하기 위해 인터페이스나 추상 클래스 둘 중 하나만 사용하라

덕 타이핑 사용하기

  • 객체가 어떤 인터페이스에 정의된 행동을 수행할 수만 있다면 그 객체를 해당 타입으로 분류한다.
  • 동적 타입 언어에서는 시그니처가 동일한 메서드를 가진 크래스는 같은 타입으로 취급할 수 있다.
  • 정적 타입 언어에서는 지원하지 않는 방식이다.
    • 객체의 퍼블릭 인터페이스만으로 타입을 추측하는 것이 불가능하다.
    • c++의 경우 template을 이용하여 덕 타이핑을 사용할 수 있다.
      • 이를 통해 타입 안정성과 유연한 코드를 얻을 수 있다.
      • 다만 이는 거대한 크기의 프로그램을 가지는 문제가 있다.
  • 덕 타이핑에서 강조되는 것은 타입이 행동에 대한 것이라는 거다.
    • 객체가 동일하게 행동한다면 내부 구현이 어떤 방식이든 상관 없다.
    • 클래스나 인터페이스에 대한 의존성을 메시지에 대한 의존성으로 대체한다. 이를 통해 낮은 결합도를 유지하고 변경에게 유연한 코드를 만들 수 있다.

정적 타입 언어, 동적 타입 언어, 메서드 시그니처

  • 정적 타입 언어
    • 자료형을 컴파일 할 때 결정.
    • 속도와 안정성이 뛰어나다.
    • ex) Java 등
  • 동적 타입 언어
    • 자료형이 실행 시에 결정.
    • 좀 더 유연한 코드 작성을 가능하게 한다.
    • ex) Javascript 등
  • 메서드 시그니처
    • 메서드 이름 & 파라미터 리스트

믹스인과 타입 계층

  • 객체를 생성할 때 코드 일부를 섞어 넣을 수 있도록 만들어진 일종의 추상 서브클래스
  • 코드를 재사용하는 객체들은 동일한 행동을 공유하게된다.

디폴트 메서드

  • 자바 8에 추가
  • 코드에 재사용성이라는 혜택을 그대로 누리면서도 특정한 상속 계층에 얽매이지 않는 인터페이스의 장점을 유지할 수 있다.
  • 디폴트 메서드는 public 메서드로 작성되야 한다.
    • 디폴트 메서드를 사용해 추상 클래스를 대체할 경우 인터페이스가 불필요하게 비대해지고 캡슐화가 악화될 수도 있다.
    • 디폴트 메서드는 기존에 널리 사용되고 있는 인터페이스에서 새로운 오퍼레이션을 추가할 경우에 발생하는 하위 호환성 문제를 해결하기 위함이다.
profile
꾸준히 나아가자 🐢

0개의 댓글