John's 개발자의 관심노트

JAVA Design Pattern, Strategy Pattern, 전략 패턴 본문

[개발]/Spring WEB

JAVA Design Pattern, Strategy Pattern, 전략 패턴

John-Co 2022. 10. 14. 09:11

JAVA + Spring boot

전략패턴 (Strategy Pattern) 이란 무엇인가?

전략패턴(Strategy Pattern) 또는 정책패턴 (Policy Pattern) 이라고도 불리는 이 패턴은,

특정한 계열의 여러개의 알고리즘들을 정의하고, 그 계열안에서 알고리즘 간에 상호 교체가 가능하도록 만드는 패턴이다.

즉, 여러개의 행동 패턴을 만들어두고, 필요에 의해서 행동의 패턴을 변경하고자 하는 경우,

동적으로 변경 가능하도록 만든 패턴이다.

전략패턴 (Strategy Pattern) 을 사용하는 이유!

예를들어 핸드폰 충전기를 생각해보면, 충전기의 방식을 여러개로 나누어 볼 수 있다.

아이폰 충전, 삼성폰 충전, 무선충전 등의 행위로 나눌 수 있고,

충전기는 어떤 충전을 할 것이냐에 따라 충전 방식이 바뀌게 된다.

이때, 충전기를 만들고 내부 내용을 아이폰 충전기로 구성을 했다면,

이후에 삼성폰 충전을 위해서는 그 내부 내용을 수정해주어야 하는데, 소규모 프로젝트에서는 그냥 몇줄 수정하고 말겠지만,

점차 대규모로 나아갈 수록 유지보수 측면에서 어려움이 생기며,

또 위와 같이 수정하는 방법은 SOLID 원칙을 위배하는 것이라고 한다.

SOLID 원칙에 대해서 아직 익숙하지 않아, 다음에 글로 포스팅을 하면서 좀 더 자세히 알아보아야 할 것 같다.

Example

위에서 예시로 들은 충전기를 예제코드로 작성해보려고한다.

충전기는 총 3가지의 행동방식을 정의하고, 1개의 충전기에서 3가지를 변경해보면서 충전하는 프로그램이다.

 

먼저 Charger Interface 를 만든다.

public interface ICharger {
    public void charging();
}

그 다음, Samsung Phone 충전기를 만든다.

public class Samsung implements ICharger{
    @Override
    public void charging() {
        System.out.println("Samsung Charger!");
    }
}

IPhone 충전기,

public class Iphone implements ICharger{
    @Override
    public void charging() {
        System.out.println("Iphone Charger!");
    }
}

무선 충전기,

public class Wireless implements ICharger{
    @Override
    public void charging() {
        System.out.println("Wireless Charger!");
    }
}

이제 실제 사용할 충전기 클래스를 전략패턴을 이용해서 작성한다.

똑같이 "ICharger" Interface 를 구현해준다.

추가적으로, 내부 처리에서 충전방식을 변경할 수 있도록 변경 가능한 Method 또한 작성해준다.

public class Charger implements ICharger{
    private ICharger charger;

    @Override
    public void charging() {
        charger.charging();
    }

    public void setChargerType(ICharger charger){
        this.charger = charger;
    }
}

이렇게 해서 전략 패턴으로 작성한 충전기가 만들어지고 이를 Main() 에서 직접 사용해보면,

public class Main {
    public static void main(String[] args) {
    	// 충전기 생성
    	Charger charger = new Charger();
        // 아이폰 충전 타입으로 변경
        charger.setChargerType(new Iphone());
        charger.charging();
        // 삼성폰 충전 타입으로 변경
        charger.setChargerType(new Samsung());
        charger.charging();
        // 무선 충전 타입으로 변경
        charger.setChargerType(new Wireless());
        charger.charging();
    }
}

위와 같은 코드를 만들 수 있고, 빌드 및 실행을 해보면 아래와 같은 결과를 볼 수 있다.

결과 화면

실제 웹 개발을 시작하게되면 전략패턴이 어떻게 사용될지는 아직 감이 잘 안잡힌다.

JAVA 에서 S/W 개발 시 사용하는 개발 패턴에 대해 알아보았는데, 아직까지는 실제로 어떻게 쓰여질지는

계속 공부해가면서 감을 익혀나가야 할 것 같다.

 

개인적으로 이해한 내용을 바탕으로 한 글이므로 잘못된 부분이 있다면 다양한 의견 부탁드립니다.

반응형