ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 전략 패턴이란?
    Java 2022. 5. 25. 19:43

    다음 글은 아래의 영상을 기반으로 제작되었습니다.

    https://www.youtube.com/watch?v=vNsZXC3VgUA

     

    전략 패턴이란?

    전략이란 특정한 목표를 수행하기 위한 행동 계획입니다.

     

    디자인 패턴 중 하나로써 객체가 할 수 있는 행위를 각각의 전략으로 만들어 놓고 사용하며 동적으로 전략 수정이 가능한 패턴입니다.

     

    디자인 패턴이란?

    소프트웨어 디자인을 하는 데 있어 공통적으로 마주치는 문제의 해결하는 방법이 하나의 패턴처럼 굳어진 것을 말합니다.

     

     

    전략 패턴의 예시

    예를 들어 배민 로봇 전략 예시가 있습니다.

    이동 전략에는 "걸어서, 뛰어서, 날아서, 로켓으로" 가 있다고 가정하겠습니다.

    온도 전략에는 "차갑게 따뜻하게 냉동으로 뜨겁게" 가 있다고 가정하겠습니다.

     

    동일 계열의 알고리즘 군을 정의하고 각 알고리즘을 캡슐화하며 이들을 상호 교환이 가능하도록 만듭니다.

     

    이렇게 말로 들으면 이해가 안 되기 때문에 코드를 통해 예시를 보겠습니다.

     

    전략 패턴의 유리함을 강조하기 위해서 코드를 점진적으로 개선시켜나가는 방법으로 보여드리겠습니다.

     

    걷기 로봇과, 뛰기 로봇이 있다고 가정하겠습니다.

    public class WalkingRobot{
    	public void display(){
    		System.out.println("걷기 로봇");
    	}
    
    	public void move(){
    		System.out.println("걸어서 배달합니다.");
    	}
    }
    
    public class RunningRobot{
    	public void display(){
    		System.out.println("뛰기 로봇");
    	}
    
    	public void move(){
    		System.out.println("뛰어서 배달합니다.");
    	}
    }
    
    public class main{
    
    	public static void main(String[] args){
    		WalkingRobot walkingRobot = new WalkingRobot();
    		RunningRobot runningRobot = new RunningRobot();
            
    		walkingRobot.move();
    		runningRobot.move();
    	}
    }

     

    여기에서 날아서 배달하는 로봇, 포켓으로 배달하는 로봇들이 등장할 수 있습니다.

     

    여기에서 상속을 활용하여 로봇을 추상화시켜 사용할 수 있습니다.

    https://www.youtube.com/watch?v=vNsZXC3VgUA

     

    하지만 여기서 온도 조절 기능도 추가하려면 문제가 발생하기 시작합니다.

    추상 클래스에 temperature() 메서드를 추가하고 Robot을 상속받는 클래스들은 모두 temperature() 메서드를 오버 라이딩해야 합니다.

     

    https://www.youtube.com/watch?v=vNsZXC3VgUA

     

    여기에서 문제점이 발생하게 됩니다.

     

    1. 메서드 수정이 어렵다.

    만약 걸어서 배달하는 로봇의 move() 메서드를 "걸어서 배달합니다"에서 "빠르게 걸어서 배달합니다"로 변경하게 되면 모든 클래스를 수정해야 합니다.

     

    2. 기능이 추가될 때마다 클래스의 수가 기하급수적으로 증가하게 됩니다.

    만약 한국어, 중국어, 일본어를 말하는 로봇의 말하기 기능이 추가된다면 다음과 같은 클래스들이 필요하게 됩니다.

     

    한국어 기능을 가진 차가운 걷기 로봇, 중국어 기능을 가진 차가운 걷기 로봇, 일본어 기능을 가진 차가운 걷기 로봇 등으로 클래스의 수가 엄청나게 증가합니다.

     

    이러한 문제점을 해결하기 위해서 전략 패턴이 등장하였습니다.

    1. 인터페이스를 활용한다.

    2. 로봇 클래스에 전략 인터페이스들을 필드로 가지고 이를 조립한다. (전략이 동적으로 수정이 가능해짐!)

    https://www.youtube.com/watch?v=vNsZXC3VgUA

    이제는 걸어서 배달합니다 -> 빠르게 걸어서 배달합니다로 메시지를 변경하기에 훨씬 쉬워졌습니다.

     

     

    여기에 새로운 말하기 기능을 추가하고 싶다면? Robot 클래스만 조금 변경해주면 바로 새로운 기능을 추가할 수 있게 되었습니다.

    https://www.youtube.com/watch?v=vNsZXC3VgUA

     

     

    이런 전략 패턴을 활용하면 이제 로봇이 도중에 이동전략을 바꿀 수도 있습니다.

    즉, 건물 내부에서는 걷다가 외부에서는 나는 방식으로도 이동할 수 있습니다.

     

    어떻게 하면 좋을까요?

     

    바로 setter 메서드를 활용하여 이동전략을 바꿔 끼워주면 됩니다.

    https://www.youtube.com/watch?v=vNsZXC3VgUA

    기존에는 차가운 온도를 가졌다가 뜨거운 온도로, 기존에는 걸어서 움직이다가 날아서 움직이도록 구현된 코드입니다.

     

     

    실제로 전략패턴을 사용하는 예시로는 어떤 것들이 있을까요?

    바로 Comparator입니다.

    개발 상황에 맞게 정렬하는 전략을 구현할 수 있게 하여 기존 코드의 수정 없이 확장이 가능합니다.

    'Java' 카테고리의 다른 글

    불변객체란 무엇인가?  (0) 2022.05.29
    Java에 원시타입(primitive type)이 존재하는 이유  (0) 2022.05.28
    Java는 왜 Pure OOP가 아닐까?  (0) 2022.05.10
    객체지향 5원칙 : SOLID  (0) 2022.04.22
    [Java] 빌더 패턴  (0) 2022.04.09

    댓글

Designed by Tistory.