ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • '오브젝트' 책 보고 공부하기 - ⑬ 서브클래싱과 서브 타이핑
    JAVA공부/JAVA 2023. 7. 5. 02:35

    1) 타입

    개념관점에서 우리가 인식하는 객체들에 적용하는 개념이나, 아이디어를 가리켜 타입이라고 부른다.

    어떤 대상이 타입으로 분류 될 때, 그 대상을 타입의 인스턴스라고 한다.

     

    타입은 3가지 구성요소로 설명 할 수 있다.

    ● 심볼: 타입에 이름을 붙인것 ex) 침대

    ● 내연: 타입에 속하는 객체들이 가지는 공통적인 속성이나 행동의 집합 ex) 물체를 지탱함.. 

    ● 외연: 타입에 속하는 객체들의 집합 ex) 접이식 침대, 스프링 침대, 그물 침대 등등

     

    프로그래밍 관점에서 타입은 연속적인 비트에 의미와 제약을 부여하기 위해 사용된다.

    타입에 수행될 수 있는 유효한 오퍼레이션 집합을 정의 (연산자 종류 제한)

    타입에 수행되는 오퍼레이션에 대해 미리 약속된 문맥 제공 (+ 나 new 와 같이 약속된 문맥 제공)

     

    객체지향 패러다임 관점에서 타입은 퍼블릭 인터페이스에 의해 결정된다.

    동일한 퍼블릭 인터페이스를 제공하는 객체들은 동일한 타입이다.

     

     


     

    2) 타입 계층

     

    내연, 외연의 관점에서 
    특수화는 다른 타입안에 전체적으로 포함되거나 완전히 내포되는 타입을 식별하는 행위 또는 결과를 가리킨다.

    일반화는 다른 타입을 완전히 포함하거나 내포하는 타입을 식별하는 행위 또는 결과를 가리킨다.


    타입 계층을 구성하는 두 타입 간의 관계에서 일반적인 타입을 슈퍼타입, 더 특수하고 상세한 타입을 서브타입이라 한다.

    퍼블릭 인터페이스 관점에서

    슈퍼타입은 서브타입이 정의한 퍼블릭 인터페이스를 일반화시켜 상대적으로 범용적, 넓은 의미로 정의한것
    서브타입은 슈퍼타입이 정의한 퍼블릭 인터페이스를 특수화 시켜 상대적으로 구체적이고 좁은 의미로 정의한 것

     

     


     

    3) 서브클래싱과 서브타이핑

     

    마틴 오더스키는
    1) 상속 관계가 is-a 관계를 모델링하는가?
        다만 is-a관계는 헛점이 발생할 수 있으므로 유의한다. (새 - 펭귄 의 관계)
    2) 클라이언트 입장에서 부모클래스의 타입으로 자식클래스를 사용해도 무방한가?

    를 모두 허용하는 한에서 상속을 사용하라는 조언을 한다.

     

    결국에 가장 좋은 재사용방법은 합성이다. 합성을 사용하면 인터페이스 변경에 대한 영향을 최소화 할 수 있다.

    B객체가 A객체를 합성을 이용해 사용하고 있을때, A객체의 퍼블릭 인터페이스의 구현내용이 변경되어도

    B객체는 해당 내용에 대해 관여할 필요 없기 때문이다.

    인터페이스를 클라이언트의 기대에 따라 분리함으로써 변경에 의한 영향을 제어하는 설계 원칙을 인터페이스 분리 원칙(ISP)

    라고 부른다.

     

    서브클래싱은 다른 클래스의 코드를 재사용할 목적으로 상속을 사용하는 경우를 말한다. (구현상속, 클래스 상속)

    서브타이핑은 타입계층을 구성하기 위해 상속을 사용하는 경우를 말한다. (인터페이스 상속)

    서브 타이핑 관계를 유지되기 위해서는 행동호환성 을 지켜야한다.
    (자식 클래스가 부모 클래스를 대신할 수 있어야한다. 즉 부모 클래스에 대한 자식클래스의 대체 가능성)

     

     


     

    4) 리스코프 치환 원칙

     

    위에서 얘기한 행동호환성, "서브타입은 그것의 기반타입에 대해 대체 가능해야한다" 와
    클라이언트가 "차이점을 인식하지 못한 채 기반 클래스의 인터페이스를 통해 서브클래스를 사용할 수 있어야한다."

    로 정리할 수 있다.


    책에서는 직사각형과 정사각형이 대체될 수 없는 관계를 보여준다.
    이 예시는 단순히 행동을 오버라이딩 한다고 해서 서브 타이핑이 아니라는 것을 알려준다.

    이는 클라이언트가 기대하는 행동이 다르기 때문이다.

    리스코프 치환 원칙은 클라이언트 관점에서 두 클래스의 관계를 판단하여야 한다고 말한다.

     

    리스코프 치환 원칙은 개방폐쇄 원칙을 지원하는데, 자식 클래스가 클라이언트의 관점에서 부모 클래스를 대체할 수 있다면,
    기능 확장을 위해 자식클래스를 추가하더라도 코드 수정할 필요가 없다.

     

     


     

    5) 계약에 의한 설계와 서브타이핑

     

    클라이언트와 서버 사이의 협력을 의무와 이익으로 구성된 계약의 관점에서 표현하는 것을 계약에 의한 설계라고 부른다.

    계약에 의한 설계는 세가지 요소가 있는데,

     

    ● 사전조건 : 클라이언트가 정삭적으로 메서드를 실행하기위해 만족시켜야하는 것 (Null이 아니거나, 필수 값, 유효성검사 등)

    사후조건 : 서버가 클라이언트에게 보장해야 하는 것 (반환값이 0이상이거나, 빈배열이거나, Null이 아니거나 등)

    ● 클래스 불변식 : 메서드 실행 전과 실행 후 인스턴스가 만족시켜야하는 것

    서브 타입이 리스코프 치환원칙을 만족시키기 위해서는 클라이언트와 슈퍼타입간에 체결된 '계약' 을 준수 해야한다.

     

    서브타입에 오버라이딩된 메서드에 의해 사전 조건이 변경될 수 있는데,
    슈퍼타입보다 더 강력한 사전 조건을 걸 수 없다. (슈퍼에서 성공하던 것이 ex)Null이 들어갈 수 없던게 들어갈 수 있게 됨)

    서브타입은 더 약한 사후 조건을 정의할 수 없다. (위와 동일 ex)0 이상만 반환해주던 것이 음수도 반환하게 됨)

    -> 조건을 반대로 사전조건을 약하게, 사후조건을 강하게는 가능하다.

     

Designed by Tistory.