J1Yun
ZU-TECHLOG
J1Yun
전체 방문자
였늘
μ–΄μ œ
  • πŸ“‘ Category (135)
    • Algorithm (61)
      • πŸ“š Concept (6)
      • πŸ“˜ Baekjoon Judge (53)
      • πŸ“— Programmers (2)
    • Computer Science (42)
      • πŸ”’ Operating System (14)
      • πŸ“‘ Network (15)
      • πŸ’Ύ Database (8)
      • 🧩 Design Pattern (4)
      • πŸ”‘ Security (1)
    • Activities (12)
      • 🦁 λ©‹μŸμ΄μ‚¬μžμ²˜λŸΌ 9κΈ° (6)
      • πŸ’» SWλ§ˆμ—μŠ€νŠΈλ‘œ 13κΈ° (6)
    • Infra (1)
      • ☁️ AWS (1)
    • Languages (1)
      • πŸ’™ Python (1)
    • Backend (7)
      • πŸ”΅ Django (4)
      • 🟒 Node.js (3)
    • Ect. (8)
      • πŸ’¬ Talk (0)
      • πŸ—‚οΈ 개발직ꡰ μ·¨μ—… μ€€λΉ„μžλ£Œ (8)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ
  • λ°©λͺ…둝

곡지사항

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

250x250
hELLO Β· Designed By μ •μƒμš°.
J1Yun

ZU-TECHLOG

[λ””μžμΈνŒ¨ν„΄] Template Method νŒ¨ν„΄ - ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ ꡬ체적으둜 μ²˜λ¦¬ν•˜κΈ°
Computer Science/🧩 Design Pattern

[λ””μžμΈνŒ¨ν„΄] Template Method νŒ¨ν„΄ - ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ ꡬ체적으둜 μ²˜λ¦¬ν•˜κΈ°

728x90
β€» Java μ–Έμ–΄λ‘œ λ°°μš°λŠ” λ””μžμΈ νŒ¨ν„΄ μž…λ¬Έ(μ˜μ§„λ‹·μ»΄) λ„μ„œλ₯Ό λ°”νƒ•μœΌλ‘œ μž‘μ„±λœ λ‚΄μš©μž…λ‹ˆλ‹€.

 

Template Method(ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ) νŒ¨ν„΄ μ†Œκ°œ

  • μƒμœ„ ν΄λž˜μŠ€μ—μ„œ ν…œν”Œλ¦Ώμ— ν•΄λ‹Ήν•˜λŠ” 좔상 λ©”μ†Œλ“œ μ •μ˜, ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ ν•΄λ‹Ή 좔상 λ©”μ†Œλ“œλ₯Ό μ‹€μ œλ‘œ κ΅¬ν˜„
  • μƒμœ„ ν΄λž˜μŠ€μ—μ„œ λ™μž‘ 및 λΌˆλŒ€λ₯Ό κ²°μ •ν•˜κ³ , ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ·Έ ꡬ체적인 λ‚΄μš© κ²°μ •ν•˜λ„λ‘ μ„€κ³„ν•œ νŒ¨ν„΄
  • 같은 λ™μž‘μ„ ν•˜κ±°λ‚˜ 같은 ꡬ쑰λ₯Ό κ°€μ‘Œμ§€λ§Œ 일뢀 μ½”λ“œ(λ‚΄μš©)만 λ‹€λ₯Έ 두 개 μ΄μƒμ˜ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•  λ•Œ 적용 κ°€λŠ₯

ꡐ재 발췌

 

예제 ν”„λ‘œκ·Έλž¨ - JAVA

- AbstractDisplay 클래슀 (AbstractDisplay.java)

  • AbstractClass(좔상 클래슀) μ—­ν• 
public abstract class AbstractDisplay {  // 좔상 클래슀 AbstractDisplay    
  public abstract void open();           // ν•˜μœ„ ν΄λž˜μŠ€μ— κ΅¬ν˜„μ„ λ§‘κΈ°λŠ” 좔상 λ©”μ†Œλ“œ (1) open
  public abstract void print();          // ν•˜μœ„ ν΄λž˜μŠ€μ— κ΅¬ν˜„μ„ λ§‘κΈ°λŠ” 좔상 λ©”μ†Œλ“œ (2) print
  public abstract void close();          // ν•˜μœ„ ν΄λž˜μŠ€μ— κ΅¬ν˜„μ„ λ§‘κΈ°λŠ” 좔상 λ©”μ†Œλ“œ (3) close
  public final void display() {          // 좔상 ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„λ˜κ³  μžˆλŠ” λ©”μ†Œλ“œ display
    open();                              // μš°μ„  openν•˜κ³ …
    for (int i = 0; i < 5; i++) {        // 5번 print을 λ°˜λ³΅ν•˜κ³ …
      print();
    }
    close();     // … λ§ˆμ§€λ§‰μœΌλ‘œ closeν•œλ‹€. 이것이 display λ©”μ†Œλ“œμ—μ„œ κ΅¬ν˜„λ˜κ³  μžˆλŠ” λ‚΄μš©.
  }
}

 

- CharDisplay 클래슀 (CharDisplay.java)

  • ConcreteClass(κ΅¬ν˜„ 클래슀) μ—­ν• 
public class CharDisplay extends AbstractDisplay {  // CharDisplayλŠ” AbstractDisplay의 ν•˜μœ„ 클래슀.
  private char ch;                                  // ν‘œμ‹œν•΄μ•Ό ν•  문자
  public CharDisplay(char ch) {                     // μƒμ„±μžμ—μ„œ μ „λ‹¬λœ 문자 ch을
    this.ch = ch;                                   // ν•„λ“œμ— κΈ°μ–΅ν•΄ λ‘”λ‹€.
  }
  public void open() {                              // μƒμœ„ ν΄λž˜μŠ€μ—μ„œλŠ” 좔상 λ©”μ†Œλ“œμ˜€λ‹€.
                                                    // μ—¬κΈ°μ—μ„œ μ˜€λ²„λΌμ΄λ“œν•΄μ„œ κ΅¬ν˜„.
    System.out.print(“<<”);                         // κ°œμ‹œ λ¬Έμžμ—΄“<<”을 ν‘œμ‹œν•œλ‹€.
  }
  public void print() {                             // print λ©”μ†Œλ“œλ„ μ—¬κΈ°μ—μ„œ κ΅¬ν˜„ν•œλ‹€.
                                                    // 이것이 displayμ—μ„œ λ°˜λ³΅ν•΄μ„œ ν˜ΈμΆœλœλ‹€.
    System.out.print(ch);                           // ν•„λ“œμ— κΈ°μ–΅ν•΄ λ‘” 문자λ₯Ό 1개 ν‘œμ‹œν•œλ‹€.
  }
  public void close() {                             // close λ©”μ†Œλ“œλ„ μ—¬κΈ°μ—μ„œ κ΅¬ν˜„.
    System.out.println(“>>”);                       // μ’…λ£Œ λ¬Έμžμ—΄ “>>”을 ν‘œμ‹œ.
  }
}

 

- StringDisplay 클래슀 (StringDisplay.java)

  • ConcreteClass(κ΅¬ν˜„ 클래슀) μ—­ν• 
public class StringDisplay extends AbstractDisplay {  // StringDisplay도 
                                                      // AbstrctDisplay의 ν•˜μœ„ 클래슀.
  private String string;                              // ν‘œμ‹œν•΄μ•Ό ν•  λ¬Έμžμ—΄.
  private int width;                                  // λ°”μ΄νŠΈ λ‹¨μœ„λ‘œ κ³„μ‚°ν•œ λ¬Έμžμ—΄μ˜ γ€Œν­γ€.
  public StringDisplay(String string) {               // μƒμ„±μžμ—μ„œ μ „λ‹¬λœ λ¬Έμžμ—΄ string을
    this.string = string;                             // ν•„λ“œμ— κΈ°μ–΅.
    this.width = string.getBytes().length;            // 그리고 λ°”μ΄νŠΈ λ‹¨μœ„μ˜ 폭도 ν•„λ“œμ—
                                                      // κΈ°μ–΅ν•΄ 두고 λ‚˜μ€‘μ— μ‚¬μš©ν•œλ‹€.
  }
  public void open() {                         // μ˜€λ²„λΌμ΄λ“œν•΄μ„œ μ •μ˜ν•œ open λ©”μ†Œλ“œ.
    printLine();                               // 이 클래슀의 λ©”μ†Œλ“œ printLineμ—μ„œ
                                               // 선을 그리고 μžˆλ‹€.
  }
  public void print() {                        // print λ©”μ†Œλ“œλŠ”
    System.out.println(“|” + string + “|”);    // ν•„λ“œμ— κΈ°μ–΅ν•΄ λ‘” λ¬Έμžμ—΄μ˜
                                               // 전후에 “|”을 λΆ™μ—¬μ„œ ν‘œμ‹œ.
  }
  public void close() {                        // close λ©”μ†Œλ“œλŠ”
    printLine();                               // open 처럼 printLine λ©”μ†Œλ“œμ—μ„œ
                                               // 선을 그리고 μžˆλ‹€.
  }
  private void printLine() {                   // openκ³Ό closeμ—μ„œ 호좜된 printLine λ©”μ†Œλ“œμ΄λ‹€.
                                               // private이기 λ•Œλ¬Έμ— 이 클래슀 μ•ˆμ—μ„œλ§Œ μ‚¬μš©λœλ‹€.
    System.out.print(γ€Œ+γ€Œ);                   // ν…Œλ‘λ¦¬μ˜ λͺ¨μ„œλ¦¬λ₯Ό ν‘œν˜„ν•˜λŠ””+” 마크λ₯Ό ν‘œμ‹œ.
    for (int i = 0; i < width; i++) {          // width개의 “-“을 ν‘œμ‹œν•˜κ³ 
      System.out.print(γ€Œ-γ€Œ);                 // ν…Œλ‘λ¦¬ μ„ μœΌλ‘œ μ΄μš©ν•œλ‹€.
    }
    System.out.println(γ€Œ+γ€Œ);                 // ν…Œλ‘λ¦¬μ˜ λͺ¨μ„œλ¦¬λ₯Ό ν‘œν˜„ν•˜λŠ” “+” 마크λ₯Ό ν‘œμ‹œ.
  }
}

 

- Main 클래슀 (Main.java)

public class Main {
  public static void main(String[] args) {
    // 'H'을 κ°€μ§„ CharDisplay μΈμŠ€ν„΄μŠ€λ₯Ό 1개 λ§Œλ“ λ‹€>
    AbstractDisplay d1 = new CharDisplay('H');
    // “Hello, world.”을 κ°€μ§„ StringDisplay의 μΈμŠ€ν„΄μŠ€λ₯Ό 1개 λ§Œλ“ λ‹€.
    AbstractDisplay d2 = new StringDisplay(“Hello, world.”);
    // “μ•ˆλ…•ν•˜μ„Έμš”.”λ₯Ό κ°€μ§„ StringDisplay의 μΈμŠ€ν„΄μŠ€λ₯Ό 1개 λ§Œλ“ λ‹€.
    AbstractDisplay d3 = new StringDisplay(“μ•ˆλ…•ν•˜μ„Έμš”.”);
      d1.display();   // d1, d2, d3 λͺ¨λ‘ AbstractDisplay의 ν•˜μœ„ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€μ΄κΈ° λ•Œλ¬Έμ—
      d2.display();   // μƒμ†ν•œ displayλ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.
      d3.display();   // μ‹€μ œ λ™μž‘μ€ CharDisplayλ‚˜ StringDisplayμ—μ„œ κ²°μ •ν•œλ‹€.
  }
}

 

μž₯점과 단점

μž₯점

  • μƒμœ„ 클래슀의 ν…œν”Œλ¦Ώ λ©”μ†Œλ“œμ— μ•Œκ³ λ¦¬μ¦˜μ΄ κΈ°μˆ λ˜μ–΄ μžˆμœΌλ―€λ‘œ, ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ 같은 μ•Œκ³ λ¦¬μ¦˜μ„ 일일이 기술 X
  • ν…œν”Œλ¦Ώ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜μ—¬ 쀑볡 μ½”λ“œ κ°μ†Œ

단점

  • λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙(LSP)λ₯Ό μœ„λ°˜ν•  μœ„ν—˜ 쑴재
  • μ•Œκ³ λ¦¬μ¦˜ ꡬ쑰가 λ³΅μž‘ν• μˆ˜λ‘ ν…œν”Œλ¦Ώμ„ μœ μ§€ν•˜κΈ° 어렀움
    • μ—¬λŸ¬ μœ ν‹Έμ΄ λ“€μ–΄κ°€ λ³΅μž‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ€ ν…œν”Œλ¦Ώ μ½”λ“œλ‘œ μ •μ˜ X 

 

Deep Dive

λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙(LSP)

  • "μƒμœ„ ν΄λž˜μŠ€ν˜•μ˜ λ³€μˆ˜μ— ν•˜μœ„ 클래슀의 μ–΄λ– ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό λŒ€μž…ν•΄λ„ μ œλŒ€λ‘œ μž‘λ™ν•  수 μžˆλ„λ‘ ν•œλ‹€."
  • λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 μœ„λ°°λ₯Ό μ˜ˆλ°©ν•˜κΈ° μœ„ν•΄ μ˜ˆμ œμ—μ„œλŠ” ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ(display)에 final을 λΆ™ν˜€ 상속이 λΆˆκ°€λŠ₯ν•˜λ„λ‘ 함 -> μƒμœ„ 클래슀의 μ˜λ„λ₯Ό λ³€κ²½μ‹œν‚¬ 수 μ—†μŒ

 

728x90

'Computer Science > 🧩 Design Pattern' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[λ””μžμΈνŒ¨ν„΄] Factory Method νŒ¨ν„΄ - ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€ μž‘μ„±ν•˜κΈ°  (0) 2022.09.06
[λ””μžμΈνŒ¨ν„΄] Adapter νŒ¨ν„΄ - λ°”κΏ”μ„œ μž¬μ΄μš©ν•˜κΈ°  (0) 2022.08.18
[λ””μžμΈνŒ¨ν„΄] Iterator νŒ¨ν„΄ - μˆœμ„œλŒ€λ‘œ μ§€μ •ν•΄μ„œ μ²˜λ¦¬ν•˜κΈ°  (0) 2022.08.17
    'Computer Science/🧩 Design Pattern' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ 글이닀
    • [λ””μžμΈνŒ¨ν„΄] Factory Method νŒ¨ν„΄ - ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μΈμŠ€ν„΄μŠ€ μž‘μ„±ν•˜κΈ°
    • [λ””μžμΈνŒ¨ν„΄] Adapter νŒ¨ν„΄ - λ°”κΏ”μ„œ μž¬μ΄μš©ν•˜κΈ°
    • [λ””μžμΈνŒ¨ν„΄] Iterator νŒ¨ν„΄ - μˆœμ„œλŒ€λ‘œ μ§€μ •ν•΄μ„œ μ²˜λ¦¬ν•˜κΈ°
    J1Yun
    J1Yun
    개발 κ΄€λ ¨ 기술 및 곡뢀 λ‚΄μš© 기둝μž₯

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”