어댑터 패턴은 현실의 어댑터랑 같은 의미를 가진다.
서로 호환되지 않는 두 클래스를 호환되도록 하는 것.
우리가 유럽에 가면
110v -> 220v 어댑터가 필요한 것과 같은 개념이다 ㅎㅎ
애초에 두개의 인터페이스가 달라서 호환이 안된다면,
하나를 바꿔서 되게 하던지,
아니면 둘다 바꾸면 되지 않나?
예를 들어, 외부에서 이미 구현된 인터페이스를 제공받는 상황을 생각해보자
이미 구현되어 있는 것을 사용해야하는데 현재 개발 요구사항과 인터페이스가 안맞는다.
이런 상황에서 필요한 패턴이다.
어? 그러면 우리쪽 인터페이스를 제공받은것에 맞춰서 수정하면 되지 않나??
가능할 수 있지만 바꾸려는 우리쪽 인터페이스를 우리 시스템의 다른 어딘가에서 사용하고 있다면?
그 부분도 수정해줘야 한다.
우리쪽 인터페이스를 수정하고,
이에 영향을 받는 부분들을 수정하다가 예기치 못한 오류가 발생할 가능성이 매우 크다.
어댑터 패턴이 적용된 가장 대표적인 예가 자바의 InputStreamReader
이다.
콘솔에서 입력을 받을 때 다음과 같은 코드를 자주 쓴다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.in: bytes stream으로 데이터를 읽어옴
BufferedReader: character stream으로 데이터를 읽어옴
헉 System.in이 실제로 제공하는 것과 BufferedReader가 기대하는 값이 다른데 이를 어떻게 해결할까?
-> 어댑터를 이용해서 해결 !
InputStreamReader가 바로 그 어댑터 역할을 한다. 해당 클래스 코드에서 다음과 같은 주석이 달려있다. "An InputStreamReader is a bridge from byte streams to character streams." 또, 구현된 코드를 보면 Adaptee인 System.in을 wrap하고 있는걸 확인할 수 있다!