๋กœ์ผ“๐Ÿพ
article thumbnail

๋ฐ”๋Š˜๊ณผ ์‹ค์ฒ˜๋Ÿผ ์ž๋ฐ”ํ•˜๋ฉด ๋ฐ”๋กœ ๋– ์˜ค๋ฅด๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ "๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด" ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

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

 

๋ ˆ๊ณ  ๋™๋ฌผ์›

์ด๋Ÿด ๊ฒฝ์šฐ ์šฐ๋ฆฌ๋Š” ์‰ฝ๊ฒŒ ๋™๋ฌผ์›์—์„œ ํ˜ธ๋ž‘์ด ๋ ˆ๊ณ ๋ฅผ ๋นผ๊ณ  ๊ณ ๋ฆด๋ผ ๋ ˆ๊ณ ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ˜ธ๋ž‘์ด, ๊ณ ๋ฆด๋ผ๊ฐ€ ๊ฐ์ฒด๊ฐ€ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜ธ๋ž‘์ด๋ฅผ ๋บ€ ๋‹ค๊ณ  ํ•ด์„œ ๊ธฐ์กด์— ์žˆ๋˜ ์‚ฌ์ž๋‚˜ ํŒ๋‹ค ๋ ˆ๊ณ ๋Š” ์ „ํ˜€ ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ๋ผ์ด๊ฑฐ ๋ ˆ๊ณ ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ณ , ํ˜ธ๋ž‘์ด์™€ ์‚ฌ์ž๋ฅผ ๋งˆ๊ตฌ์žก์ด ์„ž์–ด์„œ ๋ ˆ๊ณ ๋ฅผ ์กฐ๋ฆฝํ–ˆ๋‹ค๋ฉด ์–ด๋• ์„๊นŒ์š”?

*์ฐธ๊ณ ๋กœ ๋ผ์ด๊ฑฐ๋Š” ํ˜ธ๋ž‘์ด์™€ ์‚ฌ์ž์˜ ๊ต๋ฐฐ๋กœ ํƒ„์ƒํ•œ ๋™๋ฌผ์ž…๋‹ˆ๋‹ค

 

ํ˜ธ๋ž‘์ด์™€ ์‚ฌ์ž๊ฐ€ ์„ž์—ฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ๋ž‘์ด๋งŒ ๋–ผ์–ด๋‚ด๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ํž˜๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด์ง€ ์•Š๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๊ฐ€ ์ข€ ์ด์ƒํ•˜๊ธด ํ•˜๋„ค์š”.

๋‹ˆ์ผˆ๋กœ๋””์–ธ์—์„œ ์ž์ฃผ ํ•ด์ฃผ๋˜ ์บฃ๋…

"CatDog"๋ผ๋Š” ์–ด๋ฆด ์  ํ‹ฐ๋น„์—์„œ ํ•ด์ค€ ๋งŒํ™”์˜€๋Š”๋ฐ ์•„์ฃผ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด์ง€ ๋ชปํ•˜๋„ค์š”.

 

์ด๋ ‡๋“ฏ "๊ฐ์ฒด ์ง€ํ–ฅ" ์ด๋ผ ํ•˜๋ฉด ํ™•์žฅ์ด ์šฉ์ดํ•ด์•ผ ํ•˜๊ณ , ๋ณ€๊ฒฝ์ด ์‰ฝ๋„๋ก ์œ ์—ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ "๊ฐ์ฒด ์ง€ํ–ฅ"์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ๊ฐ€ ๋งŒ๋งŒ์น˜๊ฐ€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ์ฒด ์ง€ํ–ฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ข€ ๋” ์‰ฝ๊ฒŒ? ํ• ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ๊ฐ€์ด๋“œ๊ฐ€ "๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„ 5๋Œ€ ์›์น™(SOLID)"์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ํ™•์žฅ์ด ์šฉ์ดํ•˜๊ณ , ์œ ์—ฐํ•˜๋‹ค๋Š” ๋‹คํ˜•์„ฑ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹คํ˜•์„ฑ์€ ํŠนํžˆ SOLID ์ค‘ OCP, DIP์™€ ๊ด€๋ จ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. 

 

OCP๋Š” Open/Closed Principle์˜ ์•ฝ์–ด๋กœ ์†Œํ”„ํŠธ์›จ์–ด ํ™•์žฅ์—๋Š” ์—ด๋ ค์•ผ ์žˆ์–ด์•ผ ํ•˜๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ž…๋‹ˆ๋‹ค.

DIP๋Š” Dependency Inversion Principle์˜ ์•ฝ์–ด๋กœ ๊ตฌํ˜„์ฒด์— ์˜์กดํ•˜์ง€ ๋ง๊ณ , ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ž…๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ ์ž๋ฐ”๋กœ ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ ๋‚˜๋ฆ„ ๋‹คํ˜•์„ฑ ์žˆ๊ฒŒ DIP์™€ OCP๋ฅผ ์ง€ํ‚ค๋ฉด์„œ ๊ฐœ๋ฐœ์„ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์„ ๋๋‚ด๊ณ  ๋”ฑ ์ฝ”๋“œ๋ฅผ ๋“ค์—ฌ๋‹ค ๋ณด๋ฉด ๋‚˜๋ฆ„ DIP์™€ OCP๋ฅผ ์ž˜ ์ง€์ผœ ๊ฐœ๋ฐœํ–ˆ๋‹ค๊ณ  ๋ฟŒ๋“ฏํ•ดํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถ„๋ช… DIP์™€ OCP๋ฅผ ์œ„๋ฐฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ € ๋˜ํ•œ ๋งจ ์ฒ˜์Œ ์ž๋ฐ”๋กœ ๊ฐœ๋ฐœ์„ ํ–ˆ์„ ๋•Œ "์™€ ์ด๊ฑฐ ์ฉ๋‹ค! ์ง„์งœ ๋‚ด๊ฐ€ ์งฐ์ง€๋งŒ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ž˜ ์งฐ๋‹ค. SOLID ์‰ฝ๋„ค~" ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๋ฐ”๋ณด ๊ฐ™์€ ์ƒ๊ฐ์ด์˜€์ฃ .

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ DIP์™€ OCP๋ฅผ ์ง€ํ‚จ๊ฑฐ ๊ฐ™์ง€๋งŒ ์‚ฌ์‹ค ์œ„๋ฐฐ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Car๋ผ๋Š” ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ๋งŒ๋“ค๊ณ  ๊ตฌํ˜„์œผ๋กœ๋Š” K3์™€ K5๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Engine์ด๋ผ๋Š” ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ๋งŒ๋“ค๊ณ  ๊ตฌํ˜„์œผ๋กœ๋Š” Fuel, Electronic์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Driver๋ผ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ๊ณ  ์ด ํด๋ผ์ด์–ธํŠธ๋Š” K3๋ฅผ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

interface Car

public interface Car {
    void findCarName();
    void findCarBrand();
}

class K3

public class K3 implements Car{

    @Override
    public void findCarName() {
        System.out.println("ํ˜„์žฌ ์ฐจ์˜ ์ด๋ฆ„์€ [K3] ์ž…๋‹ˆ๋‹ค.");
    }

    @Override
    public void findCarBrand() {
        System.out.println("[K3]๋Š” [KIA]์—์„œ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.");
    }
}

interface Engine

public interface Engine {
    void WayToMove();
}

class Fuel

public class Fuel implements Engine{
    @Override
    public void WayToMove() {
        System.out.println("[์—ฐ๋ฃŒ]๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›€์ง์ž…๋‹ˆ๋‹ค.");
    }
}

interface Driver

public interface Driver {
    void findOwnCarDetail();
}

 

class DriverImpl

public class DriverImpl implements Driver{

    Car car = new K3();
    Engine engine = new Fuel();

    @Override
    public void findOwnCarDetail() {
        car.findCarName();
        car.findCarBrand();
        engine.WayToMove();
    }
}

 

๋‹จ์ˆœํžˆ ์ฐจ์˜ ์„ธ๋ถ€์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ฐจ ์ด๋ฆ„, ์ฐจ ๋ธŒ๋žœ๋“œ, ๊ธฐ๋™ ๋ฐฉ์‹์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์Šน์ง„์„ ํ•ด ์›”๊ธ‰์ด ์˜ฌ๋ผ์„œ K3์—์„œ K5๋กœ ์ฐจ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Car car = new K3(); ---> Car car = new K5();
public class DriverImpl implements Driver{

    Car car = new K5();
    Engine engine = new Fuel();

    @Override
    public void findOwnCarDetail() {
        car.findCarName();
        car.findCarBrand();
        engine.WayToMove();
    }
}

ํ˜น์€ ์š”์ฆ˜ ์นœํ™˜๊ฒฝ์ด ๋Œ€์„ธ๋‹ˆ๊น ์ „๊ธฐ์ฐจ ๋ฒ„์ „์˜ K3๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

public class DriverImpl implements Driver{

    Car car = new K3();
    Engine engine = new Electronic();

    @Override
    public void findOwnCarDetail() {
        car.findCarName();
        car.findCarBrand();
        engine.WayToMove();
    }
}

 

K3๋ฅผ K5๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ Fuel์—์„œ Electronic์œผ๋กœ ๋ณ€๊ฒฝ์„ ํ•  ๋•Œ ์ฝ”๋“œ๋งŒ ์‚ด์ง ๋ฐ”๊พธ๋ฉด ๋˜์„œ ์–ผํ•๋ณด๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์„ค๊ณ„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ๋ช…๋ฐฑํžˆ DIP์™€ OCP๋ฅผ ์œ„๋ฐฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

OCP ์œ„๋ฐฐ

OCP๋Š” ์œ„์—์„œ ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ K3๋ฅผ K5๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

DIP ์œ„๋ฐฐ

DIP๋Š” ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์— ์˜์กดํ•˜๊ณ  ๊ตฌํ˜„์—๋Š” ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š”๋ฐ ์œ„ ์œ„์ฝ”๋“œ๋Š” DriverImpl์ด๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ Car(์—ญํ• ), K3(๊ตฌํ˜„)์— ๋ชจ๋‘ ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๊ฐ“์˜ํ•œ๋‹˜์˜ ๋ง์„ ๋นŒ๋ฆฌ์ž๋ฉด

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

ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

์ฆ‰ ์ด์ „ ์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„์ฒด์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค.

 

์ด๋ฒˆ ๊ธ€์—์„œ DIP์™€ OCP๊ฐ€ ์œ„๋ฐฐ๋˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง์„ ์“ฐ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ ๊ฐ€ ๊ฒฐ๊ตญ DIP์™€ OCP๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , DI๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…์‹œ์ผœ์ฃผ๋Š” ๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” DIP์™€ OCP๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

profile on loading

Loading...