(Effective Java) Item24 퍼펙트 어택. 어댑터 패턴

제24조. 가능할 때마다 멤버 클래스를 정적으로 만드십시오.

“p.147. 어댑터”

(유효한 자바) 항목24. 가능할 때마다 멤버 클래스를 정적으로 만드십시오. (history.com)

(유효한 자바) 항목24. 가능할 때마다 멤버 클래스를 정적으로 만드십시오.

(유효한 자바) 항목23. 태그가 지정된 클래스 대신 클래스 계층 구조를 사용하십시오. 중첩 클래스는 다른 클래스 내부에 정의된 클래스입니다.

중첩 클래스는 둘러싸는 외부 클래스 내에 중첩됩니다.

hyejin.tistory.com

비정적 멤버 클래스는 어댑터를 정의할 때 주로 사용한다고 합니다.

이때 어댑터 패턴이란?

: 기존 코드를 클라이언트가 사용하는 인터페이스 구현으로 바꾸는 패턴입니다.

말한다

즉, 코드를 재사용하기 위해 구조를 바꾸는 패턴입니다.


(Effective Java) Item24 퍼펙트 어택. 어댑터 패턴 1

클라이언트에서 사용하는 인터페이스와 일치하지 않는 기존 코드를 재사용할 수 있습니다.

public class AdapterInJava
{
   public static void main(String() args)
   {
      // 어댑터 패턴의 대표적인 예제
      try (InputStream is = new FileInputStream("number.txt");
          InputStreamReader isr = new InputStreamReader(is);
          BufferedReader reader = new BufferedReader(isr))
      {
         while (reader.ready())
         {
            System.out.println(reader.readLine());
         }
      }
      catch (IOException e)
      {
         throw new RuntimeException(e);
      }
   }
}

InputStream, InputStreamReader 및 BufferedReader는 어댑터 패턴을 사용하는 일반적인 예입니다.

public class MySet<E> extends AbstractSet<E>
{
   @Override
   public Iterator<E> iterator()
   {
      return new MyIterator();
   }
   
   @Override
   public int size()
   {
      return 0;
   }
   
   // 어댑터 패턴
   private class MyIterator implements Iterator<E>
   {
      @Override
      public boolean hasNext()
      {
         return false;
      }
      
      @Override
      public E next()
      {
         return null;
      }
   }
}

그리고 MyIterator도 어댑터 패턴을 사용한 예입니다.

정리하다

어댑터 패턴은 기능상 올바르게 작동하는 코드를 단순히 인터페이스 차이 때문에 사용할 수 없을 때 흔히 사용되는 패턴입니다.

기존 코드에 버그가 있거나 수정 작업이 필요한 경우에도 유용합니다.

어댑터 패턴은 실제로 널리 사용되며 이전 레거시 코드 또는 라이브러리를 재사용할 때 유용합니다.

그리고 서로 호환되지 않는 인터페이스와 코드를 결합하여 응용 프로그램에서 작업하는 데 도움이 됩니다.