변혁적인 삶

[SW공학 | 디자인패턴] 2. 어댑터 패턴(Adapter Pattern) 본문

SW공학/디자인패턴

[SW공학 | 디자인패턴] 2. 어댑터 패턴(Adapter Pattern)

revolutionarylife 2024. 10. 30. 10:59
반응형

🔌 [SW공학 | 디자인패턴] 2. 어댑터 패턴(Adapter Pattern)

목차

  • 어댑터 패턴 개요
  • 어댑터 패턴의 필요성
  • 어댑터 패턴의 구조
  • 어댑터 패턴 예제
  • 어댑터 패턴의 장점과 단점
  • 마무리

어댑터 패턴 개요

안녕하세요! 오늘은 소프트웨어 설계에서 유용하게 활용되는 어댑터 패턴(Adapter Pattern)에 대해 알아보겠습니다. 어댑터 패턴은 구조 패턴(Structural Pattern) 중 하나로, 주로 호환되지 않는 인터페이스를 가진 클래스들 간에 중재 역할을 수행하는 데 사용됩니다.

소프트웨어 개발에서는 기존 코드와 새로운 코드가 함께 동작해야 하는 상황이 자주 발생합니다. 그러나 기존 시스템과 새 시스템이 서로 다른 인터페이스를 가지고 있으면 이들이 원활히 통합되지 않을 수 있습니다. 어댑터 패턴은 이러한 문제를 해결하기 위해 기존 코드의 변경 없이 새로운 시스템과의 호환성을 제공해 줍니다.

예를 들어, 마치 전기 콘센트 어댑터가 다양한 형태의 플러그를 표준 전원 소켓에 연결할 수 있도록 해주는 것처럼, 어댑터 패턴은 두 클래스 사이에서 중간 다리 역할을 수행하여 서로 다른 인터페이스를 가진 객체가 원활히 상호작용할 수 있도록 도와줍니다.

어댑터 패턴은 특히 레거시 시스템을 현대적인 시스템과 통합할 때나, 외부 라이브러리와의 호환성을 확보할 때 효과적입니다. 이를 통해 시스템의 유연성과 확장성을 높일 수 있으며, 기존 코드에 최소한의 영향을 주면서 새로운 기능을 추가할 수 있습니다.

이번 글에서는 어댑터 패턴을 구조와 예시를 통해 알아보겠습니다.


어댑터 패턴의 필요성

소프트웨어 개발에서는 종종 기존 코드와 새 코드의 호환성 문제가 발생합니다. 어댑터 패턴을 사용하면 기존 시스템을 변경하지 않고도 새로운 시스템을 추가할 수 있으며, 이를 통해 프로젝트의 확장성과 유연성이 크게 향상됩니다.

예를 들어, 오래된 데이터베이스 인터페이스와 새로운 애플리케이션이 호환되지 않을 때, 어댑터 패턴을 사용해 새로운 시스템에서 기존 데이터베이스를 사용할 수 있도록 할 수 있습니다.


어댑터 패턴의 구조

어댑터 패턴은 클라이언트(Client), 타깃(Target), 어댑터(Adapter), 적응 대상(Adaptee) 네 가지 요소로 구성됩니다:

어댑터 패턴 구조 클래스 다이어그램

  • 클라이언트(Client): 어댑터를 통해 서비스를 사용하는 사용자나 코드
  • 타깃(Target): 클라이언트가 기대하는 인터페이스
  • 어댑터(Adapter): 적응 대상과 타깃을 연결해주는 중간 역할
  • 적응 대상(Adaptee): 어댑터가 변환하는 실제 클래스

어댑터 패턴 예제

어댑터 패턴을 이해하기 위해 간단한 예제를 보겠습니다. 이 예제에서는 구형 MP3 플레이어가 새로운 음악 재생 시스템과 호환되지 않는 경우를 가정해, 어댑터를 사용해 호환성을 확보해보겠습니다.

타깃 인터페이스( Target)

class MediaPlayer: 
	def play(self, audio_type, file_name): 
		pass

적응 대상(Adaptee)

class MP3Player: 
	def play_mp3(self, file_name): 
    	print(f"Playing MP3 file: {file_name}")

어댑터( Adapter)

class AudioAdapter(MediaPlayer): 
	def init(self, mp3_player): 
    	self.mp3_player = mp3_player def play(self, audio_type, file_name): 
        	if audio_type == "mp3": 
            	self.mp3_player.play_mp3(file_name) 
            else: 
            	print("Unsupported format")

클라이언트 코드( Client)

 mp3_player = MP3Player() 
 adapter = AudioAdapter(mp3_player) 
 adapter.play("mp3", "favorite_song.mp3") 
 
 # Output: Playing MP3 file: favorite_song.mp3

위 예제에서 AudioAdapter 클래스가 어댑터 역할을 수행하여 MediaPlayer 인터페이스에 맞게 MP3Player를 변환합니다.


어댑터 패턴의 장점과 단점

장점: 시스템 간의 호환성을 유지할 수 있으며, 기존 코드를 수정하지 않고 확장할 수 있습니다. 또한, 코드 재사용성이 높아져 코드의 유지보수성이 향상됩니다.

단점: 어댑터가 많아지면 복잡도가 증가할 수 있으며, 코드 가독성이 떨어질 수 있습니다. 모든 경우에 어댑터 패턴을 적용하는 것은 비효율적일 수 있습니다.


마무리

어댑터 패턴은 서로 다른 시스템 간의 호환성을 유지하면서 새로운 기능을 쉽게 통합할 수 있는 유용한 디자인 패턴입니다. 이 패턴을 사용하여 코드 확장성과 재사용성을 높이며, 복잡한 시스템에서도 간편하게 통합을 구현해보세요!🔌🎺

반응형