๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š์ฝ์€ ์ฑ… ์ •๋ฆฌ/๊ฐ์ฒด์ง€ํ–ฅ๋””์ž์ธํŒจํ„ด

[๊ฐ์ฒด์ง€ํ–ฅ ๋””์ž์ธ ํŒจํ„ด] 5์žฅ : ์ŠคํŠธ๋ž˜ํ‹ฐ์ง€ ํŒจํ„ด (์ „๋žต ํŒจํ„ด)

์ „๋žต ํŒจํ„ด

์ „๋žตํŒจํ„ด์€ ๋ง๊ทธ๋Œ€๋กœ ์ „๋žต์„ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฐฉ์‹์ด ํด๋ž˜์Šค๋ณ„๋กœ ์บก์Šํ™”๋˜์–ด์žˆ๊ณ  ํ•„์š”ํ•  ๋•Œ ์ด๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ „๋žต์„ ๊ต์ฒดํ•˜์—ฌ ์œ ์—ฐํ•˜๊ฒŒ ํ™•์žฅํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

 

draw.io์—์„œ ๊ทธ๋ ค๋ด„

Context๋Š” ํ•„์š”์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์ „๋žต์„ ๋ฐ”๊ฟ”๋‚„ ์ˆ˜ ์žˆ๋‹ค (์ „๋žต๊ณผ ์ง‘์•ฝ๊ด€๊ณ„)

Strategy๋Š” ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์„ ๋ช…์‹œํ•œ๋‹ค.

ConcreteStrategy๋Š” ์ „๋žต์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์ด๋‹ค.

 

๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด์ž.

ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ์˜ ์ฝ”๋“œ

public abstract class Robot {

    private String name;

    public Robot(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    // ๊ณต๊ฒฉ
    public abstract void attack();

    // ์ด๋™
    public abstract void move();

}

๋กœ๋ด‡์ด ์ƒ์œ„ ์ถ”์ƒํด๋ž˜์Šค๋กœ ์žˆ๊ณ  ์ด๋ฅผ ์ƒ์†ํ•˜๋ฉด ํ•˜์œ„ ํด๋ž˜์Šค์ธ Atom์€  attack()๊ณผ move()๋ฅผ Atom์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ atom์€ attack๋˜๋Š” move๋ผ๋Š” 'ํ–‰์œ„'๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”์„œ๋“œ์˜ ์ง์ ‘ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค.

 

1. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ์ฝ”๋“œ์˜ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ด๋Š” OCP(๊ฐœ๋ฐฉํ์‡„์›์น™)์— ์œ„๋ฐฐ๋œ๋‹ค.

2. ์ค‘๋ณต์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ํ•˜์œ„ ํด๋ž˜์Šค์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์ˆ˜์ •์ด ํ•„์š”ํ•  ๋•Œ ์ด๋ฅผ ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค. ์ค‘๋ณต์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ๋ฐœ์ƒ ์‹œ ๊ด€๋ จ๋œ ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ”ผํ•ด์ง„๋‹ค.

 

ํ•ด๊ฒฐ์ฑ…

๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋ฌด์—‡์ด ๋ณ€ํ™”๋˜์—ˆ๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

-> ๋กœ๋ด‡ ํด๋ž˜์Šค์—์„œ ๋กœ๋ด‡์˜ ์ด๋™๋ฐฉ์‹๊ณผ ๊ณต๊ฒฉ ๋ฐฉ์‹์ด ๋ณ€ํ™”ํ•œ๋‹ค. ์ด๋ฅผ ์บก์Šํ™”ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณด์ž.

 

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋™์ž‘ ๋ฐฉ์‹์„ ์บก์Šํ™”ํ•˜๊ณ  ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ๋„˜๊ฒจ์ค˜์•ผ๋งŒ ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ฐฉํ™”๋ฒฝ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ด ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ๋ชปํ•œ๋‹ค. (OCP๋ฅผ ๋งŒ์กฑํ•œ ์„ค๊ณ„)

//getter, setter ์ƒ๋žต
public abstract class Robot {

    private String name;
    private MovingStrategy movingStrategy;
    private AttackStrategy attackStrategy;

    public Robot(String name) {
        this.name = name;
    }

    public void move() {
        movingStrategy.move();
    }

    public void attack() {
        attackStrategy.attack();
    }
}

 

Robotํด๋ž˜์Šค๋Š” ๊ธฐ์กด์˜ ์ƒ์† ๊ด€๊ณ„์—์„œ ์ง‘์•ฝ๊ด€๊ณ„๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ๋ณ€๊ฒฝ ๋ฐœ์ƒ ์‹œ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ”ผ ํ–ˆ์ง€๋งŒ ์ง‘์•ฝ๊ด€๊ณ„๋กœ ๋ฐ”๋€Œ์–ด ๋‚ด๋ถ€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์—†์ด ์ฝ”๋“œ๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด์ฃผ์–ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ

public class Client {
    public static void main(String[] args) {
        Robot taekwonV = new TaekwonV("TaekwonV");
        Robot atom = new Atom("Atom");

        taekwonV.setMovingStrategy(new WalkingStrategy());
        taekwonV.setAttackStrategy(new MissileStrategy());

        atom.setMovingStrategy(new FlyingStrategy());
        atom.setAttackStrategy(new PunchStrategy());

        System.out.println("My name is " + taekwonV.getName());
        taekwonV.move();
        taekwonV.attack();

        System.out.println("My name is " + atom.getName());
        atom.move();
        atom.attack();
    }
}

robot์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ด๋™๋ฐฉ์‹์ด๋‚˜ ๊ณต๊ฒฉ๋ฐฉ์‹์ด ๋ฐ”๋€Œ๋”๋ผ๋„ ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ์ง์ ‘ ์ˆ˜์ •์—†์ด ์™ธ๋ถ€์—์„œ ์ฃผ์ž…์„ ํ†ตํ•ด ๋ฐฉ์‹์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.