전략패턴
전략 패턴이 뭘까??
객체들이 할 수 있는 행위 각각에 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법
오리 시뮬레이션 게임, SimUduck
오리 시물레이션 게임을 개발한다고 생각해보자

오리 시뮬레이션 게임 차별화하기
개발 과정에서 오리가 날 수 있어야한다고 생각해서 날게 만들어야 한다 → Duck 클래스에 fly() 메소드 추가
문제 발생
RubberDuck과 같은 클래스가 Duck 을 상속한다 했을때 날지 못하기 때문에 fly를 오버라이딩 해서 날지 못한다고 해줘야함
DecoyDuck 과 같은 클래스는 날지도 못하고 꽥꽥거리지도 못한다고 오버라이딩을 해줘야함 → 유지 보수적으로 좋지 못한 디자인
그래서 인터페이스로 Flyable, Quakable 해결하려함

하지만 여기에도 치명적인 단점이 있다 → 이 해결법은 코드를 재사용하지 않음 따라서 코드를 일일이 다 수정해줘야함 마찬가지로 유지보수에 좋지 못한 디자인
title: 디자인 원칙
애플리케이션에서 **달라지는 부분을 찾아내고**, 달라지지 않는 부분과 **구분한다**
*바뀌는 부분은 따로 뽑아서 캡슐화한다. 그러면 나중에 바꾸지 않는 부분에는 영향을 미치지 않고 그 부분만 고치거나 확장할 수 있다*title: 디자인 원칙
구현보다는 **인터페이스에 맞춰서 프로그래밍**한다
인터페이스에 맞춰서 프로그래밍 한다는 말은 -> 상위 형식에 맞춰서 프로그래밍한다는 말이다.
쉽게 말해 굳이 자바의 인터페이스가 아니더라도 **상위클래스의 추상클래스 형식에 맞게 다형성을 활용하는 방향**으로 프로그래밍해야
유지 보수적인 측면에서 유리하다는 뜻이다
→ 이런 식으로 디자인 하면 다른 형식의 객체에서도 나는 행동과 꽥꽥거리는 행동을 재사용할 수 있다
자바로 구현해보기
몰랐던 자바문법까지
Duck 클래스
import Behaviors.FlyBehavior;
import Behaviors.QuackBehavior;
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {}
public void performQuack() {
quackBehavior.quack();
}
public void performFly() {
flyBehavior.fly();
}
public void swim() {
System.out.println("This Duck is Swimming");
}
public abstract void display();
}Duck 객체에는 추상 메소드가 있기 때문에 클래스를 추상 클래스로 선언해줘야한다
Duck 하위 클래스
public class MallardDuck extends Duck {
public MallardDuck () {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("It looks like MallardDuck");
}
}MallardDuck 클래스에서 캡슐화되어있는 전략들에 대해 구체적인 클래스로 초기화 시켜주고, 추상메소드를 구현한다.
그리고 처음 안 사실인데, 자바에서는 자바스크립트와 달리 함수단위 import가 되지 않는다. 그리고 import되기 위해서는 public으로 선언해줘야한다
하지만 자바에서는 public으로 클래스를 선언하려면 해당 파일명이랑 클래스명이 일치해야한다.
따라서 클래스를 여러개 사용한다 했을때 생각보다 파일을 많이 만들어야한다
실행 파일
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck md = new MallardDuck();
md.display();
md.swim();
md.performFly();
md.performQuack();
}
}실행결과

*.class파일
그리고 자바 실행을 해보면.class 파일로 도배가 되는것을 알수 있는데, 이는 자바가 컴파일한 바이트코드이다. JVM에서.class 파일을 실행한다 .class파일이 정상적으로 보이는 이유는 FernFlower 디컴파일러가 사람이 볼수 있게 변환해서 보여준다고 한다 실제론 이진코드들이다.
뭐 여튼.class로 도배되어서 작업물관리하기가 힘들어지기 때문에.class파일은 따로 관리하는게 좋다
컴파일 방법
javac -d bin 파일명.java 로 해당 파일을 bin폴더에 컴파일한 클래스파일들이 저장된다
실행방법
그리고 java -cp bin 파일명.java로 해당 클래스 파일을 실행시켜줄 수 있다
추가로 package 내부에서는 컴파일이 안되고 package의 상위 디렉토리까지 가야 컴파일 가능하다
