๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์ž๊ฒฉ์ฆ/์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ

[์‹ค๊ธฐ] ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์ถ• - ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„

by ๐Ÿณ Laboon 2024. 7. 25.

์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›๋ฆฌ

  • ๋ถ„ํ• ๊ณผ ์ •๋ณต
    • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์€ ์‹œ์Šคํ…œ์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ๊ฐ ๊ฐ์„ ๋งŒ๋“ ๋‹ค.
  • ๋ชจ๋“ˆํ™” (Modulartly)
    • ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๋ถ„๋ฅ˜ -> ์„ฑ๋Šฅ / ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ
    • ๋ชจ๋“ˆ ํฌ๊ธฐ๊ฐ€ ํด ์ˆ˜๋ก ๋งŒ๋“ค ๋ชจ๋“ˆ์˜ ์ˆ˜๋Š” ์ ๋‹ค. ๊ทธ๋Ÿผ ํ†ตํ•ฉํ•  ๋น„์šฉ๋„ ์ ์–ด์ง„๋‹ค. ๋Œ€์‹  ๋ชจ๋“ˆ ํ•˜๋‚˜์˜ ๋น„์šฉ์ด ๋†’์Œ
    • ๋ชจ๋“ˆ ํฌ๊ธฐ๊ฐ€ ์ž‘์„ ์ˆ˜๋ก ๋ชจ๋“ˆ ์ˆ˜๋Š” ๋งŽ์•„์ง€๊ณ  ํ†ตํ•ฉํ•˜๋Š”๋ฐ ๋น„์šฉ์ด๋“ ๋‹ค.
  • ์ถ”์ƒํ™” (Abstraction)
    • ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ƒ๋žต, ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๊ฐ•์กฐ
    • ๋ฌธ์ œ์˜ ํฌ๊ด„์ ์ธ ๊ฐœ๋… ์„ค๊ณ„ -> ์„ธ๋ถ„ํ™” -> ๊ตฌ์ฒดํ™”
    • ๊ณผ์ • ์ถ”์ƒํ™” : ์ „๋ฐ˜์ ์ธ ํ๋ฆ„๋งŒ ํŒŒ์•…๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„
    • ๋ฐ์ดํ„ฐ(์ž๋ฃŒ) ์ถ”์ƒํ™”: ๋ฐ์ดํ„ฐ์˜ ์„ธ๋ถ€์  ์†์„ฑ์ด๋‚˜ ์šฉ๋„๋Š” ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์กฐ๋งŒ ํ‘œํ˜„ํ•œ๋‹ค.
      • private ์œผ๋กœ ์™ธ๋ถ€์—์„œ๋Š” ์ด ์ •๋ณด๋ฅผ ๋ชจ๋ฅด๊ณ  ์ƒ์„ฑ์ž๋กœ ์ •๋ณด์˜ ๊ตฌ์กฐ๋งŒ ์•Œ๋ ค์ฃผ๊ณ  ์บก์Аํ™”๋กœ ์ •๋ณด๋ฅผ ์–ป๋Š”๋‹ค.
    • ์ œ์–ด ์ถ”์ƒํ™”: ์ด๋ฒคํŠธ ๋ฐœ์ƒ์˜ ์ •ํ™•ํ•œ ์ ˆ์ฐจ๋‚˜ ๋ฐฉ๋ฒ•์€ ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€ํ‘œ ๊ฐ€๋Šฅํ•œ ํ‘œํ˜„์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
// ๊ณผ์ • ์ถ”์ƒํ™”
abstract class CoffeeShop {
    void processOrder(CoffeeOrder order) {
        takeOrder(order);
        prepareCoffee(order);
        serveCoffee(order);
    }

    abstract void takeOrder(CoffeeOrder order);
    abstract void prepareCoffee(CoffeeOrder order);
    abstract void serveCoffee(CoffeeOrder order);
}

// ๋ฐ์ดํ„ฐ ์ถ”์ƒํ™”
class CoffeeOrder {
    private String customerName;
    private String coffeeType;
    private int quantity;

    public CoffeeOrder(String customerName, String coffeeType, int quantity) {
        this.customerName = customerName;
        this.coffeeType = coffeeType;
        this.quantity = quantity;
    }

    public String getCustomerName() {
        return customerName;
    }

    public String getCoffeeType() {
        return coffeeType;
    }

    public int getQuantity() {
        return quantity;
    }
}

// ์ œ์–ด ์ถ”์ƒํ™”
interface Button {
    void onClick();
}
  • ๋‹จ๊ณ„์  ๋ถ„ํ•ด (Stepwise refinement)
    • ํ•˜ํ–ฅ์‹ ์„ค๊ณ„ ์ „๋žต์œผ๋กœ ์ถ”์ƒํ™”๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์„ธ๋ถ„ํ™”
  • ์ •๋ณด ์€๋‹‰ (Information Hiding)
    • ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ์ ‘๊ทผ/ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
    • ๋ชจ๋“ˆ์ด ๋…๋ฆฝ์ ์ด๋ผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ˆ˜์ •/ํ…Œ์ŠคํŠธ/์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด

UML (Unified Modeling Language)

  • ๊ณ ๊ฐ/๊ฐœ๋ฐœ์ž ๊ฐ„ ์›Œ๋†œํ•œ ์†Œํ†ต์„ ์œ„ํ•ด ํ‘œ์ค€ํ™”๋œ ๋Œ€ํ‘œ์  ๊ฐ์ฒด์ง€ํ–ฅ ๋ชจ๋ธ๋ง ์–ธ์–ด
  • Rumbaugh, Booch, Jacobson ๋“ฑ ๊ฐ์ฒด์ง€ํ–ฅ ๋ฐฉ๋ฒ•๋ก ์˜ ์žฅ์ ์„ ํ†ตํ•ฉํ•จ.
  • ์‚ฌ๋ฌผ (Things)
    • ๊ตฌ์กฐ (๊ฐœ๋…, ๋ฌผ๋ฆฌ์  ์š”์†Œ), ํ–‰๋™, ๊ทธ๋ฃน, ์ฃผํ•ด(๋ถ€๊ฐ€์  ์„ค๋ช…, ์ œ์•ฝ์กฐ๊ฑด)
  • ๊ด€๊ณ„ (Relationship)
    • ์—ฐ๊ด€ ๊ด€๊ณ„ (Association)
      • 2๊ฐœ ์ด์ƒ์˜ ์‚ฌ๋ฌผ์ด ์„œ๋กœ ์—ฐ๊ด€ ๋œ ๊ฒฝ์šฐ, ์–‘๋ฐฉํ–ฅ or ๋‹จ๋ฐฉ
      • ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
      • private void setOtherclass(OtherClass other) { this.other = other; }
    • ์ง‘ํ•ฉ ๊ด€๊ณ„ (aggregation)
      • ํ•˜๋‚˜์˜ ์‚ฌ๋ฌผ์ด ๋‹ค๋ฅธ ์‚ฌ๋ฌผ์— ํฌํ•จ๋œ ๊ฒฝ์šฐ (์ „์ฒด-๋ถ€๋ถ„ ๊ด€๊ณ„)
      • ์ฆ‰, ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๊ผญ ์žˆ์–ด์•ผ ์™„์„ฑ ๋˜๋Š” ๊ฒฝ์šฐ
      • private OtherClass other = other;
    • ํฌํ•จ ๊ด€๊ณ„ (Composition)
      • ์ง‘ํ•ฉ ๊ด€๊ณ„ ๋‚ด ํ•œ ์‚ฌ๋ฌผ์˜ ๋ณ€ํ™”๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋ฌผ์—๊ฒŒ ์˜ํ–ฅ
      • ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์žˆ์–ด์•ผ ์™„์„ฑ๋˜์ง€๋งŒ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๋‚˜์—๊ฒŒ ์ข…์†๋œ ๊ฒฝ์šฐ
      • ๋‚ด๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋„ ์‚ฌ๋ผ์ง.
      • private OtherClass other = new OtherClass();
    • ์ผ๋ฐ˜ํ™” ๊ด€๊ณ„ (Generalization)
      • ๋‹ค๋ฅธ ์‚ฌ๋ฌผ์— ๋น„ํ•ด ์ผ๋ฐ˜์ ์ธ์ง€ ๊ตฌ์ฒด์ ์ธ์ง€ ํ‘œํ˜„
      • ์ƒ์† ๊ฐœ๋… extends
      • Child extends Parent
    • ์˜์กด ๊ด€๊ณ„ (Dependency)
      • ์‚ฌ๋ฌผ ๊ฐ„ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ด€๊ณ„
      • ํ•œ ํด๋ž˜์Šค์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ
      • public print(OtherPrint print) { print.print(); }
    • ์‹ค์ฒดํ™” ๊ด€๊ณ„ (Realization)
      • ํ•œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—๊ฒŒ ์˜คํผ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ง€์ •
      • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„
      • implements OtherClass
  • ๋‹ค์ด์–ด๊ทธ๋žจ (Diagram)
    • ๊ตฌ์กฐ, ์ •์  ๋‹ค์ด์–ด ๊ทธ๋žจ
      • ํด๋ž˜์Šค : ํด๋ž˜์Šค ๊ฐ„ ๊ด€๊ณ„, ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜ ์ž๋ฃŒํ˜•, ๋ณ€์ˆ˜๋ช… ์ •๋ณด
      • ๊ฐ์ฒด : ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ์ฒด, ๊ฐ์ฒด์˜ ๊ฐ’ ์ •๋ณด
      • ์ปดํฌ๋„ŒํŠธ : ๊ตฌํ˜„ ๋ชจ๋“ˆ ๊ฐ„ ๊ด€๊ณ„
      • ๋ฐฐ์น˜ : ๋ฌผ๋ฆฌ์  ์š”์†Œ์˜ ์œ„์น˜/๊ตฌ์กฐ ํ‘œํ˜„ Server ์—์„œ ์–ด๋–ค ์ •๋ณด๊ฐ€ Client์—๊ฒŒ ์–ด๋–ค ์ •๋ณด๋กœ
      • ๋ณตํ•ฉ์ฒด ๊ตฌ์กฐ : ํด๋ž˜์Šค์™€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ณตํ•ฉ์ฒด ๋‚ด๋ถ€ ํ‘œํ˜„
      • ํŒจํ‚ค์ง€ : ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜€
    • ํ–‰์œ„, ๋™์  ๋‹ค์ด์–ด๊ทธ๋žจ
      • ์œ ์Šค์ผ€์ด์Šค : ์‚ฌ์šฉ์ž + Use Case
      • ์‹œํ€€์Šค : ์‹œ์Šคํ…œ๊ณผ ๊ฐ์ฒด๊ฐ€ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฉ”์‹œ์ง€ ํ‘œํ˜„
      • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜: ๊ฐ์ฒด๋“ค ๊ฐ„ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฉ”์‹œ์ง€์™€ ์—ฐ๊ด€๊ด€๊ณ„
      • ์ƒํƒœ: ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์ƒํ˜ธ์ž‘์šฉ์— ๋”ฐ๋ฅธ ์ƒํƒœ ๋ณ€ํ™”
      • ํ™œ๋™ : ๊ฐ์ฒด์˜ ์ฒ˜๋ฆฌ ๋กœ์ง, ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ์˜ ํ๋ฆ„ ์ˆœ์„œ์— ๋”ฐ๋ผ ํ‘œํ˜„
      • ํƒ€์ด๋ฐ: ๊ฐ์ฒด ์ƒํƒœ ๋ณ€ํ™”, ์‹œ๊ฐ„ ์ œ์•ฝ์„ ํ‘œํ˜„
      • ์ƒํ˜ธ์ž‘์šฉ ๊ฐœ์š” : ์ƒํ˜ธ์ž‘์šฉ ๋‹ค์ด์–ด๊ทธ๋žจ ๊ฐ„ ์ œ์–ด ํ๋ฆ„ ํ‘œํ˜„

  • UI ์„ค๊ณ„ (User Interface)
    • ์ง๊ด€์„ฑ, ์œ ํšจ์„ฑ, ํ•™์Šต์„ฑ, ์œ ์—ฐ์„ฑ
    • CLI(command line), GUI(graphic), NUI(natural), VUI(voice), OUI(organic)
    • Wireframe : ๊ธฐํš ์ดˆ ๋Œ€๋žต์ ์ธ ๋ ˆ์ด์•„์›ƒ ์„ค๊ณ„
    • Story Board: ์ตœ์ข…์  ์‚ฐ์ถœ ๋ฌธ์„œ (์™€์ด์–ดํ”„๋ ˆ์ž„ UI, ํ”„๋กœ์„ธ์Šค)
    • Prototype : ์™€์ด์–ดํ”„๋ ˆ์ž„ / ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ์ธํ„ฐ๋ ‰์…˜(๋™์  ํšจ๊ณผ) ์ ์šฉ
    • Mockup : ์‹ค์ œ ํ™”๋ฉด๊ณผ ์œ ์‚ฌํ•œ ์ •์ ์ธ ํ˜•ํƒœ ๋ชจํ˜•
    • Use case : ์‚ฌ์šฉ์ž ์ธก๋ฉด ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ๋ชฉํ‘œ๋ฅผ ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„