Post

[DesignPattern] SOLID์›์น™(SOLID)

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๋Œ€ ์›์น™ SOLID๋ฅผ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์ •๋ฆฌํ•œ๋‹ค. ์ด ์›์น™๋“ค์„ ์ง€ํ‚ค๋ฉด ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์•ฝ์ž์›์น™ํ•œ ์ค„ ์š”์•ฝ
S๋‹จ์ผ ์ฑ…์ž„ํด๋ž˜์Šค๋Š” ์ฑ…์ž„ ํ•˜๋‚˜๋งŒ
O๊ฐœ๋ฐฉ-ํ์‡„ํ™•์žฅ์—” ์—ด๊ณ , ๋ณ€๊ฒฝ์—” ๋‹ซ๊ธฐ
L๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜์ž์‹์€ ๋ถ€๋ชจ๋ฅผ ๋Œ€์ฒด ๊ฐ€๋Šฅ
I์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋งŒ ์˜์กด
D์˜์กด ์—ญ์ „์ถ”์ƒํ™”์— ์˜์กด

1. SRP โ€” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™

ํ•œ ํด๋ž˜์Šค๋Š” ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ ๊ฐ€ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
// โŒ ์—ฌ๋Ÿฌ ์ฑ…์ž„ (์ƒ์„ฑยท์ด๋ฉ”์ผยท๋ฆฌํฌํŠธ)
class UserManager {
    public void createUser() {}
    public void sendEmail() {}
    public void generateReport() {}
}

// โœ… ์ฑ…์ž„ ๋ถ„๋ฆฌ
class UserManager     { public void createUser() {} }
class EmailService    { public void sendEmail() {} }
class ReportGenerator { public void generateReport() {} }

2. OCP โ€” ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™

ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ๊ณ  ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ๊ธฐ๋Šฅ ์ถ”๊ฐ€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// โŒ ์ƒˆ ํ• ์ธ์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค if ์ˆ˜์ •
class DiscountCalculator {
    double calc(double price, String type) {
        if (type.equals("Christmas")) return price * 0.2;
        else if (type.equals("NewYear")) return price * 0.1;
        return 0;
    }
}

// โœ… ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ™•์žฅ (๊ธฐ์กด ์ฝ”๋“œ ๋ถˆ๋ณ€)
interface Discount { double calculateDiscount(double price); }
class ChristmasDiscount implements Discount { ... }
class NewYearDiscount implements Discount { ... }
class DiscountCalculator {
    double calc(double price, Discount discount) { return discount.calculateDiscount(price); }
}

3. LSP โ€” ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

์„œ๋ธŒ ํƒ€์ž…์€ ์–ธ์ œ๋‚˜ ๊ธฐ๋ฐ˜ ํƒ€์ž…์œผ๋กœ ๊ต์ฒด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

1
2
3
4
5
// โŒ Square extends Rectangle โ€” setWidth๊ฐ€ height๊นŒ์ง€ ๋ฐ”๊ฟ” LSP ์œ„๋ฐ˜
// โœ… ๊ณตํ†ต Shape๋ฅผ ์ƒ์†
class Shape { protected int width, height; public int getArea() { return width * height; } }
class Rectangle extends Shape { ... }
class Square extends Shape { public void setSideLength(int l) { width = height = l; } }

๐Ÿ’ก โ€œ์ •์‚ฌ๊ฐํ˜•์€ ์ง์‚ฌ๊ฐํ˜•์ด๋‹คโ€๊ฐ€ ์ฝ”๋“œ์—์„œ๋Š” ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ์–ต์ง€ ์ƒ์†์€ LSP๋ฅผ ๊นจ๋œจ๋ฆฐ๋‹ค.


4. ISP โ€” ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ์— ์˜์กดํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
// โŒ Robot์ด eat()์„ ์–ต์ง€๋กœ ๊ตฌํ˜„
interface Worker { void work(); void eat(); }

// โœ… ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ
interface Worker { void work(); }
interface Eater  { void eat(); }
class Programmer implements Worker, Eater { ... }
class Robot      implements Worker { }   // eat ๋ถˆํ•„์š”

5. DIP โ€” ์˜์กด ์—ญ์ „ ์›์น™

๊ณ ์ˆ˜์ค€ยท์ €์ˆ˜์ค€ ๋ชจ๋“ˆ ๋ชจ๋‘ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค. (์„ธ๋ถ€ ๊ตฌํ˜„์— ์˜์กด X)

1
2
3
4
5
6
7
8
// โŒ LightSwitch๊ฐ€ ๊ตฌ์ฒด ํด๋ž˜์Šค LightBulb์— ์ง์ ‘ ์˜์กด
// โœ… ์ธํ„ฐํŽ˜์ด์Šค(Switchable)์— ์˜์กด
interface Switchable { void turnOn(); void turnOff(); }
class LightBulb implements Switchable { ... }
class LightSwitch {
    private Switchable device;
    public LightSwitch(Switchable device) { this.device = device; }  // ์ถ”์ƒํ™” ์ฃผ์ž…
}

๐Ÿ’ก DIP๋Š” ์˜์กด์„ฑ ์ฃผ์ž…(DI)์˜ ์ด๋ก ์  ๊ธฐ๋ฐ˜์ด๋‹ค. ์Šคํ”„๋ง์ด ์ธํ„ฐํŽ˜์ด์Šค์— ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ๋„ ์ด ์›์น™์„ ๋”ฐ๋ฅธ๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
6
SOLID
โ”œโ”€ S ๋‹จ์ผ ์ฑ…์ž„   ํด๋ž˜์Šค๋Š” ์ด์œ  ํ•˜๋‚˜๋กœ๋งŒ ๋ณ€๊ฒฝ
โ”œโ”€ O ๊ฐœ๋ฐฉ-ํ์‡„   ํ™•์žฅ O, ๋ณ€๊ฒฝ X (์ธํ„ฐํŽ˜์ด์Šค)
โ”œโ”€ L ๋ฆฌ์Šค์ฝ”ํ”„    ์ž์‹์ด ๋ถ€๋ชจ๋ฅผ ๋Œ€์ฒด
โ”œโ”€ I ์ธํ„ฐํŽ˜์ด์Šค  ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋งŒ ๋ถ„๋ฆฌ
โ””โ”€ D ์˜์กด ์—ญ์ „   ์ถ”์ƒํ™”์— ์˜์กด (DI)
์›์น™ํ•œ ์ค„ ์ •์˜
SRP์ฑ…์ž„ ํ•˜๋‚˜
OCPํ™•์žฅ ์—ด๊ณ  ๋ณ€๊ฒฝ ๋‹ซ๊ธฐ
LSP์ž์‹=๋ถ€๋ชจ ๋Œ€์ฒด
ISP์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ
DIP์ถ”์ƒํ™” ์˜์กด

SOLID๋Š” โ€œ๋ณ€๊ฒฝ์— ๊ฐ•ํ•œ ์„ค๊ณ„โ€๋ฅผ ์œ„ํ•œ 5๊ฐ€์ง€ ๋‚˜์นจ๋ฐ˜์ด๋‹ค. ๊ณตํ†ต ํ‚ค์›Œ๋“œ๋Š” ์ถ”์ƒํ™”(์ธํ„ฐํŽ˜์ด์Šค)๋กœ ๊ฒฐํ•ฉ์„ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด๋Š” ์Šคํ”„๋ง์˜ DIยท์ „๋žต ํŒจํ„ด ๋“ฑ ์‹ค๋ฌด ์„ค๊ณ„ ์ „๋ฐ˜์˜ ํ† ๋Œ€๊ฐ€ ๋œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.