๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- ๊ธฐํƒ€

[๊ฐœ๋ฐœ์ž ์ฑ…์ฝ๊ธฐ] ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜-์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์กฐ์™€ ์„ค๊ณ„์˜ ์›์น™ (9์žฅ 10์žฅ 11์žฅ LSP ์™€ ISP ๊ทธ๋ฆฌ๊ณ  DIP)

by Wonit 2022. 4. 23.

ํ•ด๋‹น ๊ธ€์€ 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 ์ด๋ฉฐ ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ธํ•ด์„œ ๊ทœ์น™์ด ๋  ์ˆ˜ ์—†๋‹ค๊ณ  ์ด์•ผ๊ธฐํ•œ๋‹ค.

๋Œ“๊ธ€