전략 패턴

Bo Ram·2025년 3월 3일

헤드 퍼스트 디자인 패턴 - 1장 정리

디자인 패턴이란?

  • 프로그램에서 자주 발생하는 문제를 해결하기 위한 재사용 가능한 설계 템플릿
  • 유지보수가 쉽고 유연한 코드를 작성할 수 있도록 도와줌

디자인 원칙

  1. 애플리케이션에서 변화하는 부분을 캡슐화하라.
    • 변하는 부분을 분리하여 변경이 용이하도록 설계
    • 예시: 오리가 날아다니는 기능을 추가할 때, fly() 메서드를 각각 구현하면 코드 중복 발생
  2. 구현이 아닌 인터페이스에 맞춰 프로그래밍하라.
    • 특정 구현에 의존하지 않고 유연하게 확장 가능하도록 설계
    • 예시: FlyBehavior 인터페이스를 만들어 fly() 기능을 개별적으로 구현
  3. 상속보다는 구성을 활용하라.
    • 코드의 재사용성을 높이고, 유연성을 증가시킴
    • 예시: 오리의 행동을 인터페이스로 분리하여 다양한 행동을 조합할 수 있도록 설계

객체지향 설계의 문제점

  • 무분별한 상속 사용으로 인한 코드 중복
  • 변경 사항이 전체 시스템에 영향을 미침
  • 유지보수 및 확장이 어려워짐

전략 패턴 (Strategy Pattern) 적용하기

전략 패턴을 적용하여 유연한 설계를 할 수 있음.

기존 설계의 문제점

public class Duck {
    public void quack() {
        System.out.println("꽥꽥!");
    }
    public void swim() {
        System.out.println("오리가 수영합니다.");
    }
    public void fly() {
        System.out.println("오리가 날아갑니다.");
    }
}
  • 모든 오리는 fly() 메서드를 가지지만, 날지 못하는 오리도 존재함
  • fly() 메서드를 재정의하면 코드 중복 발생

전략 패턴을 적용한 개선된 설계

// 날기 행동 인터페이스
public interface FlyBehavior {
    void fly();
}

// 날 수 있는 오리 행동
public class FlyWithWings implements FlyBehavior {
    public void fly() {
        System.out.println("오리가 날아갑니다!");
    }
}

// 날지 못하는 오리 행동
public class FlyNoWay implements FlyBehavior {
    public void fly() {
        System.out.println("저는 날지 못해요.");
    }
}

// 오리 기본 클래스
public abstract class Duck {
    FlyBehavior flyBehavior;
    
    public void performFly() {
        flyBehavior.fly();
    }
    
    public void setFlyBehavior(FlyBehavior fb) {
        this.flyBehavior = fb;
    }
}

// 특정 오리 종류
public class MallardDuck extends Duck {
    public MallardDuck() {
        flyBehavior = new FlyWithWings();
    }
}

전략 패턴 적용 후 장점

  • 코드 중복 제거: fly() 메서드를 인터페이스로 분리하여 재사용 가능
  • 유연한 변경 가능: setFlyBehavior()를 통해 런타임에 행동을 변경할 수 있음
  • 확장성 증가: 새로운 행동을 추가할 때 기존 코드를 수정하지 않고 새로운 클래스를 추가하는 방식으로 확장 가능

정리

  • 디자인 패턴은 검증된 소프트웨어 설계 기법으로, 유지보수와 확장이 용이한 코드를 작성하는 데 도움을 줌
  • 변화하는 부분을 캡슐화하고, 인터페이스 기반 프로그래밍과 구성을 활용하는 것이 핵심 원칙
  • 전략 패턴(Strategy Pattern)을 활용하면 행동을 개별 클래스로 분리하여 유연한 설계를 할 수 있음
  • 유지보수성을 높이고 확장성을 확보하는 것이 디자인 패턴을 적용하는 가장 큰 이유

profile
사부작ㅤ사부작

0개의 댓글