alt

전략 패턴: 알고리즘 캡슐화

Shared on June 14, 2026

1
Speaker 100:00

안녕하세요. 기트시항 분석 및 설계 수업에서 디자인 패턴 작업을 하고 있죠. 스트리트지 패턴 오늘은 나가도록 하겠습니다. 스트리트지 패턴입니다. 만약에 여러분들이 프로그램을 할 때, 필요에 따라서 변한다 라고 한번 해보죠. 그럼 그럴 때마다 이 변하는 알고리즘 로직을 어떻게 설계에 반영을 할까요? 바로 스트레티지 패턴으로 하시면 되겠습니다. 내용을 한번 보겠습니다. 변경이 되거나 혹은 관련된 어떤 알고리즘이나 폴리스인데 필요에 따라서 변경이 되는 거예요. 그것을 디자인할 때 어떻게 해야 되는지 이런 알고리즘을 나중에 또 바꾸고 싶은 변경성을 갖고 싶습니다. 어떻게 해야 될지 여기서 프로블럼을 제시하고 있고요. 솔루션은 다른 클래스에 각각 다른 알고리즘이나 policy, strategy를 넣어서 그것을 유지를 하도록 하고요. 그리고 일반화된 형태를 interface로 잡는 것입니다. 교과서에서 좋은 example을 가지고 있는데요. 보면 이 물건을 구매를 했는데 거기에 대해서 pricing 물건을 계산하는 모듈이죠. Get total로 계산을 합니다. 그래서 첫 번째 이거는 퍼센트지 디스카운트로 해주는 거예요. 어떤 손님은 예를 들어서 같은 동네 손님들은 퍼센티지를 어느정도 해주는 거죠. 그래서 전체, 토탈에서 퍼센티지를 계산을 하는 겁니다. 그래서 그 스트레티지를 이 메토드 안에다가 넣어주는 겁니다. 또 다른 디스카운트 제도는 예를 들어서 어떤 달에는 어느 가격 이상을 제품을 구입한 사람에게는 디스카운트를 해주는 거예요. 그래서 트레이셜드를 주고, 트레이셜드가 넘치는 사람은 디스카운트를 얼마라 해준다는 거죠. 그래서 정책에 따라서 계산하는 게 토털이 달라집니다. 또 다른 스트레카치도 마찬가지고요. 그래서 이 스트레카치판타는 각각 해야 되는 알고리즘을 콘크리트 클래스에다가 집어넣어 주는 거예요. 콘크리트 클래스에 각 알고리즘이 들어가는 거고요. 그리고 이 알고리즘을 가지고 있는 메토드를 인터페이스로 디파인을 해주는 것입니다. 자 그러면 콜라보레이션 다이그라미로 보도록 할까요? 물건을 구매를 했습니다. 룹을 돌려서 5개, 7개 계산하죠. 다 계산한 다음에 어떤 얼마짜리 인지를 다 파악한 다음에 아버지에게 다 넣고 get total을 보냅니다 여기서 현재 스트레칭이 % 디스카운트를 했어요 여기에다가 계산을 해서 보내주게 되는 거죠 여기 보면 세일의 object이 strategy 에게 가시성을 보이도록 하는 거죠 그래서 장바구니와 같은 S object을 다 보내줘서 여기서 그 내용을 보고 계산을 할 수 있도록 해주는 방법을 쓰고 있습니다 예제를 보면 S, Object in Sale에서 Get Total을 하는데 이것이 결과론적으로 구조 인터페이스 형태를 갖게 될 거고요 Pricing Strategy 가요 그리고 Get Total은 Polymorphism을 하는 거죠 어떤 정책을 하느냐에 따라서 그 메토드 중에 어떤 것이 그때 인보케이션을 해서 다이나믹타임에 이 내용을 계산을 하게 됩니다. 이 예제는 복합적인 예제에요. 팩토리와 같이 스트리트지 디자인 패턴을 쓰는 것 없습니다. 보시게 되면 Pricing Stretch Factory가 있죠. 이것은 Factory 패턴을 사용을 하고요. 여기 보시면 Singleton을 사용하죠. 그러니까 Strategy도 사용을 하는 겁니다. 그래서 보시게 되면 이 Factory 하나의 인스턴스를 갖도록 해줘요. 그죠? return type이 Factory고요. getInstance하면 static으로 static이죠? 하나의 인스턴스를 return을 해줍니다. 그래서 요거를 봤을 때 요거는 싱글턴 그리고 내부에는 여러가지 스트리지를 반영을 할 수 있도록 해줘요 코드가 나왔는데요 그래서 내용의 어떤 스트링을 받게 되면 그 스트링을 보고 거기에 따라서 클래스를 맵핑을 한다는 거예요 그래서 클래스를 이름으로 해서 object instance를 만들어서 이 strategy를 return을 해주는 것입니다. 그래서 관련된 strategy를 이런 식으로 algorithm화해서 가지고 있고요. 팩토리를 통해서 스트레트지를 바꾸는 것이 필요에 따라서 바꿔서 사용을 하게 됩니다. 예, 인터액션 다이그래머로 한번 볼까요? Register, Seal, 새로운 Object을 인스턴스를 만들죠. 그래서 얘에 따라서 strategy로 결정을 하는 거예요. 그래서 팩토리 쪽에서 strategy 어떤 걸로 할지를 결정을 해 줘서 그 스트레티지를 이 팩토리에서 만듭니다. 그리고 여기서 이 계산을 해주세요 라고 하면은 이쪽 새로 붙는 스트레티지에 아버지에게 적절한 오퍼레이션을 할 수 있도록 해줄 수 있습니다. 그래서 팩토리에게 프라이슨 스트레트지를 만들어 달라고 요청을 하는 내용이 있습니다. 이와 같이 스트레트지 디자인 패턴은 유사한 일련의 알고리슘들을 인캡슐레이트를 해서 필요에 따라서 변경 가능하도록 만들어 주는 것입니다. 그래서 이 알고리즘 자체는 다른 알고리즘과 서로 분리된 형태로 스트레티지를 집어넣게 되고요. 클라이언트가 필요에 따라서 사용할 수 있도록 해줄 수 있습니다. 자 한번 구조들을 볼까요? 앞에서 예제 기억나시죠? 컨텍스트 클라이언트 있고요. 아까는 구매하는 것이 있었죠. 그래서 Aggregation으로 잡아줬고 스트레티지입니다. 관련된 스트레티지를 하나의 그룹으로 해주고 인터페이스로 잡아주고 그리고 알고리즘을 넣어줄 수가 있는 메소드를 디파인 했습니다. 그럼 ConcreteStrategy 클래스에서는 그 적절한 에브리즘이 될 수 있는 메소드로 제공을 하게 됩니다. 그러면 앞에서 Polymorphism으로 사용을 하게 되면 그때 디파인된 object의 타입에 따라서 적절한 메소드가 인보케이션 된다 라고 보시면 되겠습니다. 자 내용이죠. strategy 있습니다. 이는 common한 인터페이스 이구요. 어떤 흐름을 가지고 아까처럼 계산, 프라이싱 같은 그 흐름을 가지고 알고리즘을 넣을 수 있는 구조를 갖게 됩니다. 그리고 Concrete Strategy, 알고리즘은 Implementation 하고요. Context, 이것은 Concrete Strategy와 더불어서 오퍼레이션을 할 수 있도록 구조를 갖게 되고요. 이것은 Polymorphism이기 때문에 이 Strategy 타입으로 가지고 있게 되어야 할 것입니다. 그러면 예제를 보도록 하겠습니다. text-formatter라는 인터페이스가 있고요. 그 안에 format이라는 알고리즘을 담을 수 있는 method를 define 했습니다. 그래서 이 text-formatter 인터페이스를 implementation을 하는 예를 들어서 capTextFormatter에서는 이 format을 알고리즘을 정리를 해서 이 method에다가 넣게 되는 거죠. 그 다음 lowerTextFormatter는 이 format에다가 다른 알고리즘을 정의해서 넣게 됩니다. 그렇게 되면 이제 알고리즘을 바깥 끼는 거죠. 캡 텍스트 포메터에 알고리즘을 가지고 있다가 텍스트 포메터에 그 알고리즘을 넣어 주는 거예요. 그럼 그 알고리즘으로 포메치라는 것을 인보케이션 할 거고요. 그리고 나서 이번에는 다른 Roll Text Formatter를 아우젝을 바꿔 끼고 Text Editor에 또 그 알고리즘을 넣었습니다. 그러면 또 작업을 할 수 있도록 해줄 수 있죠. 그래서 첫 번째 CapitalRoleKase 나왔습니다. 이렇게 해서 Strategy Design 패턴은 Behavior를 다르게 가지고 있는 동종의 클래스를 하나의 관련된 클래스로 묶어주는 거예요. 그래서 Strategy Interface로 잡아주고요. 각 concrete 클래스에서는 그 behavior가 각각 다른 형태로 들어갈 수 있도록 해줄 수가 있습니다. 그래서 알고리즘을 바꾸는 경우에 strategy 디자인 패턴이 아주 많이 사용이 됩니다. 그래서 알고리즘에 관련된 작업을 하이럭하게 되죠. 구조로 반영을 한 것이다 라고 보시면 되겠고요 그래서 클라이언트는 알고리즘을 자세하게 모르고 그 내용만 가지고 패턴을 적용해서 concrete 클래스를 받아가는 거죠 그래서 이런 클래스는 behavior가 많고 각 behavior가 하는 역할이 separation of concern이 있고요. 거기에 따라서 그 operation을 메소드에서 할 수 있도록 해주고 구조적인 것은 인터페이스로 뽑아서 외부에서는 그 인터페이스만 연결한 상태에서 작업을 할 수 있는 구조를 갖고 있습니다. 감사합니다.

전략 패턴: 알고리즘 캡슐화 | Alt