티스토리 뷰

코드 흐름
- 행동 전략 Interface - public void behave(String context)
- 각각 구체화된 전략들 클래스 - 메소드 오버라이딩
- 전략들을 사용할 주체 : 짱구
- 전략 세팅하는 메소드 - setStrategy (IBehaviorStrategy strategy)
- 전략 수행하는 메소드 - encountSituation(String situation)
- 짱구가 전략을 ‘사용’할 것이니 상위Interface 전략을 필드로 갖는다.
- 메인에서 짱구 주체 객체를 생성하고 짱구 a = new 짱구()
- 짱구가 전략 선택(setStrategy), 상황에 맞게 행동한다.(encountSituation)
IBehaviorStrategy
전략을 끼워넣는 구조 , OCP(개방폐쇄 원칙)에 충실한 패턴인 전략 패턴을 활용해보자.
전략 INTERFACE
public interface IBehaviorStrategy {
public void behave(String context);//특정상황에 있을 때 이 동작 해라 라고 알려준다.
}
INTERFACE를 구체화시킬 각각의 클래스 4개
- ActionMaskStrategy
- DanceStrategy
- SleepStrategy
- 철이Strategy
public class ActionMaskStrategy implements IBehaviorStrategy{
@Override
public void behave(String context) {
// TODO Auto-generated method stub
System.out.println(context +"상황 : 위풍당당!!!");
System.out.println("액션가면 출동! 파워워킹을 합니다~!!!!!!!!!!");
System.out.println("정의의 이름으로 악당을 물리치고 약자를 도와줍니다!!!!!!!!!!");
}
}
-----------------------
public class DanceStrategy implements IBehaviorStrategy{
@Override
public void behave(String context) {
// TODO Auto-generated method stub
System.out.println(context +" 상황 : 개구쟁이 모드! 매너? 그런거 업음!");
System.out.println("엉덩이 춤을 추면서 방귀 뽕뽕~");
}
}
----------------------
public class SleepStrategy implements IBehaviorStrategy{
@Override
public void behave(String context) {
// TODO Auto-generated method stub
System.out.println(context +" 상황... 갑자기 졸리다..ZZZZZZZ");
System.out.println("눈을 감고 상황을 회피해보자~!");
}
}
추가한 전략 : 철이Strategy
추가하는 게 정말 쉽다... OCP(개방폐쇄원칙에 완벽히 부합한다...)
public class 철이Strategy implements IBehaviorStrategy{
@Override
public void behave(String context) {
// TODO Auto-generated method stub
System.out.println(context +"상황 : 짱아에게 맡기기 모드!");
System.out.println("동생아 가라~~!!! 네가 나 대신 해줘!");
System.out.println("동생에게 어려운 건 다 맡겨버리자~~~ 짱아야 고마워^^!");
}
}
실제 전략을 선택하여 사용하는 짱구 주체
public class 짱구 {
private IBehaviorStrategy strategy = null;//final : 한번 결정해놓으면 수정 없이 쓰고 싶어
//set은 public이어야
//매너는 외부에서 주입하고 있다.
public void setStrategy(IBehaviorStrategy strategy) {
this.strategy = strategy;
System.out.println("-----현재 짱구의 매너전략(마음가짐) 변경: "+this.strategy.getClass().getSimpleName()+" 장착 완료!~~");
//getClass.getSimple
}
public void encountSituation(String situation) {
System.out.println("[상황 발생!] : "+situation);
//전략이 없다면(null)? - 생성자에다가 초기값을 넣어도된다. (기본적으로 잔다.)
if(this.strategy == null) {
System.out.println("현재 전략 없음! 무념무상! ");
System.out.println("그냥 놀아요~~~~~ ");
return;
}
//네가 가지고 있는 전략 동작을 수행해!!!!
this.strategy.behave(situation);
}
}
메인
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
짱구 a = new 짱구();
//전략이 없을 때
a.encountSituation("내일 갑자기 시험을 본다는 소식을 들었을 때 ");
//1. 엄마가 심부를 시키고자 하는 상황
a.setStrategy(new SleepStrategy());
a.encountSituation("엄마가 귀찮은 심부름을 시키려고 할 때 ");
//2. 훈이가 괴롭힘을 당하고 있는 상황
a.setStrategy(new ActionMaskStrategy());
a.encountSituation("훈이가 괴롭힘을 당해서 울고 있을 때 ");
//3. 개구쟁이 짱구. 유치원에서 놀고 있는 상황
a.setStrategy(new DanceStrategy());
a.encountSituation("친구들이랑 놀이터에서 놀고 있을 때 ");
//4. 엄마가 어려운 일을 시켰을 때
a.setStrategy(new 철이Strategy());
a.encountSituation("엄마가 쓰레기를 버리라고 말했을 때 ");
}
}
콘솔 결과

실제로 철이Strategy()를 추가해보니 너무 편리하다는 것을 느꼈다.
전략 Strategy 패턴이란, 다양한 전략들을 만들고 context에 따라 전략을 선택해서 적용하는 것이다. 쉽게 전략 교체가 가능하고, 유지보수에 용이하다는 걸 느꼈다. 코드를 따라 쳐 보면서 생각났던 원칙들로는
- Single responsibility(단일 책임 원칙) : 이름만 봐도 뭐하는지 알 수 있도록 각각의 클래스들은 하나의 책임만 갖고 있다,
- Open/closed(개방/폐쇄 원칙) : 추가/확장에 개방적(철이Strategy 추가로 느낌)이고, 기존 코드들을 해치지 않는다(폐쇄적).
- Liscov substitution 리스코프 치환 원칙 : 모든 전략 interface의 하위 클래스들이 behave() 메소드를 잘 구현했다.
- Interface segregation 인터페이스 분리 원칙 : 클래스들의 상위에 인터페이스가 있어서 설계도 역할을 하고 있다.
- Dependency Inversion 의존성 역전 원칙 : 상속받지 않고 필드로 갖고 있고 외부에서 생성한 걸 주입 받는다.
확실히 solid 원칙이나 패턴을 배우지 않았던 예전에 위 실습 내용을 구현하려 했다면 if, else if, else 더미를 만들어서 구현했을 것이다. 그런 점에서 새삼 위대한 원칙들이라는 것을 느꼈다.
'학교 강의 > Java프로그래밍및실습2' 카테고리의 다른 글
| [GUI+EVENT+THREAD] 알낳기 게임 (1) | 2025.11.02 |
|---|---|
| [디자인 패턴] Observer 패턴 조사 (2) | 2025.10.17 |
| [SOLID원칙] 코드 리팩토링 (1) | 2025.10.11 |
| [SOLID원칙] 문제 만들기 (0) | 2025.10.04 |
| [SOLID 원칙] 커피메이커.ver1 코드 이해하기 - SOLID 원칙 적용 (2) | 2025.10.01 |
