[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ยท์ ๋ต ํจํด ๋ฑ ์ค๋ฌด ์ค๊ณ ์ ๋ฐ์ ํ ๋๊ฐ ๋๋ค.
Comments powered by Disqus.