전략 패턴 (Strategy Pattern)
이번 포스팅에서는 GoF 디자인 패턴 중 하나인 전략 패턴에 대해 알아보며, 예제를 직접 작성해보고 패턴의 로직을 익혀보겠다.
전략 패턴이란?

GoF 디자인 패턴 중 하나로, 전략 패턴은 전략을 쉽게 바꿀 수 있도록 하는 디자인 패턴이다.
여기에서 전략이란 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘 등으로 이해할 수 있다.
프로그램에서 알고리즘의 집합을 정의하고 각각을 캡슐화하여 상호 교환 가능하도록 만든다.
알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경하거나 확장할 수 있으며, 코드의 재사용성과 유연성을 높일 수 있다.
전략 패턴 예제
어떤 소재를 가지고 전략 패턴 알고리즘을 작성해볼까 고민하다가 GPT가 게임 캐릭터와 공격 방식을 추천해줬다.
이를 바탕으로 게임 캐릭터, 그리고 캐릭터의 공격방식을 바탕으로 각각 클래스를 작성하였다!
공격 방식
// 전략 인터페이스: 공격 방식을 정의하는 인터페이스
interface AttackStrategy {
void attack();
}
비어있는 attack() 함수만 정의되어있는 공격 전략 인터페이스다.
공격 방식 클래스들
class FighterAttack implements AttackStrategy {
@Override
public void attack() {
System.out.println("검으로 공격!");
}
}
class ArcherAttack implements AttackStrategy {
@Override
public void attack() {
System.out.println("활로 원거리 공격!");
}
}
class MageAttack implements AttackStrategy {
@Override
public void attack() {
System.out.println("마법으로 공격!");
}
}
AttackStrategy 인터페이스를 구현한 구체적인 공격방식 클래스이다.
클래스 별로 attack()을 구체적으로 구현하였다!
게임 캐릭터 클래스
class GameCharacter {
private AttackStrategy attackStrategy;
public void setAttackStrategy(AttackStrategy attackStrategy) {
this.attackStrategy = attackStrategy;
}
public void attack() {
attackStrategy.attack();
}
}
게임 캐릭터 클래스이다.
AttackStrategy 인터페이스를 활용하여 공격전략을 바꿀 수 있는 setAttackStrategy와 AttackStrategy의 공격 방식을 출력하는 attack()이 있다.
Main문
public class StrategyPatternExample {
public static void main(String[] args) {
// 캐릭터 생성
GameCharacter character = new GameCharacter();
// 초기 공격 방식 설정
character.setAttackStrategy(new FighterAttack());
// 캐릭터가 검으로 공격
character.attack();
// 캐릭터가 활로 공격으로 전환
character.setAttackStrategy(new ArcherAttack());
character.attack();
// 캐릭터가 마법으로 공격으로 전환
character.setAttackStrategy(new MageAttack());
character.attack();
}
}
캐릭터를 생성하여 공격 방식을 설정하고 공격한다.
다른 공격 방식으로 전환한 뒤 공격을 취하는 구조이다.

게임 캐릭터가 원하는 공격 방식을 취하고 공격을 할 때마다 다르게 출력됨을 확인할 수 있다.
이렇게 전략 패턴을 사용하면 새로운 공격 방식을 추가하거나 기존 방식을 변경하는 작업이 캐릭터 클래스를 수정하지 않고도 가능하다.
스프링에서 UserDao를 통해 Connection객체를 변경할 수 있는 예시에도 전략패턴이 사용되는데, 추후에 학습 후 직접 작성해봐야겠다!