Search

반응형

'strategy'에 해당되는 글 1건

  1. 2020.03.17 [디자인패턴]스트래티지 패턴(Strategy Pattern) 쉽게 이해하기 편. with 자바
반응형

안녕하세요. 신기한 연구소 티보이입니다.

프로그래밍에 전략과 전술이 필요하다면 스트래티지 패턴(Strategy Pattern)을 사용하라~

"공감"과 "구독"은 블로거에게 큰 힘이 됩니다. 도움이 되길 바라며 감사합니다.

우리가 만들 객체는 같은 기능, 슷한 기능 또는 전혀 다른 기능이 각각 포함될 수 있는데 이 기능들을 한 곳에 모아두면 엄청 심각한 문제가 발생하게 됩니다.

프로그래머들은 다들 아실겁니다. 수정사항이 발생했을 때 관련 소스를 다 찾아내고 수정하고 테스트하고 짜증도 나지만 오류까지 발생하면 진짜 돌아버리는 상황도 발생합니다.

그렇다고 다 걷어내고 새로 구성하기도 힘든 상황이 대부분이죠.

그래서 개발보다 유지보수에 시간이 더 필요하다는 말이 나오는 거겠죠.

이런 경우에 사용할 수 있는 패턴이 있습니다. 바로 스트래티지 패턴(Strategy Pattern) 인데요. 똑같은 기능을 구현하는 경우는 상속해서 사용하고 기능이 조금씩 다르거나 사용하지 않는 경우는 별도로 분리해서 관리하는 개념입니다. 이렇게 하면 유연성이 뛰어나게 되서 기능을 수정하게 되면 그 알고리즘만 수정하면 전체가 적용되게 됩니다.

하나의 예를 들어서 설명 시작합니다. 게임 프로그램을 하는데 전투에 필요한 객체를 만들어야 합니다. 첫 번째 기능은 공격입니다. 하지만 전투 객체 모두가 같은 공격을 하진 않아요. 물어뜯는 공격, 발톱으로 하는 공격, 몸에서 독을 뿜어내는 공격 등 공격이라는 기능이 있지만 상세하게는 다릅니다. 그리고 어떤 객체는 수송만 담당해서 공격을 하지 않아요. 어떤 객체는 하늘을 나는 기능이 있고 어떤 객체는 땅속으로 이동하는 기능이 있어요. 이동은 하지만 상세 기능이 다른겁니다.

그런데 종족마다 공통된 특징이 있어요 전부 눈이 4개이던지 아니면 꼬리가 있다던지 공통부분이 존재하는겁니다.

그리고 게임 객체들이 자원을 이용해 업그레이드도 할 수있습니다.

이제 이 기능들을 크게 분류해 봅니다.

공격 기능,

공격 기능에는 물어뜯기 공격, 발톱 공격, 독 공격으로 나눌 수 있고 이동 기능은 걷기, 날기, 땅속으로 파고 이동하기로 나눌 수 있습니다.

종족 클래스 하나에 이 모든 기능을 넣는다면 코드 가독성, 관리 등에 어려움이 발생합니다.

그래서 보통 종족별로 같은 기능을 추상 클래스로 만들어 상속 및 오버로딩, 오버라이딩을 할 수 있도록 설계합니다.

슈퍼 클래스로 종족을 대표하는 추상 클래스를 만듭니다. (예를 들어 화성인으로 Mars로 클래스명을 만듭니다.)

1. 추상 클래스에는 기본 생성자를 만듭니다.

2. 공통으로 구현할 부분을 추상메소드로 만들어 상속받을 서브클래스(게임 객체들)에서 구현하게 만듭니다.. 눈이 4개던지 꼬리가 있다던지 눈이 4개라도 위치가 다르거나 꼬리가 있어도 모양이 다를 수 있지만 꼭 있어야 하는 부분이라 추상메소드로 정의하고 하위 클래스에서 반드시 구현하게 만들어 줍니다.

3. 수정이 필요 없는 똑같은 기능은 직접 구현합니다. 종족의 모든 객체는 걸을 수 있다면 그 부분을 구현해서 상속받게 합니다. 굳이 서브클래스에서 중복해서 구현할 필요가 없어졌습니다.

4. 가장 중요한 부분인데 공격과 이동에 대한 각 객체의 구현이 다르기 때문에 유연하게 대응할 set 메서드와 실행 메서드가 필요합니다. 즉 추상 클래스나 서브클레스에서 구현하지 않고 어떤 기능을 어떻게 작동하게 할 건지 관련된 기능 클래스의 객체 설정부 및 호출부를 만듭니다.

이렇게 만든 추상 클래스를 이제 상속받아서 각 객체를 만들 클래스를 만듭니다. 수퍼클래스에 대한 서브클래스입니다.

이제 서브클래스에 대해 알아봅니다.

슈퍼클래스(추상 클래스)의

그게 서브클래스가 됩니다.

3개를 만든다면 지상 공격수(Grounder), 비행공격수비행 공격수(Flyer), 수송객체(Transer)수송 객체(Transer)로 만듭니다. 당연히 Mars 종족을 상속받아야겠지요..

이 클래스는 생성자로 공격과 이동에 대한 관련 클래스를 찾아 객체를 구현해야 합니다.

그리고 외형애 대한 메서드를 오버라이드 해서 눈 4개,4개, 꼬리를 상세하게 표현합니다.

이렇게 추상 클래스와 게임 객체들의 클래스를 구성합니다.

이제 남은 부분은 상세 기능들을 그룹화해서 구현하고 사용할 수 있게 만드는 겁니다.

크게 공격과 이동입니다. 이 부분을 공통 인터페이스로 작동이라는 메서드를 추상화해서 각각 만듭니다.

그리고 이빨 공격, 발톱 공격, 독 공격을 클래스로 만든 뒤 공격 인터페이스를 구현합니다.

또한 하늘날기, 땅굴파기, 수영 등 이동에 대한 클래스를 만들고 이동 인터페이스를 구현합니다.

크게 공격과 이동에 대한 그룹(캡슐화)을 만들었고 이 클래스들을 서브클래스에서 객체로 구현한 뒤 실행하면 됩니다.

, 이제 공격 기능이 추가되었다고 가정해봅니다. 자폭기능을 추가한다면 추상 클래스나 각 게임 캐릭터들을 만든 서브클래스에서 수정할 부분이 없습니다.

공격 인테페이스에묶인 공격 클래스 중 자폭이라는 클래스를 하나 추가하고 실행부에서 공격 기능(자폭클래스 객체 생성)을 바꿔서 실행만 하면 됩니다.

결국 추가적인 이동 방법이나 공격 방법이 필요하면 공격 알고리즘이나 이동 알고리즘에 해당 클래스만 추가하고 실행부에서 그 객체를 생성해서 종족에 던져주면 실행이 되는 겁니다.

게다가 다른 종족도 자폭기능이 추가된다면 종족 관련 클래스는 수정할 필요 없이 공격방법 알고리즘에 추가만 하면 되는거지요.

이렇게 전략적으로 캡슐화 한 인터페이스(알고리즘) 구성부를 잘 활용하면 기능 추가 및 변경으로 인한 메인 객체들이 수정될 일이 없고 분리되서 유연하게 사용할 수 있게 됩니다.

스트래티지 패턴(Strategy Pattern)에 대해 설명해 봤는데 이해가 되셨나요?

실제 코딩은 다음 포스팅 때 같이 해볼 계획입니다.

잘못된 부분이나 수정이 필요한 부분이 있으면 댓글 주세요.

우리 모두 즐코딩해요~

 

반응형