ํด๋น ๊ธ์ Robert C.Martin ํด๋ฆฐ ์ํคํ ์ฒ ๋ผ๋ ์ฑ ์ ์ฝ๊ณ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌ ๋ฐ ํ๊ณ ํ๋ ๊ธ ์ ๋๋ค. ์์ธํ ์ฌํญ์ YES 24 ํด๋ฆฐ ์ํคํ ์ฒ - ์ํํธ์จ์ด ๊ตฌ์กฐ์ ์ค๊ณ์ ์์น ์์ ํ์ธํด์ฃผ์ธ์.
ํด๋ฆฐ ์ํคํ ์ฒ - ์ํํธ์จ์ด ๊ตฌ์กฐ์ ์ค๊ณ์ ์์น (Robert C. Martin)
- ์ํค๋ถ์ค
- ์ง์์ด: Robert C.Martin (Uncle Bob)
- ์ฎ๊ธด์ด: ์ก์ค์ด
์ด๋ฒ ์ฅ์์ ์ด์ผ๊ธฐํ๊ณ ์ ํ๋ ๊ฒ
LSP
- ๋ค์๊ณผ ๊ฐ์ ์นํ ์์น์ด ์ ์ฉ๋๋ค๋ฉด LSP ๋ฅผ ๋ง์กฑํ๋ค
- A ๋ฅผ ๊ตฌํํ๋(์์ํ๋) ์๋ธ ํ์ B์ C ๊ฐ ์๋ค๋ฉด B ํ์ ์ ๋ชจ๋ C ํ์ ์ผ๋ก ๋ณ๊ฒฝํ๋๋ผ๋ ํ์๊ฐ ๋ณํ์ง ์๋๋ค.
- LSP ๋ ์ํคํ
์ฒ ์์ค๊น์ง ํ์ฅํ ์ ์๊ณ ๋ฐ๋์ ํ์ฅํด์ผ ํ๋ค.
- ์นํ ๊ฐ๋ฅ์ฑ์ ์๋ฐฐํ๋ค๋ฉด ์๋น๋์ ์ถ๊ฐ ๊ตฌํ์ฌํญ์ด ๋ฑ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
ISP
- ๋ณ๊ฒฝ์ ์ ๋ฆฌํ๊ฒ ๋์ฒํ๊ธฐ ์ํด์๋ ์ ๋ง๋ก ์์์ผ ํ ์ ๋ณด๋ง ์์์ผ ํ๋ค
- ํ์ ์ด์์ผ๋ก ๋ง์ ๊ฒ์ ํฌํจํ๋ ๋ชจ๋์ ์์กดํ๋ ๊ฒ์ ํด๋ก์ด ์ผ์ด๋ค.
- ๋ฌด์ธ๊ฐ์ ์์กดํ๋ค๋ ๊ฒ์ ์์์น๋ ๋ชปํ ์ผ์ ๋ถ๋ฌ์ผ์ผํฌ ์ ์๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก ์์กด์ ์ต์ํํด์ผ ํ๋ค๋ ๊ตํ์ ISP ์์ ๋๋ ์ ์๋ฐ.
DIP
- ์ ์ฐ์ฑ์ด ๊ทน๋ํ๋ ์์คํ
- ์์ค ์ฝ๋ ์์กด์ฑ์ด ์ถ์์ ์์กดํ๋ฉฐ ๊ตฌ์ฒด์๋ ์์กดํ์ง ์๋ ์์คํ
- It depends on abstraction, not a concretion
- ์์ค ์ฝ๋ ์์กด์ฑ์ด ์ถ์์ ์์กดํ๋ฉฐ ๊ตฌ์ฒด์๋ ์์กดํ์ง ์๋ ์์คํ
- ํ์ค์ ์ผ๋ก DIP ๋ ๊ท์น์ด ๋๊ธฐ ํ๋ฆ
String.class
์ ๊ฐ์ ๊ตฌ์ฒด ํด๋์ค์ ๋ํ ์์กด์ฑ์ ๋ฒ์ด๋ ์ ์๊ณ ๋ฒ์ด๋์๋ ์๋๊ธฐ ๋๋ฌธ์
- Abstraction ์ Concretion ๋ณด๋ค ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋ ๋ฎ๊ธฐ ๋๋ฌธ์ด๋ค.
- DIP ๋ฅผ ์ํ ๋ช๊ฐ์ง ์ค์ฒ๋ฒ์ด ์กด์ฌํ๋ค.
- ๋ณ๋์ฑ์ด ํฐ Concrete Class ๋ฅผ ์ฐธ์กฐํ์ง ๋ง์๋ผ
- ๋ณ๋์ฑ์ด ํฐ Concrete Class ๋ก๋ถํฐ ํ์ํ์ง ๋ง์๋ผ
- Concrete Class ๋ฅผ Override ํ์ง ๋ง์๋ผ
- ๊ตฌ์ฒด์ ์ด๋ฉฐ ๋ณ๋์ฑ์ด ํฌ๋ค๋ฉด ์ ๋๋ก ๊ทธ ์ด๋ฆ์ ์ธ๊ธํ์ง ๋ง์๋ผ
๋์ ํด์๊ณผ ํ๊ณ
์ด๋ฒ์๋ ๋ด ์๊ฐ์ ๋ํ ํ๊ณ ๊ฐ ์๋๋ผ ๊ฐ๊ฐ์ ์์น์ ๋ํด์ ํ๋ฒ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.
LSP
interface Car {}
class Bmw implements Car {}
class Audi implements Car {}
class Main {
public static void main(String[] args) {
Car car = new Bmw();
Car car2 = new Audi();
car = new Audi();
car2 = new Bmw();
}
}
๊ณผ ๊ฐ์ด ๋์์ ๋ car
๊ณผ car2
์ ํ์์ ๋ํ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ๋ค๋ฉด ์ด๋ LSP ๊ฐ ๋ง์กฑํ๋ ๊ฒ์ด๋ค.
ISP
interface Rule {}
interface UserRule extends Rule {}
interface AdminRule extends Rule {}
class UserRuleSet implements UserRule {}
class AdminRuleSet implements AdminRule {}
๊ณผ ๊ฐ์ด ๋์์ ๋, UserRuleSet
์ด๋ AdminRuleSet
์ Rule ์ ์ง์ ์ ์ผ๋ก ์์กดํ์ง ์๊ธฐ ๋๋ฌธ์, ์ ๋ง ํ์ํ ์ ๋ณด๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ISP ๊ฐ ๋ง์กฑ๋๋ค๊ณ ํ ์ ์๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ์ฃผ์ํด์ผ ํ ์ ์ด Rule ์ ๋ฌด์กฐ๊ฑด ๋๋๋ค๊ณ ํด์ ISP ๋ฅผ ๋ง์กฑํ๋ ๊ฒ์ ์๋๋ค.
Rule
์ด๋ผ๋ ์ธํฐํ์ด์ค๊ฐ ํ์ ์ด์์ผ๋ก ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ก๊ณ , ๊ทธ๋ค์ ์ ์ ํ UserRule ๊ณผ AdminRule ์ด ์์ ํ๊ณ ๋ถ๋ฆฌํ ๋๋ง ์ ์ฉ๋๋ ๋ง์ด๋ค
DIP
public class Main {
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
ArrayList<String> strings2 = new ArrayList<>();
}
}
์์ ์ฝ๋์์ string2
๋ ํ๋ฉด์ ์ผ๋ก๋ DIP ๋ฅผ ์๋ฐฐํ๋ค.
ArrayList ๋ Concrete ์ด๋ฉฐ ์ง์ ์ ์ผ๋ก Concrete ๋ฅผ ์์กดํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง DIP ๋ฅผ ์ ์ดํดํ๋ค๋ฉด ์์ ์ฝ๋๋ ๋ชจ๋ ๋ฌธ์ ๊ฐ ์๋ค.
๊ทธ๋ผ ๋ค์์ ์ด๋จ๊น?
public class Main {
public static void main(String[] args) {
Car car1 = new Bmw<>();
Audi car2 = new Audi<>();
}
}
์์ ์ฝ๋๋ DIP ๋ฅผ ์๋ฐฐํ ๊ฒ ๊ฐ์๋ฐ ๊ณผ์ฐ ์ ๋ง ์๋ฐฐํ ๊น?
๋ต์ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค๋ ๊ฒ์ด๋ค.
๋ง์ฝ ์๋ฐฐํ๊ฒ ๋๋ค๋ฉด Audi ๋ฅผ ๋ ํผ๋ฐ์ค ํ์
์ผ๋ก ํ๋ car2
๊ฐ DIP ๋ฅผ ์๋ฐฐํ๋ค๊ณ ํ ์ ์๋ค.
ํ์ง๋ง ๋ง์ฝ ๊ทธ๋ด ์ผ์ด ๋งค์ฐ ๋๋ฌผ๊ฒ ์ง๋ง Audi ๋ผ๋ Concrete Class ๊ฐ ์ ~~๋ ๋ฐ๋ ์ฌ์ง๊ฐ ์๋ค๋ฉด DIP ๋ฅผ ์๋ฐฐํ์ง ์๋๋ค๊ณ ํ๋ค.
์ด๋ ๋ฏ ์ํฉ์ ๋ฐ๋ผ์, ๋น์ฆ๋์ค์ ๋ฐ๋ผ์ ๋ฌ๋ผ์ง ์ ์๋ ๊ฒ์ด ๋ฐ๋ก DIP ์ด๋ฉฐ ์ด๋ฌํ ์ด์ ๋ก ์ธํด์ ๊ท์น์ด ๋ ์ ์๋ค๊ณ ์ด์ผ๊ธฐํ๋ค.
๋๊ธ