전략패턴은 뭔가요?
- 전략 패턴은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이에요.
- 행위 소프트웨어 디자인 패턴이란, 객체간의 커뮤니케이션 패턴을 정의해 놓음으로써, 커뮤니케이션에 유연성을 증대시켜줘요.
- 전략패턴은 크게 세 종류의 객체의 협력으로 구성이됩니다.
- 1번, 구체화된 여러 알고리즘의 추상화로써, 변해야 하는 로직을 가지고 있는 전략 interface와
- 다양한 알고리즘을 구체화 시켜놓은 콘크리트 클래스입니다.
- 2번, 전략을 사용하는 프로그램의 흐름으로써, 변하지 않는 부분을 담당하는 전략 사용자 입니다.
- 3번, 전략 사용자에게 직접 전략을 주입시키는 전략 제공자 입니다.
전략패턴을 왜 도입했나요?
- 가장 먼저 전략패턴을 도입했던 경험은 랜덤한 요소를 생성하는 로직을 분리하기 위해서 입니다.
- 랜덤값에 의존하게 되면 테스트하기가 참으로 어려워지는데요.
- 가령 1~10중 랜덤한 숫자를 뽑아 4이하의 숫자가 반환되면 true를 반환하세요라는 메서드가 있다고 합시다.
- 해당 메서드를 테스트 하기위해 숫자 선발 로직을 인터페이스로 추상화하였고,
- 이를 구현한 콘크리트 클래스로, 랜덤으로 1~10 중의 하나의 숫자를 선발하는 로직을 작성했다고 합시다.
- 파라미터로 해당 콘크리트 클래스를 주입받아, getNumber()라는 메서드를 호출해 번호를 받으면, 정상적으로 프로그램이 의도한 대로 동작할 것이에요.
- 여기에 테스트를 위해 매번 3을 반환하는 콘크리트 클래스나, 매번 7을 반환하는 콘크리트 클래스를 작성했다고 생각하면,
- 값을 콘크리트 클래스로 부터 넘겨받아 비즈니스 로직을 수행하는 객체가 정상적으로 동작하는지 손쉽게 테스트했던 경험이 있습니다.
전략패턴을 사용하면 장단점이 뭐가 있나요?
- 장점
- 전략 사용자의 코드 변경없이 새로운 전략을 추가할 수 있어요.
- 이는 SOLID원칙중 OCP, 즉 개방폐쇄 원칙에 잘 부합하는 코드로써,
- 추상화와 다형성을 통해 확장에는 열려있고, 변경에는 닫혀있는 코드를 작성해 낼 수 있어요.
- 런타임에 전략을 변경시킬 수 있어요.
- 코드의 분기를 만들어서 주렁주렁 if-else를 달아 단일 책임원칙을 위배하고 코드를 절차지향적으로 바꾸는 것이 아닌, 필요에 따라 적절한 시키에 전략을 변경시켜주는 것이 가능해져요.
상태패턴이 뭐죠?
- 상태 패턴은 객체 지향 방식으로 상태 기계를 구현하는 행위 소프트웨어 디자인 패턴이에요.
- 상태 패턴을 사용하여 상태 인터페이스의 파생클래스로 각각의 상태를 구현할 수 있어요.
- 패턴의 슈퍼클래스에 의해 정의되는 메서드를 호출하여 상태 변화를 구현함으로써 상태 기계를 구현해요.
- 상태패턴은 크게 세 종류의 객체의 협력으로 구성이 됩니다.
- 1번, 구체화된 여러 상태들의 추상화로써, 상태가 수행하는 기능들을 추상화 해놓은 상태 interface와
- 다양한 상태에 따라 그에 알맞는 기능들을 정의해 놓은 상태 콘크리트 입니다.
- 2번, 특정 기능 수행 요청을 받으면, 상태 콘크리트에게 이를 위임하는 상태 보유자 입니다.
- 3번, 상태 보유자에게 특정 기능 수행을 요청하는, 요청자 입니다.
상태 패턴의 장단점이 뭔가요?
- 장점
- 하나의 상태에 관련된 코드가 한 곳에 모여있어, 유지보수가 용이해요. 상태에 따른 validation도 포함해서요.
- 상태가 많아지더라도, 코드의 복잡도가 증가하지 않아요.
- 컴퓨터 예시처럼, 상태가 정해진 옵션들 사이에서 왔다갔다 하는경우, 즉 유한 상태머신의 경우 상태 패턴의 장점들은 극대화 되어요.
- 단점
- 어떤 상태가 있는지 다 파악해야하고, 작성해야할 코드의 양이 많아져요.
전략패턴이랑 비슷해보이는데 둘의 차이점은 뭐죠?
- 우선 둘이 비슷해 보이는 이유는, 둘 모두 "객체간의 커뮤니케이션에 유연성을 부여하는 행동 패턴"이라 그렇습니다.
- 객체간의 커뮤니케이션을 유연하게 하기위해, 추상화된 타입인 인터페이스를 정의하고, 콘크리트 클래스를 변경하는 방식으로 유연함을 부여했거든요.
- 저는 개인적으로, 두 패턴의 차이점은 두 패턴이 등장한 이유에 있다고 생각해요.
- 상태 패턴은, 하나의 객체가 내부적인 상태에 따라 다른 행동을 해야할 때 사용해요.
- 예를 들어 컴퓨터라는 객체에 전원버튼을 누르는 메서드를 제공한다고 할때,
- Off상태에서는 전원 버튼 누르면 전원이 켜져야하고,
- On상태에서는 전원 버튼 누르면 전원이 꺼져야 하고
- 현재 컴퓨터의 상태에 따라, 스스로 상태를 변경시키고, 상태를 실행으로 옮기는 것을 알 수 있어요.
- 확실히 객체의 상태를 표현하고 나타내는데에 초점이 맞춰져 있어요.
- 전략 패턴은, 다양한 알고리즘을 상황에 따라 다르게 사용하고 싶을 때 사용해요.
- 알고리즘의 사용에 초점이 맞춰져 있다고 볼 수 있어요.
- 상태 패턴의 경우, 스스로를 다른 상태로 변경시킬 수 있지만, 전략 패턴에서 이는 불가능해요.
- 상태 패턴의 경우, 상태는 상태 보유자의 거의 모든 행동을 수행하지만, 전략 패턴에서 전략은 하나의 특정한 임무를 수행해요.