본문 바로가기

자기 개발/Java

추상클래스 와 인터페이스 차이2

추상 클래스 와 인터페이스 의 차이점_2

추상 클래스와 인터페이스 의 General 한 차이점 

- 추상 클래스는 구현된 메소드 (메소드 몸체 코드가 있는 ..) 를 포함할 수 있는 반면 , 인터페이스는 그렇지 못하다.

- 추상 클래스로 정의된 타입을 구현하는 클래스는 반드시 추상 클래스의 서브 클래스가 되어야 합니다 . 반면 인터페이스를 구현하는 클래스의 경우는 , 인터페이스에 정의된 모든 메소드를 구현하고 , 인터페이스 구현 계약을 지키면 됩니다. 즉 클래스 상속 계층과는 무관 

-클래스 간의 상속은 단일상속만을 허용하므로 , 추상 클래스로 타입을 정의할 때는 심한 제약이 따른다.  반면 인터페이스를 구현하는 것은 매우 쉽다.


어떤 점에서 interface 가 abstract class 에 비해 좋은가?
-
공개한 각각의 중요한 인터페이스와 연관시킨 골격 구현 클래스를 제공하여 인터페이스와 추상 클래스의 장점을 결합 할 수 있다.  골격 구현 클래스의 작명 규칙은 AbstractInterface 이며 자바의 컬렉션 프레임워크에서 종종 볼수 있다(AbstractSet, AbstractList, AbstractMap) 

static List<Integer> intArrayAsList(final int[] a) {
   return new AbstractList<Integer>() {
       public Integer get(int i) {
          return a[i]; // 오토박싱
        }  
       @Overrider
       public Integer set(int i, Integer val) {
           int oldVal = a[i];
           a[i] = val;  //오토언박싱
           return oldVal;   //오토박싱
        }
        public int size() {
          return a.length;
        }
    }
}

익명 클래스를 이용 골격 추상 클래스를 구현하여 메소드에서 넘겨주고 있다.
이는 *Adapter 설계 패턴으로 복잡한 List 인터페이스를 쉽게 구현 가능하게 해준다.
골격 클래스를 사용하면 추상 클래스로 타입을 정의할 때 발생하는 과도한 제약에 해당 하지 않는

추상 클래스를 구현하는데 도움을 줄 수 있다. 

*Adapter 패턴 : 기존 클래스를 변경없이 좀더 광범위하게 사용 할 수 있도록 하는것


화장실의 변기를 생각해 보면

그 사이즈와 기능은 잘 맞게 디자인 되어 있다.

또한 앞으로도 그 형태와 기능이 바뀔 가능성이 거의 없다.

아장 아장 걷는 어린 아이를 위한 변기는 아답터의 좋은 예다.

기존의 변기위에 올려 놓은 작은 변기는 어린이를 위한 새로운 기능를 담당하고,

오리지널 변기 또한 어른을 위한 기능을 수행한다.


골격 클래스 작성은 간단하다.

대상이 되는 인터페이스를 파악하고, 구현할 메소드와 그대로 둘 메소드를 결정 후 그대로 둘 메소드가 추상 메소드가 될것이다. 

public abstract class AbstractMapEntry<K,V> implements Map.Entry<K,V> {
      //기본 메소드 
      public abstract K getKey();
      public abstract V getValue();
      //이 메소드는 반드시 오버라이드 해야 됨
      public V setValue(V value) {
          throw new UnsupportedOperationException();
      }
      //구현 추상메소드들
     @Overrider
     public int hashCode() {
        return  hashCode(getKey()) ^ hashCode(getValue());
     }
     private static int hashcode(Object obj) {
        return obj == null ? 0 : obj.hashCode();
     }
}

 

요약하면
인터페이스는 구현하는 타입을 정의하는데 있어 가장 좋은 방법이며 추상 클래스보다는 제약이 없다.
그러나 유연성과 능력보다는 진화가 더 중요시 된다면 추상클래스를 더 고려해야 되며
둘의 장점을 합칠수 있는 골격 클래스 구현을 적극 검토하자.