ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • '오브젝트' 책 보고 공부하기 - (부록B) 타입 계층의 구현
    JAVA공부/JAVA 2023. 7. 19. 01:57

    1) 다양한 타입 계층 구현

     

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

     

    타입을 구현할 수 있는 방법이 단 한가지 방법만 존재하는 경우 타입과 클래스를 동일하게 취급한다.

    만약 Car라는 클래스와 인터페이스는 동일하지만 다른방식으로 구현해야 하는 객체가 필요하다면 

    즉, 구현은 다르지만 동일한 타입으로 분류되는 객체가 필요하면 상속을 이용하면 된다.

     

    그러나, 자식클래스를 부모 클래스의 구현에  강하게 결합시키기 때문에 구체 클래스를 상속받는 것을 피하고

    추상 클래스, 인터페이스를 이용해야한다.

    그리고 대부분의 언어에서의 클래스의 다중 상속을 지원하지 않기 때문에 다양한 타입으로 사용이 불가능하다.

     

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

     

    위에서 발생하는 다중 상속 지원하지 않는 문제와, 결합도 문제를 피할 수 있는 방법은 인터페이스를 이용하는 것이다.

    인터페이스를 이용하면 다음과 같은 사실을 알 수 있다.

    1. 여러 클래스가 동일한 타입을 구현할 수 있다. 

    2. 하나의 클래스가 여러 타입을 구현할 수 있다.

     

     

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

     

    상속을 이용하지만 결합도로 인한 부작용을 피하는 방법은 추상 클래스를 이용하는 방법이다.

    부모와 자식 클래스 모두 추상 메서드에 의존하게 함으로써 의존성 역전 원칙을 따르게 할 수 있게 되며,

    구체 클래스와 달리 추상 클래스는 상속을 염두에 두고 설계된 클래스이기 때문에 자신의 인스턴스를 직접 생성이 불가능하며,

    자식클래스를 통해 추상메서드를 구현함으로써 상속계층을 쉽게 확장하고 결합도를 인한 부작용을 방지할 수 있다.

     


     

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

     

    인터페이스를 통해 타입을 정의하면 다중 상속 문제를 해결 할 수 있으나, 중복 구현코드에 대한 문제가 여전히 남아있다.

    java 8 이전버전에서는 중복 구현 코드를 제거하기 어렵기 때문에 인터페이스를 이용해 타입을 정의하고

    특정 상속 계층에 국한된 코드를 공유할 필요가 있을 경우에

    이 인터페이스를 상속받은 추상 클래스를 이용해 코드 중복을 방지 하는것이다.

    이런 형태로 추상 클래스를 사용하는 방식을 골격 구현 추상 클래스라고 부른다.

     

    다만 설계 복잡성이 필요하지 않는 경우 타입을 정의하기 위해 인터페이스나 추상클래스중 하나를 선택해서 사용하는 것이 낫다.

    단일 상속 계층을 타입계층 구현하고 싶으면 추상클래스를, 그 외 상황이라면 인터페이스를 사용하는것을 고려하라.

     

     


    3) 덕 타이핑

     

    덕 타이핑은 주로 동적 타입 언어에서 

    "어떤 새가 오리처럼 걷고, 오리처럼 헤엄치며, 오리처럼 꽥꽥 소리를 낸다면 나는 이 새를 오리라고 부를 것이다." 

    - 제임스 윗콤릴리

    의 덕테스트를 프로그래밍 언어에 적용한 것인데, 설명하자면

    어떤 대상의 행동이 오리와 같다면 그것은 오리라는 타입으로 취급해도 무방하다는 것이다.

     

    아쉽게도 자바같은 대부분의 정적타입 언어세어는 덕 타이핑을 지원하지 않는다.

    (자바에서는 코드상에 같은 타입으로 명시적 정의가 되어있어야한다.)

     

    덕타이핑은 코드의 유연한 설계를 얻을 수 있지만, 컴파일 시점에 발견할 수 있는 오류를 실행 시점으로 미루게 되기 때문에

    코드의 안전성은 떨어질 수 있다.

     

    C++에서는 template이라는 것을 이용해 타입안전성을 보장해준다. 다만 내부적으로 컴파일러가 개별적 함수를 만들어서

    체크를 해주기 때문에 프로그램의 크기가 커질 수 있다.

     


    4) 믹스인과 타입 계층

     

    믹스인은 객체를 생성할 때 코드 일부를 섞어 넣을 수 있도록 만들어진 일종의 추상 서브클래스이다.

    믹스인을 사용하는 목적은 다양한 객체 구현안에서 동일한 행동을 중복코드 없이 재사용 할 수 있게 만드는 것이다.

    스칼라에서 제공하는 Ordered 트레이트는 내부적으로 추상 메서드 compare을 통해

    <, >, <=, >= 의 연산자를 구현해주는데,

     

    이 연산자를 추가하고 싶은 클래스에 해당 트레이트를 믹스인 하고, compare 메서드만 오버라이딩 해주면 비교 연산자에

    대한 인터페이스를 손쉽게 얻을 수 있다.

    간결한 인터페이스를 풍부한 인터페이스로 만들 수 있는 효과를 가진다.

     

    자바 8 에서도 디폴트 메서드 가 추가 되어있는데, 인터페이스에서 기본 구현을 추가할 수 있도록 했다.

    이제 추상 클래스를 사용하지 않고 인터페이스를 상속받는 것만으로도 중복코드제거한 코드 구현을 할 수 있다.

     

    하지만 인터페이스에서 메서드 구현 내의 메서드를 사용하기 위해서는 인터페이스에 오퍼레이션이 추가되어야 한다. 

    게다가 이 오퍼레이션은 인터페이스에 정의되기 때문에 퍼블릭 메서드로 구현되어야해서

    가시성이 private 혹은 protected가 될 수 없다.  즉, 캡슐화를 약화시킨다.

     

    사실 자바 8에서 디폴트메서드를 추가한 이유가 추상클래스를 대체하려는 것이 아닌 

    기존에 널리 사용되고 있는 인터페이스에 새로운 오퍼레이션을 추가할 경우에 발생하는 하위 호환성 문제를

    해결하기 위해서이다.

     

     

     

Designed by Tistory.