반응형

 

데코레이터 패턴(Decorator Pattern)

안녕하세요 취업길잡이 Coy입니다

오늘은 데코레이터 패턴(Decorator Pattern)에 대해서 알아보도록 하겠습니다

 

데코레이터 패턴이란

데코레이터 패턴은 객체 지향 디자인에서 사용되는 구조적인 패턴으로, 기본 객체에 동적으로 추가적인 행동을 부여하는 것을 목적으로 합니다.

이 패턴은 상속을 사용하지 않고도 객체의 기능을 확장할 수 있도록 해 주며, 객체의 결합을 통해 유연하게 기능을 동적으로 확장할 수 있게 합니다.

데코레이터 패턴은 필요한 추가 기능을 조합하여 사용할 때 특히 유용하며, 런타임에서 동적으로 기능을 부여함으로써 객체의 확장성과 유연성을 제공합니다.

객체를 '장식'하여 새로운 기능을 부여함으로써, 기본 기능에 대한 변경이나 확장을 효과적으로 관리할 수 있는 패턴입니다.

 

 

사용하는 목적

1. 확장 가능한 기능 추가: 기존 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있습니다. 이는 클래스의 확장이 용이하고, 새로운 요구사항이나 기능 추가에 대응하기 쉽게 만듭니다.

 

2. 클래스의 계층 구조 유지: 데코레이터 패턴은 상속을 통한 기능 추가 대신, 객체를 감싸는 방식으로 기능을 확장합니다. 이로써 클래스의 계층 구조를 유지하면서도 더 많은 유연성을 제공합니다.

 

3. 단일 책임 원칙 준수: 각 데코레이터는 특정 기능에 대한 책임만을 지며, 이는 단일 책임 원칙(Single Responsibility Principle)을 따르게 됩니다. 각 데코레이터는 한 가지 역할에 집중하므로 코드의 가독성이 향상됩니다.

 

4. 동적으로 기능 추가 및 제거: 런타임 시 동적으로 데코레이터를 추가하거나 제거할 수 있습니다. 이는 특정 객체의 동작을 필요에 따라 변경하거나 확장할 수 있는 유연성을 제공합니다.

 

 

구조

 

 

 

예제 코드

// 로봇 인터페이스
public interface Robot {
    void assemble();
    int getCost();
}

// 기본 로봇 클래스
public class BasicRobot implements Robot {
    @Override
    public void assemble() {
        System.out.println("Basic Robot Assembled");
    }

    @Override
    public int getCost() {
        return 100;
    }
}

 

// 로봇 데코레이터 추상 클래스
public abstract class RobotDecorator implements Robot {
    protected Robot decoratedRobot;

    public RobotDecorator(Robot robot) {
        this.decoratedRobot = robot;
    }

    @Override
    public void assemble() {
        decoratedRobot.assemble();
    }

    @Override
    public int getCost() {
        return decoratedRobot.getCost();
    }
}
// 무기를 추가하는 데코레이터 클래스
public class WeaponDecorator extends RobotDecorator {
    public WeaponDecorator(Robot robot) {
        super(robot);
    }

    @Override
    public void assemble() {
        super.assemble();
        System.out.println("Added Weapon");
    }

    @Override
    public int getCost() {
        return super.getCost() + 50; // 무기 추가로 인한 비용 증가
    }
}
public class Main {
    public static void main(String[] args) {
        // 기본 로봇 생성
        Robot basicRobot = new BasicRobot();
        basicRobot.assemble();
        System.out.println("Cost: $" + basicRobot.getCost());

        System.out.println();

        // 무기를 추가한 로봇 생성
        Robot weaponRobot = new WeaponDecorator(new BasicRobot());
        weaponRobot.assemble();
        System.out.println("Cost: $" + weaponRobot.getCost());
    }
}

 

 

BasicRobot 클래스는 기본적인 로봇을 나타내며, assemble 메서드로 기본 조립 동작과 getCost 메서드로 비용을 반환합니다.

RobotDecorator는 로봇을 데코레이팅하기 위한 추상 클래스로, 기본 기능을 유지하면서 새로운 기능을 추가할 수 있도록 합니다.

WeaponDecorator 클래스는 RobotDecorator를 상속받아 무기를 추가하는 기능을 부여하는 구체적인 데코레이터로, assemble 메서드와 getCost 메서드를 오버라이딩하여 무기를 추가하고 비용을 증가시킵니다.

Main 클래스에서는 기본 로봇과 무기를 추가한 로봇을 생성하여 조립하고, 각각의 비용을 출력하여 데코레이터 패턴의 활용을 보여줍니다.

 

데코레이터 패턴의 장단점

 

장점

1. 유연성 확보: 기존 코드 수정 없이도 데코레이터 패턴을 활용하여 객체의 행동을 확장할 수 있습니다.
2. 런타임 행동 추가: 구성과 위임을 통해 실행 중에 새로운 행동을 추가할 수 있어, 유연성과 확장성을 제공합니다.
3. 단일 책임 원칙 적용: 다양한 행동들의 변형을 여러 작은 클래스로 나누어 구현할 수 있어, 단일 책임 원칙을 적용하여 코드를 구성할 수 있습니다

 

단점 

1. 의미 없는 객체 증가: 데코레이터를 과도하게 사용하면 많은 의미 없는 객체들이 추가될 수 있어 가독성과 관리에 어려움이 생길 수 있습니다.
2. 코드 복잡성 증가: 데코레이터를 많이 사용하면 코드가 복잡해질 우려가 있어, 적절한 사용이 중요합니다.
3. 래퍼 스택 관리 어려움: 데코레이터 스택에서 특정 데코레이터를 제거하기가 어려울 수 있어, 일부 유지보수 상황에서 어려움이 발생할 수 있습니다.

 

 

오늘 이렇게 데코레이터 패턴에 대해서 알아보았습니다.

디자인 패턴 자체가 가독성을 좋게 하거나, 유지보수가 용이하게 해주는 것은 맞지만, 상황에 따라 잘 사용하는 것이 중요합니다

출처(https://m.yes24.com/Goods/Detail/17525598)


컬럼으로 다루어 주면 좋겠다 싶은 주제가 있으면 댓글로 알려주세요

 

도움이 필요하시면 사연을 메일로 보내주세요

 

jek300300@gmail.com

 

도움이 되셨다면 공감과 구독 부탁드립니다

 

읽어주셔서 감사합니다

 

당신의 취업이 성공할 때까지 같이 하겠습니다! by 취업길잡이 Coy

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기