๐Ÿงฉ

Design Patterns

Creation Patterns

Adapter (aka. Wrapper)

  • Client๊ฐ€ ํ•„์š”ํ•œ Target์˜ ์—ญํ• ์„ Adapter๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
  • Adapter๊ฐ€ Adaptee๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ์ƒ์†(inherit) ์œ„์ž„(delegate) ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
    • ์ƒ์†์€ implementation, ์œ„์ž„์€ aggregation ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์œ„์ž„์ด ๋ถ€์ž‘์šฉ์ด ์ ์€๋ฐ, ์ƒ์†์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ƒ์œ„ class์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์— ์˜์กดํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝ ์—†์ด ๊ทธ๋Œ€๋กœ ์“ฐ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž์ถฐ์„œ Adapter๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ๋˜๋Š” ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์ฝ”๋“œ๋งŒ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๊ตฌํ˜„์„ Adaptee๋กœ, ๊ตฌ๋ฒ„์ „์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ Target๋กœํ•˜์—ฌ Adapter๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

Factory Method

  • Instance๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์„ super class์—์„œ ๊ฒฐ์ •ํ•˜๋˜ ์‹ค์งˆ์ ์ธ ์ƒ์„ฑ์€ child class์—์„œ ๋‹ด๋‹นํ•œ๋‹ค.
    • ์—ฌ๊ธฐ์„œ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋ž€, ์–ด๋–ค method๋ฅผ ์–ด๋–ค parameter๋กœ ํ˜ธ์ถœํ•˜์—ฌ instance๋ฅผ ์ƒ์„ฑํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ด๋‹ค.
    • ์˜ˆ: CardFactory๋Š” createCard() method๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Card instance๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    • String.valueOf(1); List.of(โ€1โ€, โ€œ2โ€, โ€œ3โ€); Arrays.asList(new int[]{1, 2, 3});

Abstract Factory

  • Factory pattern๊ณผ ์‚ฌ์‹ค์ƒ ๋™์ผํ•˜์ง€๋งŒ Factory์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด(ConcreteFactory)๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.
    • Factory pattern์—์„œ๋Š” Client์—์„œ ConcreteFactory๋ฅผ ์ง์ ‘์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ Abstract Factory์—์„œ๋Š” ConcreteFactory๋ฅผ reflection์œผ๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์ง์ ‘์ ์œผ๋กœ ConcreteFactory๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ๋งํ‚นํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.
package factory; public abstract class Factory { public static Factory getFactory(String className) { Factory factory = null; try { factory = (Factory)Class.forName(className); } catch (ClassNotFoundException e) { System.out.println(className + " was not found"); } catch (Exception e) { e.printStackTrace(); } return factory; } public abstract Link createLink(String caption, String url); public abstract Card createCard(String title); public abstract Page createPage(String title, String author); };
  • Factory pattern์—์„œ๋Š” ์ œํ’ˆ, Abstract Factory pattern์—์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ถ€ํ’ˆ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋น„์œ ํ•˜๊ธฐ๋Š” ํ–ˆ๋Š”๋ฐ ์‚ฌ์‹ค ์–‘์ชฝ๋‹ค ์ƒ์„ฑํ•˜๋Š” ์ธ์Šคํ„ด์Šค ํƒ€์ž…์˜ ๊ฐ€์ง“์ˆ˜ ์ฐจ์ด๋งŒ ์žˆ์„ ๋ฟ ๋™์ผํ•œ ์ƒ์„ฑ ๋ฐฉ์‹์ž„์„ ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฌผ๋ก  Factory method pattern์˜ ๊ฒฝ์šฐ concrete class๋กœ ๋ถ€ํ„ฐ ์ง์ ‘ instance๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ Abstract Factory pattern๊ณผ๋Š” ํ™•์—ฐํžˆ ๊ตฌ๋ถ„๋œ๋‹ค.
  • ์ƒˆ๋กœ์šด ๋ถ€ํ’ˆ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ConcreteFactory์— method ์ถ”๊ฐ€๋ฅผ ์œ„ํ•œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•˜์˜€๋Š”๋ฐ ์‚ฌ์‹ค ์ด ๋ถ€๋ถ„์€ factory method์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ํ†ตํ•ด์„œ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ํ•œ๋‹ค.
public class DefaultFactory extends Factory { public Link createLink(String caption, String url) { throw new UnsupportedOperationException(); } ... };

Singleton

  • instance๊ฐ€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์ฆํ•˜๋Š” ํŒจํ„ด.
  • ์ƒ์„ฑ์ž๋Š” private๋กœ ์ œํ•œํ•˜๊ณ  ์œ ์ผํ•œ instance๋ฅผ ๋Œ๋ ค์ฃผ๋Š” static method (๋ณดํ†ต getInstance)๋ฅผ ์ •์˜ํ•œ๋‹ค.
    • getInstance๋Š” static factory method์˜ ์ผ์ข…์ด๋‹ค.
    • static factory method ์ฒ˜๋Ÿผ parameter๋ฅผ ๋ฐ›์•„์„œ ํ•ด๋‹น parameter์— ๋Œ€์‘๋˜๋Š” ์œ ์ผํ•œ instance๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • instance๋ฅผ method ํ˜ธ์ถœ ์‹œ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ์—ฌ๋Ÿฌ thread์—์„œ ์ ‘๊ทผํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ์œ ์˜ํ•œ๋‹ค (synchronized keyword ์‚ฌ์šฉ).
  • instance์˜ ์ˆ˜๋ฅผ ์œ ์ผํ•˜๊ฒŒ ์ œ์•ฝํ•จ์œผ๋กœ์„œ ๊ตฌํ˜„์˜ ๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
  • Java์—์„œ๋Š” enum์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
enum Singleton { INSTANCE; public void hello() { System.out.println("say hello!"); } } // ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค. Singleton.INSTANCE.hello();

Prototype

  • ๊ฐ์ฒด์˜ ๋ณต์ œ clone ๋ฅผ ํ†ตํ•ด์„œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ๋ณดํ†ต ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค.
    • ๊ฐ์ฒด์˜ ์ข…๋ฅ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์ด๋ฅผ ๊ฐ๊ฐ class๋กœ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ.
      • ๋™์ผํ•œ class๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์ด์ง€๋งŒ data์— ๋”ฐ๋ผ์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • class๋กœ ๋ถ€ํ„ฐ ์ง์ ‘ instance๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ.
      • ์ด ๋ถ€๋ถ„์€ ๊ฐ์ฒด ์ƒ์„ฑ ๊ณผ์ • ๋˜๋Š” ๋‚ด๋ถ€์˜ state๊ฐ€ ๋ณต์žกํ•˜์—ฌ ์ด๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • framework๋ฅผ ํŠน์ • class์— ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ.
      • ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ์›ํ˜• ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์„œ ๋“ฑ๋กํ•˜๊ณ  ์ดํ›„์— ๋“ฑ๋ก๋œ ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ๋ณต์‚ฌ๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ method๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ Java์˜ ๊ฒฝ์šฐ clone method๋ฅผ override ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Builder

  • ์ผ๋ จ์˜ ์ž‘์—… (method๋กœ ํ‘œํ˜„)์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  • Client - Director - Builder๋กœ ์—ญํ• ์ด ๋‚˜๋‰œ๋‹ค.
    • Client๋Š” Director์—๊ฒŒ ๋ชฉ์ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•ด ๋‹ฌ๋ผ๊ณ  ์˜๋ขฐconstruct(BuilderI)ํ•œ๋‹ค.
    • Director๋Š” Builder์˜ method ๋งŒ์„ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
      • Director๋Š” builder์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด๋ฅผ ๋ชจ๋ฅด๋ฉฐ Client๊ฐ€ ์˜๋ขฐํ•œ ๋Œ€๋กœ ๊ฐ์ฒด์˜ ๊ตฌ์„ฑ๋งŒ ์‹ ๊ฒฝ์“ด๋‹ค.
      • ์ด๋Š” ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์˜ ํ•œ ํ˜•ํƒœ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • Client๋Š” ๊ฒฐ๊ณผ์˜ ๊ตฌ์„ฑ์„ Director์—๊ฒŒ ์œ„์ž„ํ•˜๋ฉฐ ์ž์‹ ์€ ์ „ํ˜€ ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
      • ๋‹ค๋งŒ Client๋Š” ์ตœ์ข…์ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฅผ Builder๋กœ ๋ถ€ํ„ฐ ์ง์ ‘ ๋ฐ›๋Š”๋‹ค.
      • ์ด ๋•Œ ์‚ฌ์šฉ๋˜๋Š” method๋Š” ๋ฐ˜๋“œ์‹œ interface๋กœ ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•  ํ•„์š”๋Š” ์—†๋‹ค.

Structural Patterns

Bridge

  • ์ƒ์†์„ ๊ธฐ๋Šฅ, ๊ตฌํ˜„์˜ ๋‘๊ฐ€์ง€ ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ตฌํ˜„์ด๋ž€ API์™€ ๊ฐ™์ด ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๊ตฌํ˜„์ฒด๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„์„ ์˜๋ฏธํ•˜๊ณ  ๊ธฐ๋Šฅ์€ API๋ฅผ ์ด์šฉํ•ด์„œ ์‹ค์ œ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๊ธฐ๋Šฅ ๊ณ„์ธต์˜ ๊ฒฝ์šฐ ๊ตฌํ˜„ ๊ณ„์ธต์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค (์˜ˆ: new Painter(new LinuxFrameBuffer())).
  • ์œ„์ž„์„ ํ†ตํ•ด์„œ ๊ธฐ๋Šฅ๊ณผ ๊ตฌํ˜„ ๊ฐ„์˜ ๋А์Šจํ•œ ๊ฒฐํ•ฉ์„ ๋งŒ๋“ ๋‹ค.
  • ๊ตฌํ˜„ ๊ณ„์ธต์˜ ๊ฒฝ์šฐ ์ง์ ‘ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ์žˆ์ง€๋งŒ Abstract Factory pattern์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ค์งˆ์ ์ธ ๊ตฌํ˜„ ๋ถ€๋ถ„์„ ๊ตฌํ˜„ ๊ณ„์ธต์— ์œ„์ž„ํ•œ๋‹ค๋Š” ์ธก๋ฉด์—์„œ template method pattern๊ณผ ์œ ์‚ฌํ•˜๋‹ค (template method์˜ ๊ฒฝ์šฐ subclass์— ์œ„์ž„).
  • Adapter pattern๊ณผ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ๋‹ค๋ฅด๋‹ค. Adapter pattern์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค๋ฅธ ๋‘ ๊ฐ์ฒด๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์˜ˆ์ œ: ํ™”๋ฉด์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค
    • ๊ตฌํ˜„ ๊ณ„์ธต
    • ๊ธฐ๋Šฅ ๊ณ„์ธต

Composite

  • ์žฌ๊ท€์ ์ธ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ทธ๋ฆ‡์˜ ์—ญํ• ์ธ Composite์™€ ๋‚ด์šฉ๋ฌผ์ธ Leaf๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
    • Composite ๋‚ด๋ถ€์—๋Š” Leaf ๋˜๋Š” ๋‹ค๋ฅธ Composite๊ฐ€ ๋‹ด๊ธธ ์ˆ˜ ์žˆ๊ณ  ๋‘˜์€ Component๋ผ๋Š” interface๋ฅผ ํ†ตํ•ด์„œ ๋™์ผ์‹œ ๋œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ Directory (Composite), File (Leaf), Entry (Component) ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋ฌถ์–ด์„œ ํ•˜๋‚˜๋กœ ์ทจ๊ธ‰(Grouping)ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•๋„ ์—ฌ๊ธฐ์— ํ•ด๋‹น๋œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด High Order Component๋ฅผ compose๋กœ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ HOC๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์žˆ๊ฒ ๋‹ค.

Decorator

  • Decorator๋Š” ํ•ต์‹ฌ์ด ๋˜๋Š” ๊ฐ์ฒด (Component)์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋™์ผํ•œ ํ˜•ํƒœ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ํŒจํ„ด์ด๋‹ค.
    • ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•จ์—๋„ ํ˜•ํƒœ๋Š” ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ง„๋‹ค๋Š” ์ ์ด๋‹ค. ์ฆ‰, ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€ ์—ฌ๋ถ€๊ฐ€ ์™ธ๋ถ€๋กœ ๋ถ€ํ„ฐ ์ˆจ๊ฒจ์ง„๋‹ค.
      • ์ด๋ฅผ ๋‹ฌ๋ฆฌ ๋งํ•˜๋ฉด decorator๋กœ ๊ฐ์‹ธ๋”๋ผ๋„ ๋‚ด์šฉ๋ฌผ์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋œ๋‹ค๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค (ํˆฌ๊ณผ์ ).
    • ํ•ต์‹ฌ ๊ฐ์ฒด์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜์ง€ ์•Š๊ณ ๋„ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” ์š”์ฒญ์ด ํ•ต์‹ฌ ๊ฐ์ฒด๋กœ ์œ„์ž„๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๋˜ํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋Š” ์–ผ๋งˆ๋“ ์ง€ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์ƒ์†๋„ decorator์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€(ํˆฌ๊ณผ)ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์ž„๊ณผ ๋‹ฌ๋ฆฌ ์ƒ์†์€ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด๋ฉฐ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
  • ํ•ต์‹ฌ์ด ๋˜๋Š” ๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ์ถ”์ƒ ๊ฐ์ฒด๋กœ ์ •์˜๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ›„์ž์˜ ๊ฒฝ์šฐ๋Š” Template Method์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๊ฐ€ ๋œ๋‹ค.
    • ๋‹จ์œ„ ๊ธฐ๋Šฅ์€ abstract method๋กœ ์ •์˜๋  ์ˆ˜ ์žˆ๊ณ  ํ•ต์‹ฌ ๊ฐ์ฒด ๋˜๋Š” Decorator์—์„œ ๊ตฌํ˜„๋œ๋‹ค.
  • ๋‹จ, Template Method์™€ ๋‹ค๋ฅธ ์ ์€ Decorator๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ์‹ธ๋Š” ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋œ๋‹ค๋Š” ์ ์ด๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๋Š” StringDisplay concrete component์™€ ๋ฌธ์ž์—ด์„ ๊ฐ์‹ธ์„œ ๊ฒฝ๊ณ„์„ ์„ ์ถœ๋ ฅํ•˜๋Š” Border decorator๊ฐ€ ์กด์žฌํ•  ๋•Œ Border ๊ฐ์ฒด๋Š” new Border(new StringDisplay(contents)) ์™€ ๊ฐ™์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ์ฒด ๋˜ํ•œ ๋™์ผํ•œ component๋กœ ์ทจ๊ธ‰๋  ์ˆ˜ ์žˆ๋‹ค.
  • Java์˜ Reader ๊ตฌํ˜„์ด ์ด์— ๋Œ€ํ•œ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ œ์ด๋‹ค.
    • ์˜ˆ 1: new BufferedReader(new FileReader(filePath))
    • ์˜ˆ 2: new LineNumberReader(new BufferedReader(new FileReader(filePath)))

Facade

  • Facade (ํŒŒ์‚ฌ๋“œ) ํŒจํ„ด์€ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ์—ญํ• ์„ ์ˆจ๊ธฐ๊ณ  ๋‹จ์ˆœํ™”๋œ ์ฐฝ๊ตฌ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
    • ๋ณดํ†ต ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ์ด ๊ณ ์ •๋˜์–ด์žˆ์–ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ์ฒด๋“ค์„ ํŠน์ •ํ•œ ๋ฐฉ์‹์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๋•Œ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • Facade ๊ฐ์ฒด์—๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ๋กœ์ง์„ ๋‹ด๊ณ  ์žˆ๋‹ค.
      • ๋‹ฌ๋ฆฌ ๋งํ•˜๋ฉด ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.
    • ๋งค๋ฒˆ ์‚ฌ์šฉ์ž๊ฐ€ ์—ญํ•  ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‹œ์Šคํ…œ ๋‚ด๋ถ€์˜ ๊ฐ์ฒด๋“ค์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
    • ๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ˆ˜๋กœ ๋‚ด๋ถ€์˜ ๊ฐ์ฒด๋ฅผ ์ž˜๋ชป ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ํŠน์ •ํ•œ ๋ฃจํ‹ด์„ ๋นผ๋จน๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Builder๋ž‘ ๋น„์Šทํ•ด ๋ณด์ผ ์ˆ˜๋Š” ์žˆ๋Š”๋ฐ Builder๋Š” ๋ถ€ํ’ˆ ์ƒ์„ฑ๊ณผ ์ด๋ฅผ ํ†ตํ•ด ์™„์„ฑํ’ˆ์„ ๊ตฌ์„ฑํ•˜๋Š” ์—ญํ• ์„ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์ ์ด๋ผ๋ฉด Facade๋Š” ๋‚ด๋ถ€์— ์–ด๋–ค ๋ถ€ํ’ˆ์ด ์žˆ๋Š”์ง€๋Š” ์ˆจ๊ธฐ๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋‹จ์ˆœํ•œ ์ œํ’ˆ์˜ ์™ธํ˜•๋งŒ์„ ์ œ์‹œํ•œ๋‹ค๋Š” ์ ์—์„œ ๋‹ค๋ฅด๋‹ค.
  • Adapter์™€๋„ ๋น„์Šทํ•ด๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ Adapter๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š”๊ฒŒ ๋ชฉ์ ์ด๋ผ๋ฉด Facade๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ˆ˜๋ฅผ ์ค„์ด๊ณ  ๋‹จ์ˆœํ™”ํ•˜๋Š”๋ฐ์— ์ค‘์ ์„ ๋‘”๋‹ค.

Flyweight

  • ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • Factory Method ํŒจํ„ด์„ ์ด์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ํ†ต์ œํ•˜๊ณ  ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ •๋ณด (intrinsic)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ณต์œ ํ•œ๋‹ค.
    • ๊ณต์œ ๋˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ €์žฅํ•˜๋Š”๋ฐ ์ถ”๊ฐ€์ ์ธ ์ž์›์ด ๋“ค์–ด๊ฐ„๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํŠน์ • ์ •๋ณด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด๋ฏธ ํ•ด๋‹น๋˜๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ์ฒดํฌํ•˜๊ณ  ์—†์œผ๋ฉด ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋ฉฐ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋น„ํ•œ๋‹ค.
      • ๋ฌผ๋ก  cache๋‚˜ weak map ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค์˜ ์ˆ˜๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ตœ์ ํ™”์˜ ์˜์—ญ์ด๋‹ค.
  • Java String์—์„œ ์ œ๊ณตํ•˜๋Š” intern method๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ด๋‹ค.
  • ์–ด๋–ค ๋ฉด์—์„œ๋Š” Singleton๊ณผ ๋น„์Šทํ•œ๋ฐ Singleton์€ ์œ ์ผํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•œ๋‹ค๋Š” ์ ์—์„œ Flyweight๋Š” ํŠน์ • ์ •๋ณด์— ๋Œ€ํ•ด์„œ๋Š” ์œ ์ผํ•˜์ง€๋งŒ ์ •๋ณด์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ธ์Šคํ„ด์Šค๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์ธก๋ฉด์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

Proxy

  • ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ๋Œ€๋ฆฌํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ๋Œ€์ƒ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์ผ๋ถ€ ์ž‘์—…์„ ์ƒ์„ฑ ์ „์— ์Šค์Šค๋กœ & ๋ฏธ๋ฆฌ ๋Œ€๋ฆฌํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋Œ€๋ฆฌ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—…์„ ์š”์ฒญํ•œ ๊ฒฝ์šฐ ๋Œ€๋ฆฌ์ž๋Š” ์‹ค์ œ ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ž‘์—…์„ ์œ„์ž„ํ•œ๋‹ค.
      • ์‹ค์ œ ๋Œ€์ƒ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ์ผ๋ถ€ ์ž‘์—…์˜ ๊ฒฝ์šฐ ๋Œ€๋ฆฌ์ž๊ฐ€ ์ˆ˜ํ–‰ + ๋Œ€์ƒ ๊ฐ์ฒด์— ๋ฐ˜์˜ํ•˜๋„๋ก ์ž‘์—…์„ ์œ„์ž„ํ•˜๊ฒŒ ๋œ๋‹ค.
    • ๋Œ€์ƒ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ ๋งŽ์€ ์–‘์˜ ์ž์›์ด ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ์ด๋ฅผ ์ง€์—ฐ ์‹œํ‚ด์œผ๋กœ์จ ์‚ฌ์ „์— ์ผ๋ถ€ ์ž‘์—…์„ ๋ฏธ๋ฆฌ ์™„๋ฃŒํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์ƒ์„ฑ์„ ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋Œ€์ƒ์ด ๋˜๋Š” ์‹ค์ œ ๊ฐ์ฒด (RealSubject)์™€ ๋Œ€๋ฆฌ์ž (Proxy)๋Š” ๋™์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค (Subject)๋ฅผ ๊ฐ–๋Š”๋‹ค.
    • Decorator์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํˆฌ๊ณผ์ ์ธ ํŠน์„ฑ์„ ๊ฐ€์ง„๋‹ค.
  • ๋Œ€๋ฆฌ์ž์˜ ์œ ํ˜•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    • Virtual Proxy (๊ฐ€์ƒ ๋Œ€๋ฆฌ์ž)
      • ์‹ค์ œ๋กœ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ์ƒ์„ฑํ•œ๋‹ค.
    • Remote Proxy (์›๊ฒฉ ๋Œ€๋ฆฌ์ž)
      • ์›๊ฒฉ์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งˆ์น˜ ๋กœ์ปฌ์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•œ๋‹ค.
    • Access Proxy (๋ณดํ˜ธ ๋Œ€๋ฆฌ์ž)
      • ๋Œ€์ƒ ๊ฐ์ฒด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•œ๋‹ค.

Behavioral Patterns

Template Method

  • super class์—์„œ ๋ผˆ๋Œ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  child class์—์„œ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘์„ ๊ฒฐ์ •ํ•œ๋‹ค.
  • ์ „์ฒด ์ž‘์—…์„ ๋ช‡๊ฐœ์˜ ๋‹จ์œ„ ์ž‘์—…์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ๊ฐ๊ฐ์„ interface ํ™” ํ•œ๋‹ค.
    • ์˜ˆ: display() = open() + print() + close()
  • super class์—๋Š” algorithm ๋˜๋Š” logic์ด ์กด์žฌํ•˜๊ณ  child class์—๋Š” ๋‹จ์œ„ ์ž‘์—…์˜ ๊ตฌ์ฒด์ ์ธ implementation์ด ์žˆ๋‹ค.
  • Abstract class๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ด๋‹ค.

Strategy

  • ํŠน์ •ํ•œ context ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ์ฒด๋กœ ๋ถ„๋ฆฌ(์œ„์ž„)ํ•˜์—ฌ ๊ตํ™˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
  • ์ƒ์†(์˜ˆ: Template Method)์œผ๋กœ๋„ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ์†์€ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์ด๋ฉฐ ์œ„์ž„์€ ์•ฝํ•œ ๊ฒฐํ•ฉ์ด๊ณ  ์‰ฝ๊ฒŒ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

Visitor

  • Visitor๋Š” ๊ฐ์ฒด์˜ ๊ตฌ์กฐ์™€ ์ฒ˜๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋Š” Composite ํŒจํ„ด์„ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” Visitor ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ๋‹ค.
    • ๊ตฌ์กฐ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋Š” Element, ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๋Š” Visitor๋กœ ๋ถˆ๋ฆฐ๋‹ค.
  • Element์™€ Visitor๋Š” ๊ฐ๊ฐ accept, visit method๋ฅผ ํ†ตํ•ด์„œ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ๋‹ค.
    • Element::accept method์—์„œ๋Š” ํŠน์ • ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ Visitor๋กœ ์œ„์ž„ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
      • ์˜ˆ: File::accept(Visitor)์˜ ๊ฒฝ์šฐ EntryVisitor::visit(File)์„ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋Š” ๋ช…์‹œ์ ์œผ๋กœ File์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ EntryVisitor์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • Visitor::visit method์—์„œ๋Š” Element์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ๊ฐ์ฒด ๋ณ„๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ method overloading์„ ํ†ตํ•ด์„œ ๊ตฌํ˜„ํ•œ๋‹ค.
      • ์˜ˆ: EntryVisitor๋Š” visit(File), visit(Directory)๋ฅผ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    • ๋‹น์—ฐํ•˜๊ฒ ์ง€๋งŒ Visitor๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ Element๊ฐ€ ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค๋ฉด Directory๋Š” ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ์ž์‹ ์ด ๊ฐ€์ง„ Entry์˜ ๋ชฉ๋ก์„ ์ œ๊ณตํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    • ์ด๋Ÿฐ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ๊ฐ์ฒด์˜ ๊ตฌ์กฐ์— ์ƒˆ๋กœ์šด ํƒ€์ž…์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ๊ฐ๊ฐ์˜ accept, visit method๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    • ์ด๋Ÿฐ ํ˜•์‹์œผ๋กœ ์ƒํ˜ธ๊ฐ„์— ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๋Š” ํŒจํ„ด์„ double dispatch๋ผ๊ณ  ํ•œ๋‹ค.
  • Visitor ํŒจํ„ด์€ OCP (Open-Closed Principle)์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ด๋‹ค.
    • ๊ฐ์ฒด๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๋˜ ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ์ƒˆ๋กœ์šด ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ํ•„์š”ํ•  ๋–„๋Š” Visitor๋ฅผ ์ƒˆ๋กœ ๊ตฌํ˜„ํ•จ์œผ๋กœ์„œ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ˜๋ฉด ๊ธฐ์กด ํด๋ž˜์Šค๋Š” ์ด์— ๋”ฐ๋ฅด๋Š” ์ˆ˜์ •์ด ํ•„์š” ์—†๊ฒŒ ๋œ๋‹ค.
    • ๋‹ค๋งŒ ์ด๋Š” ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์˜ ํ™•์žฅ์—๋งŒ ํ•ด๋‹น๋˜๋ฉฐ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ธ Element ๊ฐ์ฒด์˜ ํ™•์žฅ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
      • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ทธ์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด ConcreteElement๊ฐ€ ์ถ”๊ฐ€๋˜๋ฏ€๋กœ Visitor์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ์—ฐ์‡„์ ์œผ๋กœ ConcreteVisitor์˜ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
      • ๋‹ค๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๋ณ€๊ฒฝ๋ณด๋‹ค๋Š” ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€๊ฐ€ ๋” ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ด๋Ÿฐ ์ „๋žต์ด ์‹ค์šฉ์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
Q. accept method๋Š” ๊ผญ ํ•„์š”ํ•œ๊ฐ€? C++์˜ variant ๊ตฌํ˜„์„ ๋ณด๋ฉด accept method๋ฅผ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ Visitor ํŒจํ„ด์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” C++์—์„œ ์ œ๊ณตํ•˜๋Š” SFINAE (Substitution Failure Is Not An Error) ๊ธฐ๋ฒ•์„ ์ด์šฉํ•œ ๊ฒƒ์œผ๋กœ ํŠน์ •ํ•œ ํƒ€์ž…์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์„ ์–ธ์–ด์˜ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ผ ๋ฟ์ด๋‹ค. Java์—์„œ๋„ reflection API์„ ์ด์šฉํ•˜๋ฉด ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์œ„์ž„์˜ ๋ฐฉ์‹์ด ๋‹จ์ˆœํžˆ Visitor๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ ๋ฟ์ด๋ผ๋ฉด ์ด๋ ‡๊ฒŒ ํ•˜๋”๋ผ๋„ ๋ฌธ์ œ๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค (๋ฌผ๋ก  reflection API๋ฅผ ์“ฐ๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ๊ณ ๋ คํ•ด์•ผ ๊ฒ ์ง€๋งŒ). ํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฌต์‹œ์ (implicit)์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋ฒ„๋ฆฐ๋‹ค. ๋˜ํ•œ ์ผ๋ฐ˜์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ๊ฐ์ฒด๊ฐ€ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ์‹์„ ๋‹ค๋ฅด๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ๋„ ์ œ๊ฑฐํ•ด๋ฒ„๋ฆฐ๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด ์–ด๋–ค ๊ฐ์ฒด๋Š” Visitor์—๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ accept method๋Š” Element ๊ฐ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ Visitor์—๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ†ต๋กœ์ด๋ฏ€๋กœ ํ•„์š”ํ•˜๋‹ค.

Chain Of Responsibility

  • ํŠน์ •ํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๊ณ ์ •๋˜์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฒ˜๋ฆฌ์ž (Handler)๋ฅผ ์—ฎ์–ด์„œ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ์ด ํŒจํ„ด์€ ๋งˆ์น˜ LinkedList ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Handler ์ˆœ์ฐจ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์ด ์ค‘ ํ•˜๋‚˜์˜ Handler๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.
    • ํŠน์ •ํ•œ Handler๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜์—ฌ (1) ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋Œ๋ ค์ฃผ๊ฑฐ๋‚˜ (2) ๋‹ค์Œ Handler๋กœ ์š”์ฒญ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•œ๋‹ค.
    • ์š”์ฒญ์„ ์–ด๋–ค ์ฒ˜๋ฆฌ์ž๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ์ง€ ์ˆจ๊ธฐ๊ฒŒ ๋˜๋ฏ€๋กœ ์š”์ฒญ์ž์™€ ์ฒ˜๋ฆฌ์ž ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋А์Šจํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
      • ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ค‘์•™์—์„œ ์š”์ฒญ์˜ ํ˜•ํƒœ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ์ž๋ฅผ ๋งค์นญํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์š”์ฒญ์ž์˜ ์ฒ˜๋ฆฌ์ž์˜ ๊ฒฐํ•ฉ์„ ๋” ๊ฐ•ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • Decorator ํŒจํ„ด๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • Handler๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ์ผ๋ถ€ ํ•ญ๋ชฉ์„ ์ฒ˜๋ฆฌํ•œ ๋’ค ๋‹ค์Œ Handler์—๊ฒŒ ๋‚˜๋จธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„์˜ ์˜ˆ๋กœ middleware๊ฐ€ ์žˆ๋‹ค.
    • Middleware๋Š” ํŠน์ •ํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ๋…๋ฆฝ์ ์ธ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ฒ˜๋ฆฌ์ž๋กœ ํŠน์ •ํ•œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฒฐํ•ฉ๋  ์ˆ˜ ์žˆ๋‹ค.

Mediator

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

Observer

  • ๊ด€์ฐฐ ๋Œ€์ƒ ๊ฐ์ฒด (Subject)์— ๊ด€์ฐฐ์ž (Observer)๋ฅผ ๋“ฑ๋กํ•จ์œผ๋กœ์„œ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • Observer๋ผ๋Š” ์ด๋ฆ„๊ณผ ๋‹ฌ๋ฆฌ ๊ด€์ฐฐ์ž๋Š” ๊ด€์ฐฐ ๋Œ€์ƒ ๊ฐ์ฒด๊ฐ€ ์ฃผ๋Š” ์ •๋ณด๋ฅผ ์ˆ˜๋™์ ์œผ๋กœ ๋ฐ›์•„๋“ค์ด๊ธฐ๋งŒ ํ•œ๋‹ค.
    • ๊ด€์ฐฐ ๋Œ€์ƒ ๊ฐ์ฒด๋Š” ๊ด€์ฐฐ์ž์˜ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์ž๊ธฐ ์ž์‹  ๋˜๋Š” ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ํ†ต์ง€ํ•œ๋‹ค.
    • ํ•˜๋‚˜์˜ ๊ด€์ฐฐ ๋Œ€์ƒ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ ๊ด€์ฐฐ์ž๋Š” ํ•˜๋‚˜ ์ด์ƒ์ผ ์ˆ˜ ์žˆ๋‹ค.

Memento

  • ํŠน์ •ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ๋ณต์›ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์ธ ๊ด€๋ฆฌ์ธ Caretaker, ์ƒํƒœ์— ๋Œ€ํ•œ snapshot์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์ธ ์ž‘์„ฑ์ž Originator๊ฐ€ ์กด์žฌํ•œ๋‹ค.
    • Memento ํŒจํ„ด์€ ๊ด€๋ฆฌ์ธ์ด๋ผ๋Š” ์—ญํ• ์„ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ๋Œ€์ƒ ๊ฐ์ฒด๋กœ ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•ด๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • ์ž‘์„ฑ์ž๋Š” ๊ด€๋ฆฌ์ธ์— ์š”์ฒญ์— ๋”ฐ๋ผ (1) ํŠน์ •ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ Memento๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ (2) Memento๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ์ฒด์˜ ์ƒํƒœ Memento๋Š” ๊ด€๋ฆฌ์ธ, ์ž‘์„ฑ์ž ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘๊ฐ€์ง€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋…ธ์ถœํ•œ๋‹ค.
      • ๊ด€๋ฆฌ์ธ์—๊ฒŒ๋Š” ์ข์€ narrow ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋…ธ์ถœํ•œ๋‹ค. ๊ด€๋ฆฌ์ธ์—๊ฒŒ Memento๋Š” ๋ธ”๋ž™ ๋ฐ•์Šค์ด๋ฉฐ ๋‚ด๋ถ€๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ณ  ์ง€์ •๋œ ์ƒํƒœ ๊ฐ’๋งŒ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
      • ์ž‘์„ฑ์ž์—๊ฒŒ๋Š” ๋„“์€ wide ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋…ธ์ถœํ•œ๋‹ค. ์ž‘์„ฑ์ž๋Š” Memento๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

State

  • ๊ฐœ๋ณ„ ์ƒํƒœ์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ ์ƒํƒœ ๊ฐ์ฒด์— ํŠน์ • ์ƒํƒœ์—์„œ์˜ ์ฒ˜๋ฆฌ ์—ญํ• ์„ ๋งก๊ธฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ๋ฌธ์ œ๋ฅผ ๋ถ„ํ•  (divide and conquer) ํ•˜๋Š” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋กœ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๋ฌธ์ œ๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ๋” ์ž‘์€ ๊ทœ๋ชจ๋กœ ๋งŒ๋“ ๋‹ค.
    • ๋งŒ์ผ ์ƒํƒœ ๋ณ„๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ•˜๋‚˜์˜ ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ์ƒํƒœ ๊ฐ’์— ๋”ฐ๋ผ์„œ ๋ถ„๊ธฐ๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
      • ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์‹ค์ˆ˜๋ฅผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ณ  ์ž˜๋ชป์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ธ์ง€ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋œ๋‹ค.
      • ์ƒํƒœ ๋ณ„๋กœ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด ํŠน์ • ์ƒํƒœ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌํ•ด์•ผ ๋  ํ•ญ๋ชฉ์ด ๋ถ„๋ช…ํ•˜๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์กด์žฌํ•˜๋ฏ€๋กœ ๋นผ๋จน๊ณ  ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์ธ์ง€ํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ์ƒํƒœ๋ฅผ ์ „ํ™˜ํ•˜๋Š” ์—ญํ• ์€ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ธ Context๊ฐ€ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ฐœ๋ณ„ ์ƒํƒœ ๊ฐ์ฒด State์— ์œ„์ž„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • Context๊ฐ€ ํ•  ๊ฒฝ์šฐ
      • Mediator ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ƒํƒœ ๊ฐ์ฒด๋Š” Context์— ๋ณ€๊ฒฝ์„ ๋ณด๊ณ ํ•˜๊ณ  Context๋Š” ์ด์— ๋”ฐ๋ผ์„œ ์ƒํƒœ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ์ง€์‹œ๋ฅผ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค.
      • ์ด๋ฅผ ์œ„ํ•ด์„œ Context๋Š” ๋ชจ๋“  State ๊ฐ์ฒด๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.
    • State๊ฐ€ ํ•  ๊ฒฝ์šฐ
      • State๊ฐ€ ์ง์ ‘ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์—ฌ Context์—๊ฒŒ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ผ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค.
      • Context๋Š” ์ดˆ๊ธฐ ์ƒํƒœ์— ํ•ด๋‹น๋˜๋Š” State๋งŒ ์•Œ๋ฉด ๋˜์ง€๋งŒ ๊ฐ State ๊ฐ์ฒด๋Š” ์„œ๋กœ๊ฐ€ ์„œ๋กœ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.
Q. ์ƒํƒœ ๋ณ€๊ฒฝ ๊ด€๋ฆฌ๋Š” ๋ˆ„๊ฐ€ ํ•˜๋Š”๊ฒŒ ์ข‹์„๊นŒ? ๊ฒฐ๋ก ๋งŒ ๋งํ•˜์ž๋ฉด Context๊ฐ€ ํ•˜๋Š”๊ฒŒ ๋” ์œ ๋ฆฌํ•ด ๋ณด์ธ๋‹ค. State๊ฐ€ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด ๊ฐœ๋ณ„ State์˜ ์—ญํ• ์— ์ถฉ์‹คํ•  ์ˆ˜ ์—†๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ State์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ๋  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๋˜ํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์ผํ•œ ์ƒํƒœ๊ฐ’ ๋ณด๋‹ค๋Š” ๋‹ค์–‘ํ•œ ์ƒํƒœ๊ฐ’๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๊ฐœ๋ณ„ State ๊ฐ์ฒด์—์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋ฉฐ ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ์ฐจ๋ผ๋ฆฌ Mediator ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ Context์—์„œ ๊ทธ๋Ÿฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ชจ์•„๋‘๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค.

Command

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

Interpreter

  • ํ•ด๊ฒฐํ•ด์•ผ๋  ๋ฌธ์ œ๋ฅผ ๋ฏธ๋‹ˆ ์–ธ์–ด๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๊ทธ ํ‘œํ˜„์„ ํ•ด์„ํ•˜์—ฌ ์‹คํ–‰ํ•จ์œผ๋กœ์„œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ˆ˜์ • ์—†์ด ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•.
    • ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋œ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜์ •ํ•œ๋‹ค.
    • ํ•ด๊ฒฐํ•ด์•ผ๋  ๋ฌธ์ œ๋ฅผ ๋ฏธ๋‹ˆ ์–ธ์–ด๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ํ•ด์„ํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋ฉด ๋ฏธ๋‹ˆ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฏธ๋‹ˆ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฏธ๋‹ˆ ํ”„๋กœ๊ทธ๋žจ (๋ฏธ๋‹ˆ ์–ธ์–ด๋กœ ์ž‘์„ฑ) โ†’ ๋ฏธ๋‹ˆ ์–ธ์–ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ โ†’ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์‹คํ–‰ ํ™˜๊ฒฝ ์˜ 3๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • ๋ฏธ๋‹ˆ ์–ธ์–ด๋Š” Backus-Naur Form (BNF)์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ •์˜๋  ์ˆ˜ ์žˆ๋‹ค.
    • BNF๋กœ ์ •์˜๋œ ํ‘œํ˜„ ์ค‘ ํ‘œํ˜„์˜ ์ •์˜๊ฐ€ ๋‹ค๋ฅธ ํ‘œํ˜„์œผ๋กœ ์ „๊ฐœ (ํ™•์žฅ)๋˜๋Š” ํ‘œํ˜„์€ non-terminal, ์ „๊ฐœ๋˜์ง€ ์•Š๋Š” ํ‘œํ˜„์€ terminal expression ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ์ •์˜๋œ ๋ฏธ๋‹ˆ์–ธ์–ด๋ฅผ ๊ฐ์ฒด๋กœ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๋•Œ BNF์— ์ •์˜๋œ ํ•ญ๋ชฉ๊ณผ ๋Œ€์‘๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๋…ธ๋“œ (Node)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์‹คํ–‰ํ•จ์œผ๋กœ์„œ ๋ชฉ์ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Command ํŒจํ„ด๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ˆœ์„œ๋กœ ์กฐํ•ฉ๋œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ํ•ด์„๊ธฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜๋Š” dependency injection๊ณผ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ์ฒด๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š” ๋ฐฉ์‹์„ ๋ฏธ๋‹ˆ ์–ธ์–ด๋กœ ๊ธฐ์ˆ ํ•˜์—ฌ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.