소프트웨어 디자인 패턴은 코드의 재사용성과 유지보수성을 높이는 데 큰 도움을 줍니다. 그 중에서도 데코레이터 패턴은 객체에 동적으로 새로운 기능을 추가할 수 있는 유연한 방법을 제공합니다. 이 글에서는 루비에서 데코레이터 패턴을 구현하는 방법을 알아보겠습니다.
데코레이터 패턴은 객체에 추가적인 책임을 동적으로 부여할 수 있는 구조적 디자인 패턴입니다. 이 패턴은 기존 객체를 감싸는 새로운 객체를 생성하여, 원래 객체의 기능을 확장합니다. 데코레이터 패턴의 주요 장점은 다음과 같습니다:
이제 루비에서 데코레이터 패턴을 어떻게 구현할 수 있는지 살펴보겠습니다. 간단한 예제를 통해 설명하겠습니다.
먼저, 기본 클래스를 정의하겠습니다. 이 클래스는 우리가 데코레이터로 확장할 객체입니다.
class Coffee def cost 5 end def description "커피" end end
위의 Coffee
클래스는 기본 커피의 가격과 설명을 제공합니다. 이제 이 클래스를 데코레이터로 확장해 보겠습니다.
데코레이터 클래스를 정의하기 위해, 기본 클래스와 같은 인터페이스를 구현하는 새로운 클래스를 생성합니다. 이 클래스는 기본 객체를 감싸고, 추가적인 기능을 제공합니다.
class CoffeeDecorator def initialize(coffee) @coffee = coffee end def cost @coffee.cost end def description @coffee.description end end
위의 CoffeeDecorator
클래스는 기본 커피 객체를 감싸고, 그 객체의 cost
와 description
메서드를 호출합니다. 이제 이 클래스를 상속받아 다양한 데코레이터를 추가해 보겠습니다.
이제 CoffeeDecorator
클래스를 상속받아 구체적인 데코레이터 클래스를 구현해 보겠습니다. 예를 들어, 우유와 설탕을 추가하는 데코레이터를 만들어 보겠습니다.
class MilkDecorator < CoffeeDecorator def cost super + 1 end def description super + ", 우유" end end class SugarDecorator < CoffeeDecorator def cost super + 0.5 end def description super + ", 설탕" end end
위의 MilkDecorator
와 SugarDecorator
클래스는 각각 우유와 설탕을 추가하는 기능을 구현합니다. super
키워드를 사용하여 기본 커피의 가격과 설명을 가져온 후, 추가적인 비용과 설명을 더합니다.
이제 데코레이터를 사용하여 커피 객체에 기능을 추가해 보겠습니다. 아래의 코드를 통해 다양한 조합의 커피를 만들어 볼 수 있습니다.
coffee = Coffee.new puts "#{coffee.description}의 가격: #{coffee.cost}원" milk_coffee = MilkDecorator.new(coffee) puts "#{milk_coffee.description}의 가격: #{milk_coffee.cost}원" sugar_milk_coffee = SugarDecorator.new(milk_coffee) puts "#{sugar_milk_coffee.description}의 가격: #{sugar_milk_coffee.cost}원"
위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다:
커피의 가격: 5원 커피, 우유의 가격: 6원 커피, 우유, 설탕의 가격: 6.5원
데코레이터 패턴은 많은 장점을 가지고 있지만, 몇 가지 단점도 존재합니다. 아래에서 장점과 단점을 정리해 보겠습니다.
데코레이터 패턴은 객체에 동적으로 기능을 추가할 수 있는 강력한 도구입니다. 루비에서 이 패턴을 구현하는 방법을 살펴보았으며, 기본 클래스와 데코레이터 클래스를 통해 다양한 기능을 조합할 수 있음을 알 수 있었습니다. 이 패턴을 적절히 활용하면 코드의 재사용성과 유지보수성을 높일 수 있습니다.
이제 여러분도 루비에서 데코레이터 패턴을 활용하여 더 유연하고 확장 가능한 코드를 작성해 보세요!
© 2024 RailsInsights. All rights reserved.