디자인 패턴 두번째 포스팅은 어댑터 패턴이다,
몇년 전 학교에서 패턴 수업을 들을 때 부터 난 이 어댑터 패턴이 참,, 힘들었던 것 같다 ㅜ
여러 블로그를 뒤졌서 작성했지만 영 맘에 들지 않아서 2년전 들었던 수업 교안을 꺼내 다시 정리해본다!
암튼 시작해보자!
뻔한 설명이지만,, 또 뻔할 뻔자로 설명해보자면 ;;
해외에 나갈 때 전압을 맞추기 위해 가져가는 어댑터를 떠올리자!
가지고 있는건 220v 아이폰 충전기인데 꽂으려고 보니 돼지코더라~ 그럼 뭐다? 어댑터에 꽂아서 연결한다~
즉, 어댑터 패턴의 의도란,
코드의 재사용성을 높이는 패턴이다!
💡레거시란? (내가 몰라서 찾아봄,, ㅎ)
레거시 시스템(legacy system)은 낡은 기술이나 방법론, 컴퓨터 시스템, 소프트웨어 등을 말한다. 이는 현대까지도 남아 쓰이는 기술을 부르는 말일 수도 있지만, 더이상 쓰이지 않더라도 현대의 기술에 영향을 주는 경우도 포함힌다
(from, 위키트리, 아하? 옛날꺼 생각하면 될듯 ㅎ)
만약 기존에 A 프로토콜 라이브러리를 사용중이었는데, 새로운 시스템의 B 프로토콜 구축에 A 라이브러리를 이용하려 한다면?
단순하게 A를 B로 대체해??
아 잠시, 그러면 기존의 클라이언트 코드 전체에 작성되어 있는 A 관련 코드를 여기저기서 다~ 찾아가지고 B로 고치고 되나 빌드 해보고,, 분명히예외 상황이며,, 에러며,, 겁나 뜰 것이고~ 생각만해도 골치아프고 ;;; 할일 겁나 많아지는 상황 🤮🤮🤮 ;;
대신!
기존의 클라이언트 코드를 그대로 유지하면서 B 프로토콜의 인터페이스를 A 프로토콜의 인터페이스로 변환하는 방법을 사용해 보자~
하지만 B 프로토콜의 코드를 직접 변경할 수는 없기 때문에! 클라이언트 코드와 B 프로토콜 사이의 중재자 역할을 하는 새로운 클래스 (Adapter) 를 작성하여 사용한다!!
개굿 ㅎㅎ
조금 더 구체적인 예시로 설명해보자,
Shape라는 상위 클래스를 상속한 Point, Line, Square 클래스가 있다.
클라이언트는 이들을 사용할 때 점인지, 선인지, 사각형인지 알 필요 없이 그저 도형 중 하나로만 사용을 하게 된다.
근데 만약에 이때 비슷한 듯 다른 요상한 클래스 XXCircle을 사용하려 한다면? 같아 보이지만 조금씩 다른 메소드, displayIt, fillIt, undisplayIt 이 원하는 것에 가깝지만 사용할 수 없고, 다시 코드를 작성하기도 싫은 상황이다.
이럴 때! XXCircle을 덧씌우는 어댑터 클래스를 작성하여 기존 코드, 새로운 XXCircle 클래스 코드 변경 없이 XXCircle 코드를 사용할 수 있도록 한드아~ (Adapter 패턴이 Wrapper 패턴이라고도 불리는 이유!)
이러한 어댑터 패턴의 구현 방법은 크게 두가지로 나뉜다,
1. 클래스 어댑터 - 상속을 이용한 어댑터 패턴
2. 객체 어댑터 - 위임을 이용한 어댑터 패턴
adapter가 target, adaptee를 모두 상속한 형태
java 에서는 다중상속을 지원하지 않기 때문에 구현이 복잡할 수 있음
target을 상속한 adapter 가 클래스 변수로 adaptee를 가지고, 해당 프로퍼티를 통해서 메소드를 호출하는 형태
상속을 이용한 구현에 비해 보다 편리 할 수 있다
이제야,, 이해가 되는 어댑터 패턴!! 고약한놈,, 2년만에 친해진 느낌이네 ;;
해당 포스팅과 관련된 문제는 댓글이나 메일로 알려주세요~!