어댑터 패턴은 객체 지향 프로그래밍에서 중요한 디자인 패턴 중 하나입니다. 어댑터 패턴은 서로 다른 인터페이스를 가진 두 개의 클래스를 연결하여 함께 동작할 수 있도록 하는 패턴입니다. 이 패턴은 기존의 코드를 수정하지 않고 새로운 클래스를 추가하여 기능을 확장할 수 있도록 해줍니다.
어댑터 패턴의 예
예를 들어, iOS 애플리케이션을 개발 중이라고 가정해 봅시다. 기존에 사용하던 데이터베이스 라이브러리가 변경되었고, 이제는 외부 API와 통신하여 데이터를 가져와야 하는 상황이라고 가정해 봅시다. 이때 기존의 데이터베이스 라이브러리를 외부 API와의 통신에 맞도록 쉽게 연결할 수 있도록 어댑터 패턴을 사용할 수 있습니다.
어댑터 패턴의 장점
어댑터 패턴을 사용하면 기존의 코드를 수정하지 않고도 새로운 기능을 확장할 수 있습니다. 또한, 코드 재사용성이 높아지고 유지보수가 쉬워지는 장점이 있습니다.
어댑터 패턴의 구성 요소
어댑터 패턴은 주로 다음과 같은 구성 요소로 이루어집니다:
- 타겟 인터페이스 (Target Interface): 어댑터 패턴을 적용하기 위한 인터페이스
- 어댑터 (Adapter): 타겟 인터페이스와 연결되는 클래스
- 어댑티 (Adaptee): 어댑터가 연결할 대상이 되는 클래스
어댑터 패턴의 구현
어댑터 패턴을 구현하기 위해서는 먼저 타겟 인터페이스와 어댑티 클래스를 정의하고, 그 다음에 어댑터 클래스를 구현해야 합니다. 어댑터 클래스는 타겟 인터페이스를 구현하고, 어댑티 클래스를 포함하여 두 클래스 간의 연결을 담당합니다.
protocol Target {
func request()
}
class Adaptee {
func specificRequest() {
// 어댑터가 연결할 대상이 되는 기존 클래스의 메서드
}
}
class Adapter: Target {
private let adaptee: Adaptee
init(adaptee: Adaptee) {
self.adaptee = adaptee
}
func request() {
adaptee.specificRequest()
}
}
위의 예시에서, Target
프로토콜은 타겟 인터페이스를 정의하고, Adaptee
클래스는 어댑티 클래스를 나타내며, Adapter
클래스는 실제 어댑터를 구현하는 클래스입니다.
결론
어댑터 패턴은 다양한 상황에서 기존의 코드를 수정하지 않고도 새로운 기능을 확장하고, 코드를 재사용하며, 유지보수를 쉽게 해주는 중요한 디자인 패턴 중 하나입니다.
참고 자료
- GoF의 디자인 패턴: 요약 (https://itwiki.kr/w/GoF_%EC%9D%98%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4:_%EC%9A%94%EC%95%BD)
- Swift 언어 가이드 (https://docs.swift.org/swift-book)