Skip to content

ttkmw/ioc-example

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

13 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

IoC Example

ํ† ๋น„์˜์Šคํ”„๋ง 1์žฅ ๊ธ€์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ผ์ƒ ์ƒํ™œ(๊ฐ€๊ตฌ๋งŒ๋“ค๊ธฐ)์— IoC๋ฅผ ์ ์šฉํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๊ธ€์—๋„ Commit์€ ํ™•์‹คํžˆ ํ‘œ์‹œํ•ด๋†จ์œผ๋‹ˆ, ๊ธ€๊ณผ ์ปค๋ฐ‹์„ ๋งค์นญ์‹œํ‚ค๋ฉฐ ๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€๊ตฌ๋ฅผ ๋งŒ๋“œ๋ ค๋ฉด ์ผ๋‹จ ๊ฐ€๊ตฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ž(์ดํ•˜ FurnitureMaker)๊ฐ€ ์žˆ์–ด์•ผ๊ฒ ์ฃ . ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Commit - feat: ํ•„์š”ํ•œ ๊ฐ์ฒด ์ •์˜

class FurnitureMaker {
    private final String name;

    FurnitureMaker(String name) {
        this.name = name;
    }
}

๊ทธ๋ฆฌ๊ณ  ๊ฐ€๊ตฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ชฉ์žฌ(์ดํ•˜ Wood)์™€ ์‡ ๋ง์น˜(์ดํ•˜ IronHammer)๋„ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

class Wood {}
class IronHammer {}

๋‘˜ ๋‹ค ํ˜„์žฌ ๋”ฑํžˆ ๊ธฐ๋Šฅ์ด ์ƒ๊ฐ๋‚˜์ง€๋„ ์•Š๊ณ , ํ•„๋“œ๋„ ์ƒ๊ฐ์ด ์•ˆ๋‚˜์„œ ์ •์˜๋งŒ ํ•ด๋†“์•˜์Šต๋‹ˆ๋‹ค. ์ž˜์งœ๊ณ  ๋ชป์งœ๊ณ ๋ฅผ ๋– ๋‚˜, ์„ค๋ช…์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•œ ๊ฒƒ ๋ฟ์ด๋‹ˆ ์กฐ๊ธˆ ์˜์•„ํ•ด๋„ ๋„˜์–ด๊ฐ€์ฃผ์„ธ์š”...!^^;

์ด์ œ ๊ฐ€๊ตฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์˜์ž(์ดํ•˜ Chair)๋ฅผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. Chair๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ ์–ด๋„ Wood 5๊ฐœ๋Š” ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Commit - feat: 1 - ์ดˆ๋‚œ๊ฐ FurnitureMaker - makeChair(), makeDesk()

class Chair {
    static final int WOOD_AMOUNT = 5;

    Chair(List<Wood> woods) {
        if (woods.size() != WOOD_AMOUNT) {
            throw new IllegalArgumentException(String.format("์˜์ž๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด %d๊ฐœ์˜ ๋‚˜๋ฌด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.", WOOD_AMOUNT));
        }
    }
}

๋‹ค์Œ์€ FurnitureMaker๊ฐ€ Chair๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

// FurnitureMaker.java
Chair makeChair() {
    List<Wood> woods = new ArrayList<>();
    for (int i = 0; i < Chair.WOOD_AMOUNT; i++) {
        woods.add(new Wood());
    }

    IronHammer ironHammer = new IronHammer();
    return ironHammer.makeChair(woods);
}

์‹ค์ œ๋กœ FurnitureMaker๊ฐ€ Chair๋ฅผ ์ž˜ ๋งŒ๋“œ๋Š” ์ง€ ํ™•์ธํ•ด๋ณผ๊นŒ์š”?

class FurnitureMakerTest {
    @Test
    void makeChair() {
        FurnitureMaker furnitureMaker = new FurnitureMaker("root");
        Chair chair = furnitureMaker.makeChair();
        assertThat(chair).isNotNull();
    }
}

ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋„ค์š”. FurnitureMaker๋Š” Chair๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ์ฝ”๋“œ์—๋Š” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฌธ์ œ์ผ๊นŒ์š”? ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” makeChair() ๋ฉ”์†Œ๋“œ ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ด€์‹ฌ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. makeChair() ํ•จ์ˆ˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

makeChair()์˜ ๊ด€์‹ฌ์‚ฌํ•ญ

  1. ํ•„์š”ํ•œ ์–‘์˜ Wood๋ฅผ ์ค€๋น„(์ƒ์„ฑ)ํ•˜๋Š” ๊ฒƒ
  2. ํ•„์š”ํ•œ IronMaker๋ฅผ ์ค€๋น„(์ƒ์„ฑ)ํ•˜๋Š” ๊ฒƒ
  3. ์ค€๋น„๋ฌผ(Wood, IronMaker)๋ฅผ ํ™œ์šฉํ•˜์—ฌ Chair๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ

๋งŽ์€ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒŒ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, 1๋ฒˆ์ด๋‚˜ 2๋ฒˆ์€ ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ์ด ๋งŽ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, FurnitureMaker๊ฐ€ Chair ๋ง๊ณ ๋„ Desk๋„ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

// FurnitureMaker.java
Desk makeDesk() {
    List<Wood> woods = new ArrayList<>();
    for (int i = 0; i < Desk.WOOD_AMOUNT; i++) {
        woods.add(new Wood());
    }

    IronHammer ironHammer = new IronHammer();
    return ironHammer.makeDesk(woods);
}

์ฝ”๋“œ ๊ฐœ์„  1: ๋ฉ”์†Œ๋“œ ์ถ”์ถœ

Desk๋ฅผ ๋งŒ๋“ค ๋•Œ๋„ Wood์™€ IronHammer๋ฅผ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ์ด ์ค‘๋ณต๋ถ€ํ„ฐ ์—†์• ๋ด…์‹œ๋‹ค. Commit - feat: 2 - ๋ฉ”์†Œ๋“œ ์ถ”์ถœ(getWoods(), getIronHammer())์„ ํ†ตํ•œ ์ค‘๋ณต ์ œ๊ฑฐ

// FurnitureMaker.java
private List<Wood> getWoods(int woodAmount) {
    List<Wood> woods = new ArrayList<>();
    for (int i = 0; i < woodAmount; i++) {
        woods.add(new Wood());
    }
    return woods;
}
// FurnitureMaker.java
private IronHammer getIronHammer() {
    return new IronHammer();
}

์ด์ œ Chair, Desk ๋ฟ ์•„๋‹ˆ๋ผ, ์žฅ๋กฑ์„ ๋งŒ๋“ค๋“  ์˜ท์žฅ์„ ๋งŒ๋“ค๋“  ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ getWoods()์™€ getIronHammer๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด์˜ ์ค‘๋ณต์€ ์—†์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋งจ ์ฒ˜์Œ ์ฝ”๋“œ๋ณด๋‹ค๋Š” ์ข‹์•„์กŒ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์˜์ž๋Š” ์–ด๋–ค ๋ชฉ์žฌ๋ฅผ ์“ฐ๋Š๋ƒ์— ๋”ฐ๋ผ ๊ทธ ํ’ˆ์งˆ์ด ๋‹ฌ๋ผ์ง„๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ์žฌ๊ฐ€ ์–ด๋”” ํ•œ๋‘˜์ด๊ฒ ์Šต๋‹ˆ๊นŒ? ์ง€๋‚˜๊ฐ€๋‹ค ๊ตด๋Ÿฌ๋‹ค๋‹ˆ๋Š” ๋ชฉ์žฌ๋„ ์žˆ์„ ๊ฒƒ์ด๊ณ , ์ฒœ๋…„ ๋ฌต์€ ๊ท€ํ•œ ๋ชฉ์žฌ๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ˜„์‹ค ์„ธ๊ณ„์™€ ๋‹ค๋ฅด๊ฒŒ, Wood๋ผ๋Š” ๊ฐ์ฒด ํ•˜๋‚˜ ๋ฟ์ž…๋‹ˆ๋‹ค.
  2. ์žฅ์ธ์€ ๋„๊ตฌ๋ฅผ ํƒ“ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง๋„ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ FurnitureMaker๋Š” IronHammer ๋ฐ–์— ๋ชป์”๋‹ˆ๋‹ค. ๋ง์น˜๊ฐ€ ๊ผญ ์‡ ์—ฌ์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋Œ๋ง์น˜, ๋‚˜๋ฌด๋ง์น˜, ์‹ฌ์ง€์–ด ๊ณ ์ˆ˜๋Š” ๋ฟ…๋ง์น˜๋กœ๋„ ์˜์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ˜„์‹ค ์„ธ๊ณ„์™€ ๋‹ค๋ฅด๊ฒŒ, ๋ง์น˜๋Š” IronHammer๋ผ๋Š” ๊ฐ์ฒด ํ•˜๋‚˜ ๋ฟ์ž…๋‹ˆ๋‹ค.

์ถ”์ƒํ™”

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € Wood์™€ Hammer๋ฅผ interface๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ถ”์ƒํ™”ํ•ด๋ด…์‹œ๋‹ค. ์–ด์ฐจํ”ผ Wood๋“  Hammer๋“  ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•œ๋‹ค๋Š” ๊ฑด ๋˜‘๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— Hammer ์ฝ”๋“œ๋งŒ ์ ์–ด๋†“๊ฒ ์Šต๋‹ˆ๋‹ค. Commit - feat: 3 - Wood, Hammer ์ถ”์ƒํ™”

interface Hammer {
    Chair makeChair(List<Wood> woods);

    Desk makeDesk(List<Wood> woods);
}
class IronHammer implements Hammer {
    @Override
    public Chair makeChair(List<Wood> woods) {
        return new Chair(woods);
    }

    @Override
    public Desk makeDesk(List<Wood> woods) {
        return new Desk(woods);
    }
}

์—ฌ๊ธฐ์—์„œ ๋‹ค์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”์ƒํ™”๋ฅผ ํ•˜๋ฉด ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

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

์—ฌ๊ธฐ์„œ ์งˆ๋ฌธ!

๋ญ˜ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋ƒ๊ณ ์š”? ์ •๋‹ต์€ "๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค" ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‡ ๋ง์น˜๋“  ๋ฟ…๋ง์น˜๋“  ๋‘˜ ๋‹ค ๋ง์น˜์ฃ ? ๊ทธ๋‹ˆ๊นŒ ๋ง์น˜๋ผ๊ณ  ์ถ”์ƒํ™”ํ•˜๋ฉด(๋ญ‰๋šฑ๊ทธ๋ฆฌ๋ฉด), FurnitureMaker๊ฐ€ ์‡ ๋ง์น˜๋“  ๋ฟ…๋ง์น˜๋“  ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํŒ!

ํ˜„์žฌ "๋ง์น˜"๋กœ ์ถ”์ƒํ™”ํ–ˆ์ฃ . ์‡ ๋ง์น˜, ๋ฟ…๋ง์น˜์˜ ๊ณตํ†ต์ ์„ ์ถ”๋ ค์„œ ๋ง์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ค ์žฅ์ธ์€ ๋ง์น˜๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„, ๋Œ๋ฉฉ์ด๋กœ๋„ ์˜์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ์–ด์ฉŒ๋ฉด ๊ตด๋Ÿฌ๋‹ค๋‹ˆ๋Š” ์ปคํ”ผ์บ”์œผ๋กœ๋„ ์˜์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ . ๊ทธ๋Ÿฌ๋ฉด ๋ง์น˜, ๋Œ๋ฉฉ์ด, ์ปคํ”ผ์บ”๋„ ๊ณตํ†ต์ ์ด ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ์˜ˆ๋ฅผ ๋“ค์–ด, '๋‹จ๋‹จํ•˜๋‹ค'์™€ ๊ฐ™์€ ๊ณตํ†ต์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ฃ . ์ด ์žฅ์ธ์€ ์ง„์งœ ๋„๊ตฌ๋Š” ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ , ๋ญ๋งŒ ์žˆ๊ธฐ๋งŒ ํ•˜๋ฉด ์˜์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‚˜๋ด…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ง์น˜๋“  ๋Œ๋ฉฉ์ด๋“  ์ปคํ”ผ์บ”์ด๋“  ์ƒ๊ด€์—†์ด ๋„๊ตฌ๋ฉด ๋˜๋‹ˆ, "๋„๊ตฌ"๋ผ๊ณ  ์ถ”์ƒํ™”ํ•ด๋ด…์‹œ๋‹ค. "๋ง์น˜"๋Š” ์–ด์ฐŒ๋ณด๋ฉด ์ถ”์ƒํ™”์˜ ๊ฒฐ๊ณผ๋ฌผ์ด์—ˆ๋Š”๋ฐ, "๋ง์น˜"๋ฅผ ๋˜ ์ถ”์ƒํ™”ํ•ด์„œ "๋„๊ตฌ"๊ฐ€ ๋๋„ค์š”? ์ด๋Ÿด ๋•Œ ํ•œ ๋‹จ๊ณ„ ๋” ์ถ”์ƒํ™”ํ–ˆ๋‹ค๋Š” ํ‘œํ˜„์„ ์“ฐ๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ๋ฆฌ๊ณ  ๋ง์น˜๋กœ ์ถ”์ƒํ™”ํ–ˆ์„ ๋•Œ๋ณด๋‹ค ๋„๊ตฌ๋กœ ์ถ”์ƒํ™”ํ–ˆ์„ ๋•Œ ๋” "๊ณ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”์ด๋‹ค"๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋”๋ผ๊ณ ์š”.

FurnitureMaker์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class FurnitureMaker {
    private final String name;

    FurnitureMaker(String name) {
        this.name = name;
    }

    Chair makeChair() {
        List<Wood> woods = getWoods(Chair.WOOD_AMOUNT);

        Hammer hammer = getHammer();
        return hammer.makeChair(woods);
    }

    Desk makeDesk() {
        List<Wood> woods = getWoods(Desk.WOOD_AMOUNT);

        Hammer hammer = getHammer();
        return hammer.makeDesk(woods);
    }

    private List<Wood> getWoods(int woodAmount) {
        List<Wood> woods = new ArrayList<>();
        for (int i = 0; i < woodAmount; i++) {
            woods.add(new CheapWood());
        }
        return woods;
    }

    private Hammer getHammer() {
        return new IronHammer();
    }
}

makeChair(), makeDesk() ํ•จ์ˆ˜๋“ค์—์„œ ์ถ”์ƒํ™”๋œ Wood์™€ Hammer๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑธ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ "์ถ”์ƒํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค"๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ์š”. ์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์‹ค์ œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ญ... ๊ฐ€๋Šฅ์€ ํ•ฉ๋‹ˆ๋‹ค๋งŒ, ์ถ”์ƒํ™”์˜ ๊ฐ€์น˜๋ฅผ ์‚ด๋ฆฌ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜๋ฉด, ๋ฐ”๊ฟ€ ์ˆœ ์žˆ์ง€๋งŒ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆœ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด, new CheapWood(), new IronHammer() ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Wood, Hammer๋ฅผ ์“ฐ๊ณ  ์‹ถ์œผ๋ฉด FurnitureMaker์˜ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ฐ”๊ฟ”์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ์„ค๋ช…ํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ค์›Œ์„œ, ์‹ค์ƒํ™œ์— ๋น—๋Œ€์–ด ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ์ข‹์€ Wood๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒŒ FurnitureMaker์˜ ํ•ต์‹ฌ์—ญ๋Ÿ‰์ด๋ผ๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด FurnitureMaker๋Š” ์ด๊ฑธ ๋น„๋ฐ€๋กœ ํ•˜๊ณ  ์‹ถ๊ฒ ์ฃ . ํ•˜์ง€๋งŒ ์‹ค์ƒ์€ ์–ด๋–ค๊ฐ€์š”? FurnitureMaker๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ(FurnitureMaker์˜ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ)์€ ์ด ์‚ฌ๋žŒ์ด ์–ด๋–ป๊ฒŒ Wood๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ง€, ์–ด๋–ค Hammer๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ง€ ์•Œ ์ˆ˜ ์žˆ์ฃ . ์ด๋Ÿฐ ์ƒํƒœ๋ก  FurnitureMaker๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋…ธํ•˜์šฐ๋ฅผ ๋ฒ ๊ปด์„œ ์ซ„๋”ฑ ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋„ˆ๋ฌด ํˆฌ๋ช…ํ•ด์„œ ์‚ฌ๊ธฐ๋ฅผ ์น˜๊ณ  ์‹ถ์–ด๋„ ์น  ์ˆ˜๋„ ์—†์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚˜์œ ์‚ฌ๋žŒํ•œํ…Œ๋Š” ์‹ผ ๋ชฉ์žฌ๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ๋น„์‹ผ ์˜์ž๋ผ๊ณ  ์†์—ฌ์„œ ํŒ”๊ณ , ์ฐฉํ•œ ์‚ฌ๋žŒํ•œํ…Œ๋Š” ๋น„์‹ผ ๋ชฉ์žฌ๋ฅผ ์“ด๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. Chair๋ฅผ ์‚ฌ๋Š” ์‚ฌ๋žŒ์ด Furniture๊ฐ€ ์–ด๋–ค Wood๋ฅผ ์“ฐ๋Š” ์ง€, ์–ด๋–ค Hammer๋ฅผ ์“ฐ๋Š” ์ง€ ์•Œ๊ธฐ ๋•Œ๋ฌธ์— ์†์ผ ์ˆ˜๊ฐ€ ์—†์ฃ . ์„ค๋ น FurnitureMaker๊ฐ€ ๊ณตํ‰ํ•˜๊ณ , ์›Œ๋‚™ ํˆฌ๋ช…ํ•ด์„œ ์‚ฌ๊ธฐ์น˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ด๋„ ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋ถ€์ž๊ฐ€ ์™€์„œ, "์ „ ๋น„์‹ผ ๋ชฉ์žฌ๋ฅผ ์จ์ฃผ์„ธ์š”"๋ผ๊ณ  ํ•˜๋ฉด, FurnitureMaker๋Š” "์ž ์‹œ๋งŒ์š”! ์ง€๊ธˆ getWood ์ฝ”๋“œ์—์„œ ์‹ผ ๋ชฉ์žฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์–ด์„œ์š”. ๊ธˆ๋ฐฉ ๋ฐ”๊ฟ”์ค„๊ฒŒ์š”!" ๋ผ๊ณ  ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์†๋‹˜์ด ์‹ผ ๋ชฉ์žฌ๋ฅผ ์›ํ•œ๋‹ค๋ฉด? ๋˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์ค˜์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด FurnitureMaker.java์—์„œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ ์ž์ฒด๋กœ ๋ณ€ํ™”์— ๋Œ€์‘ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. getWood, getHammer์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ์š”?

์ฝ”๋“œ ๊ฐœ์„  2: ์ƒ์†์„ ํ†ตํ•œ ํ™•์žฅ

๋ฌผ๋ก  ์žˆ์Šต๋‹ˆ๋‹ค. FurnitureMaker์˜ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” FurnitureMaker๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ "์‚ฌ์žฅ์ด ํ˜ผ์ž ๊ฐ€๊ฒŒ๋ฅผ ์šด์˜ํ•˜๋‹ค๊ฐ€, ์นœ๊ตฌ๋ฅผ ์˜์ž…ํ•˜๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ณ ๊ฐ์— ๋”ฐ๋ผ ๋ฐ”๋€Œ๋Š” ํ•จ์ˆ˜๋“ค์„ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Commit - feat: 4 - ์ƒ์†์„ ํ†ตํ•œ ํ™•์žฅ

abstract class FurnitureMaker {
  
		...
      
    public abstract List<Wood> getWoods(int woodAmount);

    public abstract Hammer getHammer();
}

์ด์ œ ๊ฐ€๊ตฌ๋ฅผ ์‚ฌ๋Š” ๊ณ ๊ฐ์€ Furniture.java ์ฝ”๋“œ๋งŒ ๋ด์„œ๋Š” ์–ด๋–ค Wood๋ฅผ ์“ฐ๋Š” ์ง€ ์•Œ ์ˆ˜ ์—†๊ฒŒ ๋๊ธฐ ๋•Œ๋ฌธ์—, ํ•ต์‹ฌ์—ญ๋Ÿ‰์„ ๊ฐ์ถœ ์ˆ˜ ์žˆ์„ ๋ฟ ์•„๋‹ˆ๋ผ ๊ณ ๊ฐ์— ๋”ฐ๋ผ ์‰ฝ๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜๋„ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ถ€์ž๊ฐ€ ์™”๋‹ค? ์‚ฌ์žฅ์ด ์ƒ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

public class FurnitureMakerForRich extends FurnitureMaker {
    FurnitureMakerForRich(String name) {
        super(name);
    }

    @Override
    public List<Wood> getWoods(int woodAmount) {
        List<Wood> woods = new ArrayList<>();
        for (int i = 0; i < woodAmount; i++) {
            woods.add(new ExpensiveWood());
        }
        return woods;
    }

    @Override
    public Hammer getHammer() {
        return new IronHammer();
    }
}

๋ˆ ์—†๋Š” ์‚ฌ๋žŒ์ด ์™”๋‹ค? ์˜์ž…ํ•œ ์นœ๊ตฌ๊ฐ€ ์ƒ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

public class FurnitureMakerForPoor extends FurnitureMaker {
    FurnitureMakerForPoor(String name) {
        super(name);
    }

    @Override
    public List<Wood> getWoods(int woodAmount) {
        List<Wood> woods = new ArrayList<>();
        for (int i = 0; i < woodAmount; i++) {
            woods.add(new CheapWood());
        }
        return woods;
    }

    @Override
    public Hammer getHammer() {
        return new IronHammer();
    }
}

๊ธฐ์กด์—๋Š” ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์— ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋กœ ๋ถ„๋ฆฌ๋๋˜ getWood, getHammer๋ผ๋Š” ๊ด€์‹ฌ์„ ์ƒ์†์„ ํ†ตํ•ด ์„œ๋ธŒํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋•๋ถ„์— FurnitureMaker์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” makeChair(), makeDesk(), ์ฆ‰ ์‹ค์ œ๋กœ ๊ฐ€๊ตฌ๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ(FurnitureMaker)์™€ ์–ด๋–ค ์ค€๋น„๋ฌผ(Wood, Hammer ๋“ฑ)์„ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ง€ ๋“ฑ์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋‹ค๋ฃจ๋Š” ํด๋ž˜์Šค(FurnitureMakerForPoor, FurnitureMakerForRich)๋ฅผ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ FurnitureMaker์˜ ์ฝ”๋“œ๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ Wood๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋‹ˆ์ฆˆ๋ฅผ ๋ฐœ๊ฒฌํ•˜์—ฌ ํŠน๋ณ„ํ•œ ๊ณ ๊ฐ์ด ์˜ค๋”๋ผ๋„, FurnitureMaker๋ฅผ ์ƒ์†ํ•˜์—ฌ ๊ทธ ๊ณ ๊ฐ์— ๋งž์ถ”๋ฉด ๋ฉ๋‹ˆ๋‹ค(์ฆ‰ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ƒ์† ๋ฐฉ์‹์—๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ๋กœ, ๋งŒ์•ฝ ํ•˜์œ„ํด๋ž˜์Šค๊ฐ€ ์ด๋ฏธ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์›ํ•˜๋Š” ์ˆ˜ํผํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, FurnitureMakerForPoor๊ฐ€ ๊ฐ€๊ตฌ ๋ฟ ์•„๋‹ˆ๋ผ ๋ถ€์—…์œผ๋กœ ์ปดํ“จํ„ฐ๋„ ๋งŒ๋“ค์–ด์ค€๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. ํ•˜์ง€๋งŒ FurnitureMakerForPoor๋Š” FurnitureMaker์™€ ComputerMaker ๋‘˜ ๋‹ค ์ƒ์†ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ๋กœ ์ƒ์†์„ ํ•˜๋ฉด ์ƒํ•˜์œ„ ํด๋ž˜์Šค์˜ ๊ด€๊ณ„๊ฐ€ ๋„ˆ๋ฌด ๋ฐ€์ ‘ํ•ด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜ํผํด๋ž˜์Šค๊ฐ€ ์ˆ˜์ •๋˜๋ฉด ํ•˜์œ„ํด๋ž˜์Šค๋Š” ์–ต์ง€๋กœ ๋”ฐ๋ผ ๋ณ€ํ•˜๊ฒŒ ๋˜๊ณ , ํ•˜์œ„ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ˆ˜ํผํด๋ž˜์Šค๊ฐ€ ๋‚ด๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ ๊ธฐ๋Šฅ๊ตฌํ˜„ํ–ˆ๋Š” ์ง€ ํ™•์‹คํžˆ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์บก์Šํ™”๊ฐ€ ๊นจ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์…‹์งธ๋กœ ์ˆ˜ํผํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š๋Š”, ์„œ๋ธŒํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•œ ์„ฑ๊ฒฉ์˜ ์ฝ”๋“œ์—๋Š” ์ž˜ ๋งŒ๋“ค์–ด๋†“์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ๋„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ComputerMakerForPoor๋Š” FurnitureMaker๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š๊ฒ ์ฃ . ํ•˜์ง€๋งŒ ComputerMaker๋„ Hammer๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๊ธฐ์กด์— ๊ตฌํ˜„ํ•ด๋†“์€ getHammer๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , ์ƒˆ๋กญ๊ฒŒ getHammer๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ด์„œ ์ค‘๋ณต์ด ์ƒ๊ธฐ๊ฒ ์ฃ . ๊ฒฐ๊ตญ ๋ณ€ํ™”์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์†์„ ์‚ฌ์šฉํ•œ ๊ฒŒ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค...

์ฝ”๋“œ ๊ฐœ์„  3: ํด๋ž˜์Šค์˜ ๋ถ„๋ฆฌ - ์ธํ„ฐํŽ˜์ด์Šค ํ™œ์šฉ

์ง€๊ธˆ๊นŒ์ง€ ์„ฑ๊ฒฉ์ด ๋‹ค๋ฅธ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ถ„๋ฆฌํ–ˆ๊ณ , ๋‹ค์Œ์—๋Š” ์ƒํ•˜์œ„ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์•„์˜ˆ ์ƒ์†๊ด€๊ณ„๋„ ์•„๋‹Œ ์™„์ „ํžˆ ๋…๋ฆฝ์ ํžŒ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์€ getWood(), getHammer()์„ ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ, ์•„์˜ˆ ๋ณ„๋„์˜ ํด๋ž˜์Šค์— ๋‹ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ค€๋น„๋ฌผ์„ ์˜์–ด๋กœ ๋ฒˆ์—ญํ•ด๋ณด๋‹ˆ Material์ด๋ผ MaterialMaker๋ผ๊ณ  ํ•˜๊ณ , get๋ณด๋‹ค๋Š” make์ด ๋” ์ ํ•ฉํ•œ ํ•จ์ˆ˜๋ช…์ธ ๊ฒƒ ๊ฐ™์•„ ํ•จ์ˆ˜๋ช…๋„ ๋ฐ”๊ฟ”๋ดค์Šต๋‹ˆ๋‹ค. Commit - feat: 5 - ์ƒ์†์„ ํ•˜์ง€ ์•Š๋Š”, ๋…๋ฆฝ๋œ ํด๋ž˜์Šค๋กœ ๊ธฐ๋Šฅ ๋ถ„๋ฆฌ

public class MaterialMakerForPoor {
    public List<Wood> makeWoods(int woodAmount) {
        List<Wood> woods = new ArrayList<>();
        for (int i = 0; i < woodAmount; i++) {
            woods.add(new CheapWood());
        }
        return woods;
    }
    
    public Hammer makeHammer() {
        return new IronHammer();
    }
}

๊ทธ๋Ÿฌ๋ฉด FurnitureMaker๋Š” ๋”์ด์ƒ ์ถ”์ƒ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

class FurnitureMaker {
    private final String name;

    FurnitureMaker(String name) {
        this.name = name;
    }

    Chair makeChair() {
        MaterialMakerForPoor materialMakerForPoor = new MaterialMakerForPoor();
        List<Wood> woods = materialMakerForPoor.getWoods(Chair.WOOD_AMOUNT);
        Hammer hammer = materialMakerForPoor.getHammer();
        return hammer.makeChair(woods);
    }

    Desk makeDesk() {
        MaterialMakerForPoor materialMakerForPoor = new MaterialMakerForPoor();
        List<Wood> woods = materialMakerForPoor.getWoods(Desk.WOOD_AMOUNT);
        Hammer hammer = materialMakerForPoor.getHammer();
        return hammer.makeDesk(woods);
    }
}

์ด์ œ FurnitureMaker๋Š” ์ƒ์† ์—†์ด๋„ getWood(), getHammer()์˜ ๊ตฌํ˜„์„ ๋ชฐ๋ผ๋„ ๋ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฐ๋ฐ ์—ฌ์ „ํžˆ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, new MaterialMakerForPoor() ๋ถ€๋ถ„์ด ์ค‘๋ณต๋˜๋Š” ๊ฒŒ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค‘๋ณต์ด ๋งˆ์Œ์— ์•ˆ๋“œ๋Š” ๊ฒƒ ๋ฟ ์•„๋‹ˆ๋ผ, ์ƒ์‹์ ์œผ๋กœ๋„ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค MaterialMakerForPoor๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ „์—๋„ ์ƒ์‹์ ์œผ๋กœ ์ด์ƒํ–ˆ๋Š”๋ฐ์š”. ๋งจ ์ฒ˜์Œ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ด๋ด…์‹œ๋‹ค.

// FurnitureMaker.java
Chair makeChair() {
    List<Wood> woods = new ArrayList<>();
    for (int i = 0; i < Chair.WOOD_AMOUNT; i++) {
        woods.add(new Wood());
    }

    IronHammer ironHammer = new IronHammer();
    return ironHammer.makeChair(woods);
}

์ด ์ฝ”๋“œ๋ฅผ ํ˜„์‹ค ์„ธ๊ณ„์—์„œ ์ดํ•ดํ•ด๋ณด๋ฉด, ๋ˆ„๊ตฐ๊ฐ€ FurnitureMaker์—๊ฒŒ ์˜์ž๋ฅผ ๋งŒ๋“ค์–ด๋‹ฌ๋ผ๊ณ  ๋ถ€ํƒํ–ˆ์„ ๋•Œ FurnitureMaker๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜์‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. "์ž ๊น๋งŒ! ์˜์ž๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ๋ชฉ์žฌ๋ถ€ํ„ฐ ๋งŒ๋“ค๊ณ . ์ž ๊น๋งŒ! ํ•„์š”ํ•œ ๋ชฉ์žฌ๋Š” ๋งŒ๋“ค์—ˆ์ง€๋งŒ ๋ง์น˜๋„ ๋งŒ๋“ค์–ด์•ผ ํ•ด". ์ด์ƒํ•˜์ง€ ์•Š๋‚˜์š”? ์˜์ž ๋งŒ๋“ค์–ด๋‹ฌ๋ผ๊ณ  ํ–ˆ๋”๋‹ˆ ๋ง์น˜๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋ชฉ์žฌ๋ฅผ ์ค€๋น„ํ•˜๊ณ , ๋ง์น˜๋ฅผ ์ค€๋น„ํ•˜๋Š” ๊ฒŒ FurnitureMaker์˜ ์ตœ๋Œ€ ๊ด€์‹ฌ์‚ฌ๋ผ๊ณ  ํ•˜๊ธฐ์—” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ์ฃ . ๋ชฉ์žฌ์™€ ๋ง์น˜๋ฅผ ๊ฐ€์ง€๊ณ , "์˜์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ"์ด FurnitureMaker์˜ ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค. MaterialMakerForPoor๋ฅผ ์ ์šฉํ•ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์˜์ž๋ฅผ ๋งŒ๋“ค์–ด๋‹ฌ๋ผ๊ณ  ํ–ˆ๋”๋‹ˆ, "์ž ๊น๋งŒ! MaterialMakerForPoor๋ถ€ํ„ฐ ๋งŒ๋“ค๊ณ " ๋ผ๊ณ  ํ•˜๋Š” ๊ฒŒ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋„๋ก ์ˆ˜์ •ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Commit - feat: 6 - ์˜์กด ๋Œ€์ƒ(MaterialMakerForPoor)์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์Œ

// FurnitureMaker.java
Chair makeChair(MaterialMakerForPoor materialMakerForPoor) {
    List<Wood> woods = materialMakerForPoor.makeWoods(Chair.WOOD_AMOUNT);
    Hammer hammer = materialMakerForPoor.makeHammer();
    return hammer.makeChair(woods);
}

์•„๊นŒ๋ณด๋‹ค ๋‚ซ๋„ค์š”. ์ด์ œ "์ž ๊น๋งŒ! MaterialMakerForPoor๋ถ€ํ„ฐ ๋งŒ๋“ค๊ณ "์˜ ๊ณผ์ • ์—†์ด, MaterialMakerForPoor๋ฅผ ๋ฐ›์œผ๋ฉด, MaterialMakerForPoor๊ฐ€ ์•Œ์•„์„œ ์ค€๋น„๋ฌผ์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค. FurnitureMaker๋Š” ์ค€๋น„๋ฌผ๋กœ ์˜์ž๋ฅผ ๋งŒ๋“ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ์ „ํžˆ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. Desk๋ฅผ ๋งŒ๋“ค์–ด๋‹ฌ๋ผ๊ณ  ํ–ˆ๋”๋‹ˆ ๋˜ MaterialForPoor๋ฅผ ์ „๋‹ฌํ•ด๋‹ฌ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

// FurnitureMaker.java
Desk makeDesk(MaterialMakerForPoor materialMakerForPoor) {
    List<Wood> woods = materialMakerForPoor.makeWoods(Desk.WOOD_AMOUNT);
    Hammer hammer = materialMakerForPoor.makeHammer();
    return hammer.makeDesk(woods);
}

FurnitureMaker์—๊ฒŒ ์ผ ์‹œํ‚ค๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋„ค์š”. "์•„๊นŒ ์คฌ์ž–์•„? ์™œ ๋˜ ํ•„์š”ํ•ด?" ๋ผ๊ณ  ๋ฌผ์—ˆ๋”๋‹ˆ "๊ทธ๊ฑฐ ๋ฒ„๋ ธ๋Š”๋ฐ?"๋ผ๋Š” ๋‹ต์ด ์˜ต๋‹ˆ๋‹ค. ํ˜„์‹ค ์„ธ๊ณ„๋ผ๋ฉด ์–ด์ด๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์ด์ฃ . ํ˜„์‹ค์„ธ๊ณ„์—์„  FurnitureMaker๊ฐ€ ์ด๋ฏธ ์ค€๋น„๋ฌผ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฒ ์ฃ . ๊ทธ๋ ‡๊ฒŒ ๋ฐ”๊ฟ”๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Commit - feat: 7 - ์˜์กด ๋Œ€์ƒ(MaterialMakerForPoor)์„ ์ƒ์„ฑ์ž์—์„œ ๋ฐ›์Œ

class FurnitureMaker {
    private final String name;
    private final MaterialMakerForPoor materialMakerForPoor;

    FurnitureMaker(String name, MaterialMakerForPoor materialMakerForPoor) {
        this.name = name;
        this.materialMakerForPoor = materialMakerForPoor;
    }

    Chair makeChair() {
        List<Wood> woods = materialMakerForPoor.makeWoods(Chair.WOOD_AMOUNT);
        Hammer hammer = materialMakerForPoor.makeHammer();
        return hammer.makeChair(woods);
    }

    Desk makeDesk() {
        List<Wood> woods = materialMakerForPoor.makeWoods(Desk.WOOD_AMOUNT);
        Hammer hammer = materialMakerForPoor.makeHammer();
        return hammer.makeDesk(woods);
    }
}

ํ›จ์”ฌ ๋‚ซ๋„ค์š”. ๊ทธ๋Ÿฐ๋ฐ ์ƒ์†ํ–ˆ์„ ๋• ์—†๋˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ƒ์†์œผ๋กœ, "๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ฒŒ" ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ๋ฐ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด FurnitureMaker๋Š” ์ด์ œ ๋ถ€์ž๋“ค์€ ์ƒ๋Œ€๋„ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ˆ ์—†๋Š” ์‚ฌ๋žŒ๋“ค๋งŒ ์ƒ๋Œ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฝ”๋”ฉ๋ผ์žˆ๊ณ , ๋งŒ์•ฝ์— ๋ฐ”๊พธ๋ ค๋ฉด ๋˜ "์•— ์ž ๊น๋งŒ์š”, ํ˜„์žฌ Wood๊ฐ€ ์‹ผ ๊ฑฐ๋ผ์„œ์š”. ๊ธˆ๋ฐฉ ์ฝ”๋“œ ๋ฐ”๊ฟ”๋“œ๋ฆด๊ฒŒ์š”" ์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ณ , ์ „์ฒ˜๋Ÿผ ์ž์œ ๋กญ๊ฒŒ ํ™•์žฅํ•˜๋ ค๋ฉด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ์งธ๋Š” ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์˜ ๋ฉ”์†Œ๋“œ ๋ช…์ด ๋‹ค๋ฅด๋ฉด ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์•„์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ๋ถ€์ž๋ฅผ ์ƒ๋Œ€ํ•˜๊ธฐ ์œ„ํ•ด MaterialForRich๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋ฉด ์–ด๋–ค ์ƒํ™ฉ์ด ํŽผ์ณ์งˆ๊นŒ์š”?

class MaterialMakerFoorRich {
    List<Wood> createWoods(int woodAmount) {
        List<Wood> woods = new ArrayList<>();
        for (int i = 0; i < woodAmount; i++) {
            woods.add(new ExpensiveWood());
        }
        return woods;
    }

    Hammer createHammer() {
        return new IronHammer();
    }
}

์—ฌ๊ธฐ์—์„œ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๊ฑด ํ•จ์ˆ˜๋ช…์ž…๋‹ˆ๋‹ค. create๋‚˜ make๋‚˜ ์˜๋ฏธ๋Š” ์œ ์‚ฌํ•˜์ง€๋งŒ, ์–ด์จŒ๋“  ๋‹ค๋ฅด์ฃ . FurnitureMaker๊ฐ€ ๋ถ€์ž๋ฅผ ์ƒ๋Œ€ํ•˜๊ธฐ ์œ„ํ•ด ๊พธ์—ญ๊พธ์—ญ MaterialForPoor๋ฅผ MaterialForRich๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค๊ณ  ์นฉ์‹œ๋‹ค.

class FurnitureMaker {
    private final String name;
    private final MaterialMakerForRich materialMakerForRich;

    FurnitureMaker(String name) {
        this.name = name;
        this.materialMakerForRich = new MaterialMakerForRich();
    }

    Chair makeChair() {
        List<Wood> woods = materialMakerForRich.makeWoods(Chair.WOOD_AMOUNT);
        Hammer hammer = materialMakerForRich.makeHammer();
        return hammer.makeChair(woods);
    }

    Desk makeDesk() {
        List<Wood> woods = materialMakerForRich.makeWoods(Desk.WOOD_AMOUNT);
        Hammer hammer = materialMakerForRich.makeHammer();
        return hammer.makeDesk(woods);
    }
}

๋ฐ”๊ฟจ์ง€๋งŒ, ํ•จ์ˆ˜๋ช…์ด ๋‹ฌ๋ผ ๋นจ๊ฐ„ ์ญ‰ ์ซ™ ๋œน๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„์Šทํ•œ ๊ฒƒ๋“ค์˜ ํ•จ์ˆ˜๋ช…์„ ํ†ต์ผํ•ด์•ผ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘˜์งธ๋Š” FurnitureMaker๊ฐ€ MaterialMakerForPoor๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€์ž๋ฅผ ์ƒ๋Œ€ํ•˜๊ธฐ ์œ„ํ•ด์„  FurnitureMaker์˜ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•ด์•ผ๋งŒ ํ•˜์ฃ . ๊ทผ๋ณธ์ ์œผ๋กœ, ์˜์กด๋Œ€์ƒ์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์•ˆ๋‹ค๋Š” ๊ฒŒ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋‘ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋‹ˆ, ๋ฐ”๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‘ ํด๋ž˜์Šค๊ฐ€ ์„œ๋กœ ๊ธด๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๋„๋ก ์ค‘๊ฐ„์— ์ถ”์ƒ์ ์ธ ๋Š์Šจํ•œ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ค ์ผ์„ ํ•˜๊ฒ ๋‹ค๋Š” ๊ธฐ๋Šฅ๋งŒ ์ •์˜ํ•ด๋†“๊ณ , ์ž์‹ ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์ •๋ณด๋Š” ๋ชจ๋‘ ๊ฐ์ถฐ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผ๊ฒ ์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•ด๋†“์€ ์ตœ์†Œํ•œ์˜ ํ†ต๋กœ๋ฅผ ํ†ตํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ชฝ์—์„œ๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชฐ๋ผ๋„ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์žฅ์ ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ(๊ตฌํ˜„์ฒด๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์•ˆ๋‹ค๋Š” ๊ฒƒ)์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฒซ๋ฒˆ์งธ ๋ฌธ์ œ(ํ•จ์ˆ˜๋ช…์ด ๋‹ค๋ฅด๋ฉด ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง„๋‹ค)๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ฐ”๊ฟ”๋„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”์ถœํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Commit - feat: 8 - ์ธํ„ฐํŽ˜์ด์Šค ์ ์šฉ

public interface MaterialMaker {
    List<Wood> makeWoods(int woodAmount);

    Hammer makeHammer();
}

๋‹น์—ฐํžˆ ๊ตฌํ˜„์ฒด๋“ค์€ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ implements ํ•ด์•ผ๊ฒ ์ฃ . ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ FunitureMaker์— ์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

class FurnitureMaker {
    private final String name;
    private final MaterialMaker material;

    FurnitureMaker(String name) {
        this.name = name;
        this.material = new MaterialMakerForPoor();
    }

    Chair makeChair() {
        List<Wood> woods = material.makeWoods(Chair.WOOD_AMOUNT);
        Hammer hammer = material.makeHammer();
        return hammer.makeChair(woods);
    }

    Desk makeDesk() {
        List<Wood> woods = material.makeWoods(Desk.WOOD_AMOUNT);
        Hammer hammer = material.makeHammer();
        return hammer.makeDesk(woods);
    }
}

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ฒซ๋ฒˆ์งธ ๋ฌธ์ œ(๊ตฌํ˜„์ฒด๋งˆ๋‹ค ํ•จ์ˆ˜๋ช…์ด ๋‹ค๋ฅด๋ฉด ๋งŽ์€ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ)๋ฅผ ๋ฐ”๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ๋์Šต๋‹ˆ๋‹ค. this.material = new MaterialMakerForPoor(); ๋ฅผ this.material = new MaterialMakerForRich(); ๋กœ ๋ฐ”๊พธ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ถ€์ž๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” "์ž ๊น๋งŒ์š”! ๋น„์‹ผ ๋ชฉ์žฌ๋ฅผ ์“ฐ๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ์š”. ๊ทธ๋Ÿฐ๋ฐ ๋ช‡ ์ค„์„ ์ˆ˜์ •ํ•ด์•ผํ•˜์ง€..." ์˜€๋‹ค๋ฉด, ์ด์ œ๋Š” "์ž ๊น๋งŒ์š”! ๋น„์‹ผ ๋ชฉ์žฌ๋ฅผ ์“ฐ๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ํ•œ ์ค„๋งŒ ๋ฐ”๊พธ๋ฉด ๋ฉ๋‹ˆ๋‹ค!" ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ๊ฐœ์„  4: ์„ค๊ณ„๋„๋กœ์„œ์˜ ํŒฉํ† ๋ฆฌ

ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์“ด๋‹ค๊ณ  ํ•ด์„œ ๋‘๋ฒˆ์งธ ๋ฌธ์ œ(์˜์กด ๋Œ€์ƒ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์•ˆ๋‹ค๋Š” ๊ฒƒ)๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฐ”๋กœ this.material = new MaterialMakerForPoor(); ์ด ์ฝ”๋“œ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. makeChair(), makeDesk() ์ž…์žฅ์—์„œ๋Š” material์ด ์–ด๋–ค ๋…€์„์ธ์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ์ง€ ๋ชปํ•˜์ฃ . ํ•˜์ง€๋งŒ FurnitureMaker๋Š” ์ƒ์„ฑ์ž์—์„œ new MaterialMakerForPoor() ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„์ฒด๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ๋‘ ๊ฐœ์˜ ๊ด€์‹ฌ์‚ฌ, (1) ์ค€๋น„๋ฌผ ๋งŒ๋“ค๊ธฐ (2) ๊ฐ€๊ตฌ ๋งŒ๋“ค๊ธฐ๋ฅผ ์ž˜ ๋ถ„๋ฆฌํ–ˆ๋Š”๋ฐ๋„ ๋‘ ํด๋ž˜์Šค๋Š” ์ง์ ‘์ ์ธ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์—(๋‹ค๋ฅธ ๊ด€์‹ฌ์‚ฌํ•ญ์ด ๊ณต์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์—) FurnitureMaker๋Š” ์ž์œ ๋กญ๊ฒŒ ํ™•์žฅํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜์ฃ . new ๊ฐ์ฒด ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋…๋ฆฝ์ ์ธ ๊ด€์‹ฌ์‚ฌ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ•œ ์ค„์˜ ์ฝ”๋“œ๊ฐ€ FunitureMaker์™€ MaterialMaker์˜ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด FurnitureMaker๋Š” ๊ฒฐ์ฝ” ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด "๊ด€๊ณ„์„ค์ •"์ด๋ผ๋Š” ๊ด€์‹ฌ์„ ์–ด๋””์— ๋ถ„๋ฆฌํ• ๊นŒ์š”? ๋ฐ”๋กœ "FurnitureMaker์˜ ํด๋ผ์ด์–ธํŠธ"๊ฐ€ ์ด ๊ด€์‹ฌ์„ ๋งก๊ธฐ์— ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋ผ๋Š” ๊ฒŒ ํŠน๋ณ„ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ, FurnitureMaker์˜ ํ•จ์ˆ˜๊ฐ€ ์–ด๋””์—์„œ๋“  ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์„ ํด๋ผ์ด์–ธํŠธ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, FurnitureMaker.java๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” FurnitureMakerTest.java๊ฐ€ FurnitureMaker์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? FurnitureMakerTest๋„ FurnitureMaker์˜ ํด๋ผ์ด์–ธํŠธ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๊ณ„์„ค์ •์˜ ์ฑ…์ž„์„ ํด๋ผ์ด์–ธํŠธ์— ๋„˜๊ฒจ๋ฒ„๋ฆฌ๋ฉด, FurnitureMaker๋Š” ๊ทธ์ œ์„œ์•ผ MaterialMaker๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กœ์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋˜๊ฒ ์ฃ . Commit - feat: 9 - ๊ด€๊ณ„์„ค์ • ์ฑ…์ž„์˜ ๋ถ„๋ฆฌ

// FurnitureMaker.java
FurnitureMaker(String name, MaterialMaker materialMaker) {
    this.name = name;
    this.materialMaker = materialMaker;
}

FurnitureMaker์˜ ํด๋ผ์ด์–ธํŠธ์ธ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// FurnitureMakerTest.java
@Test
void makeChair() {
    MaterialMaker materialMaker = new MaterialMakerForPoor();
    FurnitureMaker furnitureMaker = new FurnitureMaker("root", materialMaker);
    Chair chair = furnitureMaker.makeChair();
    assertThat(chair).isNotNull();
}

MaterialMaker materialMaker = new MaterialMakerForPoor();๊ฐ€ ์—ฌ๊ธฐ์— ๋“ค์–ด์žˆ๊ตฐ์š”! ์ด์ œ ๋ถ€์ž๊ฐ€ ์™€๋„, ๋ˆ ์—†๋Š” ์‚ฌ๋žŒ์ด ์™€๋„ FurnitureMaker๋Š” ์ „ํ˜€ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ๋Šฅ ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ , ์ฝ”๋“œ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ FurnitureMaker์˜ ํด๋ผ์ด์–ธํŠธ๋Š” FurnitureMakerTest ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ FurnitureMakerTest๋Š” ํ…Œ์ŠคํŠธ ํ•˜๋ ค๊ณ  ๋งŒ๋“  ์ฝ”๋“œ ์•„๋‹™๋‹ˆ๊นŒ? ํ…Œ์ŠคํŠธ๋ผ๋Š” ๊ด€์‹ฌ ๋ง๊ณ  ๊ด€๊ณ„์„ค์ •์˜ ๊ด€์‹ฌ์„ ๋งก๊ฒŒ ๋์œผ๋‹ˆ, ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž…์žฅ์—์„œ๋Š” ๋‹นํ™ฉ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ด€๊ณ„์„ค์ •๋งŒ ๋‹ด๋‹นํ•ด์ฃผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. Commit - feat: 10 - ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค

class FurnitureMakerFactory {
    FurnitureMaker createFurnitureMaker() {
        MaterialMaker materialMaker = new MaterialMakerForPoor();
        return new FurnitureMaker("root", materialMaker);
    }
}

ํŒฉํ† ๋ฆฌ๋Š” FurnitureMaker๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ง€, ์–ด๋–ป๊ฒŒ ์ค€๋น„์‹œํ‚ฌ ์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๊ตฌ์„ฑํ•˜๊ณ  ๊ทธ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ž‘์—…์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์— ๊ฑธ์ณ ์ผ์–ด๋‚œ๋‹ค๋ฉด ๊ฐ์ฒด๋“ค์˜ ์˜์กด๊ด€๊ณ„์— ๋Œ€ํ•œ ์„ค๊ณ„๋„์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค์˜ ๊ฐ€์น˜๋Š” ์—ฌ๋Ÿฟ ์žˆ๊ฒ ์ง€๋งŒ ๊ทธ ์ค‘ ์œผ๋œธ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์—ญํ• ์˜ ์˜ค๋ธŒ์ ํŠธ(FurnitureMaker, MaterialMaker)์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ(FurnitureMakerFactory)๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด "ํŒฉํ† ๋ฆฌ๋ฅผ ์“ฐ๋”๋ผ๋„, ๋ˆ ์—†๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ์ฝ”๋“œ์—์„œ ๋ถ€์ž๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ํŒฉํ† ๋ฆฌ ๋‚ด์˜ MaterialMaker materialMaker = new MaterialMakerForPoor();๋ฅผ MaterialMaker materialMaker = new MaterialMakerForRich();๋กœ ๋ฐ”๊ฟ”์•ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ฒฐ๊ตญ ์ฝ”๋“œ ์ˆ˜์ •์„ ํ•˜๊ธด ํ•ด์•ผํ•˜๋„ค์š”! ์ด์ „์—๋„ ํ•œ ์ค„, ์ง€๊ธˆ๋„ ํ•œ ์ค„ ์ˆ˜์ •ํ•˜๋Š”๋ฐ ๋ญ๊ฐ€ ๊ฐœ์„ ๋œ๊ฑฐ์ฃ ?"๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ค ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฑด FurnitureMaker์˜ ์ž…์žฅ์ž…๋‹ˆ๋‹ค. FurnitureMaker๋Š” ์ด์ œ MaterialMakerForPoor๋“ , MaterialMakerForRich๋“  ์ƒ๊ด€์ด ์—†์–ด์กŒ์–ด์š”. ์ž๊ธฐ ๊ด€์‹ฌ์ธ "์ค€๋น„๋ฌผ๋กœ ๊ฐ€๊ตฌ๋ฅผ ๋งŒ๋“ ๋‹ค"์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์ฃ . FurnitureMakerFactory์ž…์žฅ์—์„œ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ด์ œ๊นŒ์ง€ FurnitureMaker๊ฐ€ ์–ต์šธํ–ˆ๋˜ ์ด์œ ๋Š” "๋‚ด๊ฐ€ ๋ณ„๋กœ ๊ด€์‹ฌ๋„ ์—†๋Š” ๊ฒƒ ๋•Œ๋ฌธ์— ๋ฐ”๋€Œ์–ด์•ผํ•˜๋‚˜?" ์˜€์Šต๋‹ˆ๋‹ค. ๊ทผ๋ฐ FurnitureMakerFactory๋Š” ๊ด€๊ณ„์„ค์ •์„ ํ•ด์ฃผ๋Š” ๊ฒŒ ์ž๊ธฐ ์ผ์ด์˜ˆ์š”. ์–ต์šธํ•  ๊ฒŒ ์—†์ฃ . ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ์ˆ˜์ •๋Ÿ‰๋„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ๋‘˜ ๋‹ค ํ•œ ์ค„๋งŒ ๋ฐ”๊ฟ”๋„ ๋˜์ง€๋งŒ, MaterialMaker๋ฅผ ๋‹ค๋ฅธ ์• ๋“ค๋„ ์“ด๋‹ค๋ฉด? ์˜ˆ๋ฅผ ๋“ค์–ด, ComputerMaker๋„ MaterialMaker๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์–˜๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ํŒฉํ† ๋ฆฌ๋ฅผ ์“ด๋‹ค๋ฉด ํ•œ ์ค„๋กœ ๋  ๊ฒƒ์„, ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‘ ์ค„์„ ์ˆ˜์ •ํ•ด์•ผ๊ฒ ์ฃ .

์ œ์–ด์˜ ์—ญ์ „

์ œ์–ด์˜ ์—ญ์ „์ด๋ž€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ๊ฐ€ ๋’ค๋ฐ”๋€Œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์€ main() ๋ฉ”์†Œ๋“œ์™€ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜๋Š” ์ง€์ ์—์„œ ๋‹ค์Œ์— ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ๊ฒฐ์ •ํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋งŒ๋“ค์–ด์ง„ ์˜ค๋ธŒ์ ํŠธ์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ ์˜ค๋ธŒ์ ํŠธ ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ ๋‹ค์Œ์— ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ฒฐ์ •ํ•˜๊ณ , ํ˜ธ์ถœํžˆ๋Š” ์‹์˜ ์ž‘์—…์ด ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ์ œ์–ด๊ฐ€ ์—ญ์ „๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋Šฅ๋™์ ์œผ๋กœ ์ž์‹ ์ด ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ์–ธ์ œ ์–ด๋–ป๊ฒŒ ๊ทธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ง€ ์Šค์Šค๋กœ ๊ด€์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ž‘์—…์€ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ ์ œ์–ดํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ œ์–ด์˜ ์—ญ์ „์€ ์ด๋Ÿฌํ•œ ์ œ์–ด ํ๋ฆ„์„ ๊ฑฐ๊พธ๋กœ ๋’ค์ง‘์Šต๋‹ˆ๋‹ค. ์ œ์–ด์˜ ์—ญ์ „์—์„œ๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ž์‹ ์ด ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์Šค์Šค๋กœ ์„ ํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ ์ž์‹ ์ด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๊ณ  ์–ด๋””์„œ ์‚ฌ์šฉ๋˜๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ œ์–ด ๊ถŒํ•œ์„ ์ž์‹ ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋Œ€์ƒ์—๊ฒŒ ์œ„์ž„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. main() ์„ ์ œ์™ธํ•˜๋ฉด ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋Š” ์œ„์ž„๋ฐ›์€ ์ œ์–ด ๊ถŒํ•œ์„ ๊ฐ–๋Š” ํŠน๋ณ„ํ•œ ์˜ค๋ธŒ์ ํŠธ์— ์˜ํ•ด ๊ฒฐ์ •๋˜๊ณ  ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ์ƒ์†์„ ํ™œ์šฉํ•œ ํ™•์žฅ๋„ ์ œ์–ด์˜ ์—ญ์ „์ด ์ ์šฉ๋œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์„œ๋ธŒํด๋ž˜์Šค๋Š” ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€๋งŒ, ๊ทธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋  ์ง€ ์ž์‹ ์€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์„œ๋ธŒํด๋ž˜์Šค์—์„œ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•ด๋†“์œผ๋ฉด ์ˆ˜ํผํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์„œ๋ธŒํด๋ž˜์Šค์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์ œ์–ด์˜ ์—ญ์ „์ด ์ ์šฉ๋œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹จ์ง€ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ๋ฐ˜์ œํ’ˆ์ด๋‚˜, ํ™•์žฅํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„๋œ ์ถ”์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง‘ํ•ฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ๋ฆ„์„ ์ง์ ‘ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋™์ž‘ํ•˜๋Š” ์ค‘ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์„ ๋•Œ ๋Šฅ๋™์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฑฐ๊พธ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ๋ฆ„์„ ์ฃผ๋„ํ•˜๋Š” ์ค‘์— ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ถ„๋ช…ํ•œ ์ œ์–ด์˜ ์—ญ์ „ ๊ฐœ๋…์ด ์ ์šฉ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ ์ฝ”๋“œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์›๋ž˜ FurnitureMaker๊ฐ€ MaterialMaker์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ์ƒ์„ฑํ–ˆ์ฃ . ๊ทธ๋Ÿฐ๋ฐ ๊ฐœ์„  ํ›„์—๋Š” FurnitureMakerFactory๊ฐ€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ฆ‰ FurnitureMaker๋Š” ์ž์‹ ์ด ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ง€๋„ ๋ชจ๋ฅด๋Š”, ์ˆ˜๋™์ ์ธ ์กด์žฌ๊ฐ€ ๋์Šต๋‹ˆ๋‹ค. MaterialMaker์˜ ์ƒ์„ฑ ์ œ์–ด๊ถŒํ•œ ๋ฟ ์•„๋‹ˆ๋ผ, FurnitureMaker ์ž๊ธฐ ์ž์‹ ์˜ ์ƒ์„ฑ ๊ถŒํ•œ๋„ FurnitureMakerFactory์—๊ฒŒ ๋งก๊น๋‹ˆ๋‹ค. ์ œ์–ด์˜ ์—ญ์ „์—์„œ๋Š” ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ์˜ ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค์™€ ๊ฐ™์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„์„ค์ •, ์‚ฌ์šฉ, ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ๋“ฑ์„ ๊ด€์žฅํ•˜๋Š” ์กด์žฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง์˜ ํ•ต์‹ฌ๊ฐ€์น˜ ์„ธ ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๊ฐ€ IoC์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ IoC๋ฅผ ์‰ฝ๊ฒŒ, ์ž˜ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šคํ”„๋ง์ด ๋„์™€์ค€๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ง ๋‚ด๋ถ€ ๊ตฌํ˜„์—๋„ IoC๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด, ์Šคํ”„๋ง์ด FurnitureMakerFactory์˜ ์—ญํ• , ์ฆ‰ ๊ฐ์ฒด ๊ฐ„ ๊ด€๊ณ„ ์„ค์ •์˜ ์ฑ…์ž„์„ ๋„๋งก์•„์ค๋‹ˆ๋‹ค.

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑด ๋ฌด์Šจ ์˜๋ฏธ์ผ๊นŒ์š”? A๊ฐ€ B์— ์˜์กดํ•œ๋‹ค๋Š” ๊ฑด, B๊ฐ€ ๋ณ€ํ•˜๋ฉด ๊ทธ๊ฒƒ์ด A์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์ด์ œ๊นŒ์ง€ ๊ณต๋ถ€ํ•œ IoC๋ผ๋Š” ์šฉ์–ด๋Š” ๋งค์šฐ ๋Š์Šจํ•˜๊ฒŒ ์ •์˜๋ผ์„œ ํญ๋„“๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์Šคํ”„๋ง์„ IoC ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ ๋งŒ ํ•ด์„œ๋Š” ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ํŠน์ง•์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒˆ๋กœ์šด ์šฉ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํƒ์›”ํ•œ ์žฌ๋Šฅ์ด ์žˆ๋Š” ๋ช‡๋ช‡ ์‚ฌ๋žŒ์˜ ์ œ์•ˆ์œผ๋กœ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” IoC ๋ฐฉ์‹์„ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๋Š”, ์Šคํ”„๋ง IoC์˜ ํ•ต์‹ฌ์„ ์งš์–ด์ฃผ๋ฉฐ ์ข€ ๋” ์˜๋„๊ฐ€ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง IoC ๊ธฐ๋Šฅ์˜ ๋Œ€ํ‘œ์ ์ธ ๋™์ž‘์›๋ฆฌ๋Š” ์ฃผ๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์Šคํ”„๋ง์ด ์ปจํ…Œ์ด๋„ˆ์ด๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ˆ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์›๋ฆฌ๊ฐ€ ๋ชจ๋‘ IoC ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์Šคํ”„๋ง์ด ์—ฌํƒ€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ฐจ๋ณ„ํ™”๋ผ์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.

Dependency Injection์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ง๋กœ ๋ฒˆ์—ญ๋˜๋Š”๋ฐ, ๊ทธ ์ค‘ ๊ฐ€์žฅ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด๊ฐ€ ์˜์กด์„ฑ ์ฃผ์ž…์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜์กด์„ฑ์ด๋ผ๋Š” ๋ง์€ DI์˜ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋“œ๋Ÿฌ๋‚ด์ฃผ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. DI๋Š” ์˜ค๋ธŒ์ ํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ œ๊ณต(์ฃผ์ž…)๋ฐ›๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์—ฌํƒ€ ์˜ค๋ธŒ์ ํŠธ์™€ ๋‹ค์ด๋‚ด๋ฏนํ•˜๊ฒŒ ์˜์กด๊ด€๊ณ„๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉด์—์„œ ์˜์กด๊ด€๊ณ„ ์„ค์ •์ด๋ผ๋Š” ๋ฒˆ์—ญ๋„ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ž€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ์ถฉ์กฑํžˆ๋Š” ์ž‘์—…์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋ž˜์Šค ๋ชจ๋ธ์ด๋‚˜ ์ฝ”๋“œ์—๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ์ ์˜ ์˜์กด๊ด€๊ณ„๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋Ÿฐํƒ€์ž„ ์‹œ์ ์˜ ์˜์กด๊ด€๊ณ„๋Š” ์ปจํ…Œ์ด๋„ˆ๋‚˜ ํŒฉํ† ๋ฆฌ ๊ฐ™์€ ์ œ 3์˜ ์กด์žฌ๊ฐ€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. ์˜์กด๊ด€๊ณ„๋Š” ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ์ œ๊ณต(์ฃผ์ž…)ํ•ด์คŒ์œผ๋กœ์จ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์˜ ํ•ต์‹ฌ์€ ์„ค๊ณ„ ์‹œ์ ์—๋Š” ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ๋‘ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ด€๊ณ„๋ฅผ ๋งบ๋„๋ก ๋„์™ธ์ฃผ๋Š” ์ œ 3์˜ ์กด์žฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ3์˜ ์กด์žฌ๋Š” ๋ฐ”๋กœ ๊ด€๊ณ„์„ค์ • ์ฑ…์ž„์„ ๊ฐ€์ง„ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ์˜ค๋ธŒ์ ํŠธ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DI๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์„ ํƒ๊ณผ ์ƒ์„ฑ ์ œ์–ด๊ถŒ์„ ์™ธ๋ถ€๋กœ ๋„˜๊ธฐ๊ณ  ์ž์‹ ์€ ์ˆ˜๋™์ ์œผ๋กœ ์ฃผ์ž…๋ฐ›์€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์—์„œ IoC ์˜ ๊ฐœ๋…์— ์ž˜ ๋“ค์–ด๋งž์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ IoC๋Š” ์ฃผ๋กœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋˜๋Š” DI๋ผ๋Š” ๋ฐ ์ดˆ์ ์ด ๋งž์ถฐ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์Šคํ”„๋ง์„ IoC ์ปจํ…Œ์ด๋„ˆ ์™ธ์—๋„ DI ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” DI ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

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

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

About

example code that explains IOC

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages