์ „๋žต ํŒจํ„ด์ด๋ž€?

๊ฐ„๋‹จํžˆ ์–˜๊ธฐํ•˜๋ฉด ํ–‰์œ„ ๋˜๋Š” ๋™์ž‘์„ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜๊ณ  ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํŒŒํ„ด์„ ๋งํ•œ๋‹ค. ์กฐ๊ธˆ ๋” ํ’€๋ฉด, ๊ฐ์ฒด์˜ ํ–‰์œ„๋ฅผ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜๊ณ  ์œ ์‚ฌํ•œ ๊ฒƒ๋ผ๋ฆฌ ๋ฌถ์–ด(์บก์Аํ™”ํ•˜์—ฌ) ๊ฐ์ฒด์˜ ํ–‰์œ„๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๋ฐ”๊ฟ”์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋กœ์จ ๋กœ์ง ๋ณ€๊ฒฝ์ด๋‚˜ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ๋•Œ ์กฐ๊ธˆ ๋” ์œ ์—ฐํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.


์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž

๊ตฐ์šฉ ๋ฏธ์‚ฌ์ผ์—๋Š” ์ง€๋Œ€๊ณต, ๊ณต๋Œ€๊ณต, ๋Œ€์ „์ฐจ์šฉ ๋ฏธ์‚ฌ์ผ ๋“ฑ์ด ์žˆ๋‹ค. ๊ตฐ์šฉ ์ž์‚ฐ์ธ ํญ๊ฒฉ๊ธฐ(Bomber)๋Š” ๊ณต๋Œ€์ง€ ๋ฏธ์‚ฌ์ผ๊ณผ ๋Œ€์ „์ฐจ ๋ฏธ์‚ฌ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ „ํˆฌ๊ธฐ(Fighter)์˜ ๊ฒฝ์šฐ๋Š” ๊ณต๋Œ€๊ณต ๋ฏธ์‚ฌ์ผ๊ณผ ๋Œ€์ „์ฐจ ๋ฏธ์‚ฌ์ผ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์—ฌ๋Ÿฌ ๋ฌด๊ธฐ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ์ „๋žต ํŒจํ„ด์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๊ณต๊ฒฉํ•  ๋•Œ๋งˆ๋‹ค ๋ฏธ์‚ฌ์ผ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์—ฌ๊ธฐ์„œ ์ „๋žต(strategy)์€ ๋ฏธ์‚ฌ์ผ์ด ๋œ๋‹ค. ๋ฏธ์‚ฌ์ผ ์ „๋žต์„ ์บก์Аํ™”ํ•˜์—ฌ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ”๊ฟ”์ค„ ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์ž.


๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ

๋จผ์ € ๊ตฌํ˜„ํ•  ์ „๋žต ํŒจํ„ด์˜ ๊ตฌ์กฐ๋ฅผ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ™•์ธํ•ด๋ณด์ž.

์ „๋žต ํŒจํ„ด์˜ ์ „๋žต(strategy)์ด ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๋ฏธ์‚ฌ์ผ ์ „๋žต์„ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š” ํญ๊ฒฉ๊ธฐ์™€ ์ „ํˆฌ๊ธฐ๋„ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•œ๋‹ค. ๋ฌผ๋ก  ์ด๋“ค์€ ์ˆ˜ํผ ํด๋ž˜์Šค๋กœ Unit๋ฅผ ์ƒ์†ํ•˜๋ฉฐ ์ˆ˜ํผ ํด๋ž˜์Šค์—๋Š” ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š” missileAttack ๋ฉ”์„œ๋“œ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

The class diagram of strategy pattern


์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

์ „๋žต ํŒจํ„ด์„ ์ž๋ฐ”(Java) ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด๋ณด์ž.

๋จผ์ €, ์ „๋žต(Strategy)๋ฅผ ์ •์˜ํ•œ๋‹ค. ํ–‰์œ„๋ฅผ ๋ฌถ์–ด ์บก์Аํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋จผ์ € ์ •์˜ํ•˜๊ณ  ๊ฐ ์ „๋žต ํด๋ž˜์Šค๊ฐ€ ์ด๋ฅผ ๊ตฌํ˜„(implements) ํ•˜๋„๋ก ํ•œ๋‹ค.

public interface MissileStrategy {
	void doAttack();
}

class AntiTankMissile implements MissileStrategy {

	@Override
	public void doAttack() {
		// ๋Œ€์ „์ฐจ ๋ฏธ์‚ฌ์ผ
	}
}

class AirToSurfaceMissile implements MissileStrategy {

	@Override
	public void doAttack() {
		// ๊ณต๋Œ€์ง€ ๋ฏธ์‚ฌ์ผ
	}
}

class AirToAirMissile implements MissileStrategy {

	@Override
	public void doAttack() {
		// ๊ณต๋Œ€๊ณต ๋ฏธ์‚ฌ์ผ
	}
}

๋‹ค์Œ์œผ๋กœ ๋ฏธ์‚ฌ์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ๋‹›์„ ์ •์˜ํ•œ๋‹ค. Unit ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด๋ฅผ ์ƒ์†ํ•˜๋Š” ํญ๊ฒฉ๊ธฐ(Bomber)์™€ ์ „ํˆฌ๊ธฐ(Fighter)๋ฅผ ์ •์˜ํ•œ๋‹ค.

public class Unit {
	private MissileStrategy strategy;

	public void missileAttack() {
		strategy.doAttack();
	}

	public void setMissileStrategy(MissileStrategy missileStrategy) {
		this.strategy = missileStrategy;
	}
}

class Bomber extends Unit {
  // ํญ๊ฒฉ๊ธฐ
}

class Fighter extends Unit {
  // ์ „ํˆฌ๊ธฐ
}

๋งˆ์ง€๋ง‰์œผ๋กœ ์ „๋žต ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

public class StrategyPatternTest {
	public static void main(String[] args) {
		Unit fighter = new Fighter();
		Unit bomber = new Bomber();

		// ์ „ํˆฌ๊ธฐ์˜ ๋ฏธ์‚ฌ์ผ ์ „๋žต
		fighter.setMissileStrategy(new AntiTankMissile());

		// ํญ๊ฒฉ๊ธฐ์˜ ๋ฏธ์‚ฌ์ผ ์ „๋žต
		bomber.setMissileStrategy(new AirToSurfaceMissile());

		fighter.missileAttack();
		bomber.missileAttack();

		// ์ „ํˆฌ๊ธฐ์˜ ๋ฏธ์‚ฌ์ผ ์ „๋žต์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
		fighter.setMissileStrategy(new AirToAirMissile());
		fighter.missileAttack();
	}
}

์ „๋žต ํŒจํ„ด์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, ์ด ํŒจํ„ด์˜ ์žฅ์ ์„ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๋‹ค. ์ƒˆ๋กœ์šด ๋ฏธ์‚ฌ์ผ ์ „๋žต์ด ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด ์ƒˆ๋กœ์šด Strategy ํด๋ž˜์Šค๋งŒ ์ •์˜ํ•˜์—ฌ ๊ธฐ์กด์˜ MissileStrategy ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.