ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 브리지 패턴(Bridge Pattern)이란?
    Design Pattern/구조 디자인 패턴 2024. 4. 14. 15:35
    반응형

     브리지 패턴은 디자인 패턴의 한 종류로, 구현부에서 추상화된 부분을 분리하여, 각각 독립적으로 변화할 수 있도록 설계하는 패턴입니다. 이 게시글에서는 브리지 패턴의 기본적인 개념부터 실제 예시까지 다루어보겠습니다.

    1. 브리지 패턴이란?

     브리지 패턴은 추상화(abstraction)와 구현(implementor)이라는 두 가지 방향의 계층 구조를 분리하는 것입니다. 이 패턴의 주요 목적은 기능과 구현을 분리하여 서로 독립적으로 확장할 수 있도록 만드는 것입니다. 추상화 계층은 클라이언트가 사용할 고수준의 인터페이스를 정의하고, 구현 계층은 실제 하위 수준의 연산을 정의합니다.

    2. 브리지 패턴은 주로 어디에 쓰이나?

     브리지 패턴은 시스템의 구성요소가 매우 다양한 구현이 필요한 경우에 사용됩니다. 예를 들어, 여러 다양한 데이터베이스 엔진을 지원하는 데이터베이스 접근 라이브러리나 다양한 종류의 파일 형식을 처리해야 하는 파일 변환 애플리케이션 등에서 유용합니다. 이 패턴을 사용하면 추상화된 로직을 변경하지 않고도 다양한 구현을 쉽게 교체하거나 추가할 수 있습니다.

    3. Java와 Go로 브리지 패턴을 구현할 때의 차이점

     Java에서 브리지 패턴을 구현할 때는 추상 클래스와 인터페이스를 활용합니다. Java는 상속을 사용하여 추상화 계층을 만들고 인터페이스를 통해 구현 계층을 정의합니다.

    Go에서는 인터페이스만을 사용하여 브리지 패턴을 구현합니다. Go는 클래스가 없으므로, 인터페이스를 통해 다형성을 제공하고 구체적인 구현은 구조체와 메서드를 사용하여 제공합니다.

    4. 브리지 패턴 예시

    Java

    // Implementor
    interface Device {
        void turnOn();
        void turnOff();
        void setChannel(int channel);
    }
    
    // Concrete Implementor
    class TV implements Device {
        public void turnOn() { System.out.println("TV turned on."); }
        public void turnOff() { System.out.println("TV turned off."); }
        public void setChannel(int channel) { System.out.println("TV channel set to " + channel); }
    }
    
    // Abstraction
    abstract class RemoteControl {
        protected Device device;
        public RemoteControl(Device device) { this.device = device; }
        abstract void togglePower();
    }
    
    // Refined Abstraction
    class BasicRemote extends RemoteControl {
        public BasicRemote(Device device) { super(device); }
        public void togglePower() {
            System.out.println("Remote: power toggle");
            device.turnOn();
        }
    }
    
    // Client
    public class BridgeDemo {
        public static void main(String[] args) {
            Device myTv = new TV();
            RemoteControl remote = new BasicRemote(myTv);
            remote.togglePower();
        }
    }

    Java에서의 브리지 패턴 예제는 TV와 리모컨의 관계를 사용하여 추상화와 구현의 분리를 보여줍니다.

    1. Implementor 인터페이스 (Device):
      • Device 인터페이스는 모든 디바이스가 구현해야 할 메서드를 정의합니다 (turnOn, turnOff, setChannel).
    2. Concrete Implementor (TV):
      • TV 클래스는 Device 인터페이스를 구현하고, 실제 기능(전원 켜기, 끄기, 채널 변경)을 구현합니다.
    3. Abstraction (RemoteControl):
      • RemoteControl은 추상 클래스로, Device 타입의 객체를 필드로 갖습니다. 이는 리모컨이 다양한 디바이스를 제어할 수 있음을 의미합니다.
      • 추상화 계층은 실제 구현을 사용하여 높은 수준의 연산을 수행합니다.
    4. Refined Abstraction (BasicRemote):
      • BasicRemote 클래스는 RemoteControl의 구체적인 구현입니다. 이 클래스는 전원 토글 기능을 구현합니다.
    5. Client (BridgeDemo):
      • main 메서드에서 Device 인터페이스의 구현체인 TV 객체와 BasicRemote 객체를 생성합니다. 리모컨을 사용하여 TV의 전원을 토글하는 동작을 실행합니다.

    Go

    package main
    
    import "fmt"
    
    // Implementor
    type Device interface {
        TurnOn()
        TurnOff()
        SetChannel(channel int)
    }
    
    // Concrete Implementor
    type TV struct {}
    
    func (tv *TV) TurnOn() { fmt.Println("TV turned on.") }
    func (tv *TV) TurnOff() { fmt.Println("TV turned off.") }
    func (tv *TV) SetChannel(channel int) { fmt.Println("TV channel set to", channel) }
    
    // Abstraction
    type RemoteControl struct {
        device Device
    }
    
    func (r *RemoteControl) TogglePower() {
        fmt.Println("Remote: power toggle")
        r.device.TurnOn()
    }
    
    // Client
    func main() {
        myTv := &TV{}
        remote := RemoteControl{device: myTv}
        remote.TogglePower()
    }

    Go에서는 인터페이스를 사용하여 브리지 패턴을 구현합니다. Java 예제와 비슷한 방식으로 TV와 리모컨의 관계를 모델링합니다.

    1. Implementor 인터페이스 (Device):
      • Device 인터페이스는 TurnOn, TurnOff, SetChannel 같은 메서드를 정의합니다. 이는 디바이스가 수행해야 할 기본적인 동작을 나타냅니다.
    2. Concrete Implementor (TV):
      • TV 구조체는 Device 인터페이스를 구현합니다. TV의 실제 기능을 메서드로 구현합니다.
    3. Abstraction (RemoteControl):
      • RemoteControl 구조체는 Device 인터페이스 타입의 필드를 갖습니다. 이를 통해 다양한 디바이스를 동일한 리모컨 인터페이스로 제어할 수 있습니다.
    4. Client (main 함수):
      • main 함수에서 TV의 인스턴스를 생성하고, RemoteControl 객체에 연결합니다. 이를 통해 리모컨을 사용하여 TV의 전원을 토글합니다.

    Java와 Go 예제 모두 동일한 문제(리모컨을 통한 디바이스 제어)를 해결하지만, 사용하는 언어의 특성에 따라 접근 방식에 차이가 있습니다. Java는 추상 클래스를 사용하여 추상화를 표현하는 반면, Go는 인터페이스만을 사용하여 구현합니다. 이는 Go가 타입 상속을 지원하지 않기 때문입니다.

    5. 브리지 패턴의 장단점

    장점

    • 추상화와 구현을 분리하여 서로 독립적으로 변화하게 할 수 있습니다.
    • 기능과 구현에 대한 확장이 용이합니다.
    • 기존 코드를 변경하지 않고 새로운 기능을 추가하거나 구현을 변경할 수 있습니다.

    단점

    • 복잡성이 증가할 수 있으며, 초기 설계가 중요합니다.
    • 패턴을 적용하려면 더 많은 준비와 이해가 필요합니다.
    반응형
Designed by Tistory.