OOPDesign

๐Ÿ“Œ Unified Modeling Language, ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์„ ์‹œ๊ฐํ™”ํ•˜๊ณ  ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ด€๊ณ„, ํŠน์ง•, ๋™์ž‘์„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•

์ˆœ์„œ

  1. ๋ช…์‚ฌ ์ค‘ ์ผ๋ถ€๋ฅผ Class๋กœ ๋ฝ‘์•„๋‚ด๊ธฐ
    • ์ถ”๊ฐ€์ ์ธ ํŠน์„ฑ์„ ๊ฐ€์ง€์ง€ ์•Š๊ฑฐ๋‚˜, ๊ด€๊ณ„์˜ Role์„ ๋ช…์‹œํ•œ ๊ฒƒ ์ œ์™ธ
  2. ๋‚จ์€ ๋ช…์‚ฌ, ํ˜•์šฉ์‚ฌ๋ฅผ Attribute๋กœ ๋„ฃ์–ด์ฃผ๊ธฐ
  3. ๋™์‚ฌ๋Š” Operation์œผ๋กœ ๋„ฃ์–ด์ฃผ๊ธฐ
  4. ์ œ์•ฝ ์‚ฌํ•ญ์„ ํ†ตํ•ด Class ๊ฐ„ Relationship ์—ฐ๊ฒฐ

๋ฌธ๋ฒ•

Class Diagram

  • Name: PascalCase
  • Attribute: [ + | - | # ] ํ•„๋“œ๋ช…: ํƒ€์ž…
    • Access Modifier: + (Public), - (Private), # (Protected)
  • OP: [ + | - | # ] ๋ฉ”์†Œ๋“œ๋ช…(ํŒŒ๋ผ๋ฏธํ„ฐ1: ํƒ€์ž…1, ...): ๋ฆฌํ„ดํƒ€์ž…
  • Static (Class variable/OP): ๋ฐ‘์ค„
  • Abstract Class (์ถ”์ƒ ํด๋ž˜์Šค)
    • Class: ํด๋ž˜์Šค๋ช… ์œ„์— <<abstract>> Stereotype, ๊ธฐ์šธ์ž„์ฒด, ํด๋ž˜์Šค๋ช… ์œ„/์•„๋ž˜์— { abstract } Property
    • OP: ๋ฆฌํ„ด ํƒ€์ž… ๋’ค์— { abstract }, ๊ธฐ์šธ์ž„์ฒด
  • Interface
    ๐Ÿ“Œ Public Abstract OPs์˜ ๋ชจ์ž„์— ์ด๋ฆ„์„ ๋ถ™์ธ ๊ฒƒ
    1. Provided Interface: ๋ˆ„๊ตฐ๊ฐ€์— ์˜ํ•ด ๊ตฌํ˜„์„ ์ œ๊ณต๋ฐ›๋Š” Interface

      ๐Ÿ”Ž Observer
      • Ball (Lollipop) Symbol
      • ์ธํ„ฐํŽ˜์ด์Šค๋ช… ์œ„์— <<interface>> Stereotype
        • ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ Implements Arrow๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Œ (๐Ÿ”Ž TimerObserver)
    2. Required Interface: Provided Interface์— ๋Œ€ํ•œ Dependency๋ฅผ ๊ฐ–๋Š”, ์ฆ‰ ์ •์ƒ ๋™์ž‘์„ ์œ„ํ•ด์„œ๋Š” Provided Interface์˜ ๊ตฌํ˜„์ด ์š”๊ตฌ๋˜๋Š” Class

      ๐Ÿ”Ž Timer
      • Socket Symbol
      • Provided Interface (Ball Symbol, <<interface>> Stereotype์ด ๋ถ™์€ ์ธํ„ฐํŽ˜์ด์Šค) ์— ๋Œ€ํ•œ Dependency Arrow

Object Diagram

  • ์ด๋ฆ„์— ๋ฐ‘์ค„ ์žˆ์„ ๊ฒฝ์šฐ, ํด๋ž˜์Šค๋ช…์ด ์•„๋‹Œ ๊ฐ์ฒด๋ช… = โญํŠน์ • ์ˆœ๊ฐ„์˜ Snapshot
    • ํƒ€์ž…์ด ์•„๋‹Œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋จ
  • Name: camelCase
    โ†” Class Diagram, PascalCase
    • ํด๋ž˜์Šค๋ช…์„ ๋ช…์‹œํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ objectName:ClassName
    • ๊ฐ์ฒด๋ช…์„ ์ƒ๋žตํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ (= ๋ฌด๋ช… ๊ฐ์ฒด) :ClassName
  • Attribute: ํ•„๋“œ๋ช… = ๊ฐ’
    โ†” Class Diagram, [ + | - | # ] ํ•„๋“œ๋ช…: ํƒ€์ž…

Relationship (์—ฐ๊ด€์„ฑ)

๐Ÿ“Œ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ฐ์ฒด(ํด๋ž˜์Šค)๊ฐ€ ์ƒํ˜ธ ์ฐธ์กฐํ•˜๋Š” ๊ด€๊ณ„

  • โญ ํ™”์‚ดํ‘œ Tail(= Source) ์ชฝ์—์„œ Head(= Target)์˜ ์ •๋ณด ์•Œ ์ˆ˜ ์žˆ์Œ
    = Source๊ฐ€ Target์˜ ์ •๋ณด๋ฅผ ์•Œ๊ณ  ์žˆ์Œ
    = Target์ด Source์—๊ฒŒ ์ •๋ณด๋ฅผ ์คŒ
Default
๐Ÿ”ฝDependencyAssociation(Shared) AggregationComposition (ํ•ฉ์„ฑ)Realization
(Implementation)
Inheritance (์ƒ์†)
(Generalization, Specification)
๐Ÿ”ผ
โ‡-<โ€•โ€•์ „์ฒด โ—‡- ๋ถ€๋ถ„์ „์ฒด โ—†- ๋ถ€๋ถ„์ธํ„ฐํŽ˜์ด์Šค โ—--- ๊ตฌํ˜„๋ถ€๋ชจ โ—โ€•โ€• ์ž์‹
์˜์กด์—ฐ๊ด€์ง‘ํ•ฉํ•ฉ์„ฑ, ํฌํ•จ์‹ค์ฒดํ™”์ผ๋ฐ˜ํ™”, ํŠน์ˆ˜ํ™”
ํ˜‘์—… ์‹œ๊ฐ„์งง์Œ (์ผ์‹œ์  Binding)์ง€์†์ง€์†์ง€์†์˜์›์˜์›
๊ตฌํ˜„ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ด ํƒ€์ž… (๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ)๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฉค๋ฒ„ ๋ณ€์ˆ˜
๊ฒฐ์ • ์‹œ์ ๋Ÿฐํƒ€์ž„๋Ÿฐํƒ€์ž„๋Ÿฐํƒ€์ž„๋Ÿฐํƒ€์ž„์ปดํŒŒ์ผ ํƒ€์ž„์ปดํŒŒ์ผ ํƒ€์ž„
๊ด€๊ณ„๋Œ€๋“ฑ, ๋…๋ฆฝIS-MEMBER-OF,
๋Œ€๋“ฑ, ๋…๋ฆฝ
IS-PART-OF, ๋…๋ฆฝHAS-A, ์˜์กดIS-A,
์˜์กด

Dependency (์˜์กด)

๐Ÿ“Œ ํ•œ Class์˜ ์•ˆ์—์„œ ๋‹ค๋ฅธ Class๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ด ํƒ€์ž…, ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๋“ฑ์œผ๋กœ ์ž ๊น Binding๋˜์–ด ์“ฐ์ด๋Š” ๊ด€๊ณ„

  • โ‡-
    • (๋ณดํ†ต ์ƒ๋žต) <<use>> Stereotype

Association (์—ฐ๊ด€)

๐Ÿ“Œ ํ•œ Class๊ฐ€ ๋‹ค๋ฅธ Class์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ๊ฐ–๋Š” ๊ด€๊ณ„

  • ์‹ค์„  < ํ™”์‚ดํ‘œ
    1. Navigability: [ < | > | X | ], ์ƒ๋Œ€ Instance์— ๋Œ€ํ•œ ์ฐธ์กฐ ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€, Tail์—์„œ Head์˜ ์ •๋ณด ์ ‘๊ทผ ๊ฐ€๋Šฅ
      • ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด Visibleํ•œ ๋ฉค๋ฒ„์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
      • ์–‘์ชฝ ํ™”์‚ดํ‘œ ๋ช…์‹œํ•˜์ง€ ์•Š์€ ๊ฒƒ๋„ ์ •๋ณด (= ์ •๋ณด ์—†์Œ์„ ์˜๋„์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ), but ๊ด€ํ–‰์ ์œผ๋กœ๋Š” ์–‘๋ฐฉํ–ฅ ํ™”์‚ดํ‘œ์™€ ๋™์ผ
        โ†” ํ•œ์ชฝ ํ™”์‚ดํ‘œ๋งŒ ์กด์žฌ, ๊ด€ํ–‰์ ์œผ๋กœ ์—†๋Š” ์ชฝ์€ X๋กœ ํ•ด์„
      • ์ƒ์„ธ ์„ค๊ณ„๋ผ๋ฉด ๊ฐ€๋Šฅํ•œ ์ •ํ™•ํ•œ ์ •๋ณด ์ฃผ์—ˆ์„ ๊ฒƒ (์ฆ‰, ์™„์„ฑ๋˜์ง€ ์•Š์•˜์„ ํ™•๋ฅ  ๋†’์Œ), ๋ถ„์„ ๋‹จ๊ณ„์—์„œ๋Š” Association ์œ ๋ฌด๋งŒ ๊ณ ๋ คํ•ด๋„ ๋จ
    2. Association Name: ๋™์‚ฌ, ๊ด€๊ณ„๊ฐ€ ์ƒ๊ธด ์ด์œ (์กด์žฌ/ํ–‰๋™)
      • Reading Direction: [ โ—€ | โ–ถ | ], ํ•ด์„ ๋ฐฉํ–ฅ, ์‹œ์ž‘ ๋ฐฉํ–ฅ์ด ์ฃผ์–ด
    3. Multiplicity: [ n | n..m | n, m, ... | ], ํŠน์ • Snapshot์—์„œ ๋ฐ˜๋Œ€ํŽธ์˜ Instance ํ•œ ๊ฐœ์— ๋Œ€์‘๋˜๋Š” Instance๊ฐ€ ๋™์‹œ์— ์ตœ๋Œ€ ๋ช‡ ๊ฐœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š”์ง€
    4. Role: ๋ช…์‚ฌ, ํ•ด๋‹น Class/Object๊ฐ€ ์–ด๋– ํ•œ ์ž๊ฒฉ์œผ๋กœ ํ•ด๋‹น Relationship์— ์ž„ํ•˜๋Š”์ง€
      = ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„
      • Access Modifier: [ + | - | # | ]
      • Unary Association์—์„œ๋Š” ํ•„์ˆ˜ (ํŠนํžˆ, 1:ๅคš์ผ ๋•Œ)
        • Class Diagram๋งŒ์œผ๋กœ๋Š” ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ ๋ถˆ๊ฐ€, ์ฃผ์„ ํ•„์š” (๐Ÿ”Ž ์ž์‹ ๊ณผ์˜ ๊ฒฐํ˜ผ๋„ ํ—ˆ์šฉ๋จ)

Association Class

๐Ÿ“Œ Association์— Attribute๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•

  • ๅคš:ๅคš ๊ด€๊ณ„์ผ ๋•Œ ํ•„์ˆ˜, ์•„๋‹ ๋•Œ๋Š” ๊ทธ๋ƒฅ ๅคš์ชฝ์— Attribute ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋จ
  • Association ์‹ค์„ ์— ์ ์„ ์œผ๋กœ ์—ฐ๊ฒฐ
  • Default = Link/Relationship ์ค‘๋ณต ๋ถˆ๊ฐ€
    = ํ•œ ์กฐํ•ฉ์€ ํ•˜๋‚˜์˜ Link/Relationship๋งŒ ์ƒ์„ฑ
    โ†” ์ค‘๋ณต ํ—ˆ์šฉ: { non-unique } Property

Qualified Association

๐Ÿ“Œ ๅคš์ชฝ์˜ ์†์„ฑ ์ค‘, ๅคš์ชฝ์˜ Object๋ฅผ ๋‹จ ํ•˜๋‚˜๋กœ ํ•œ์ •์ง€์„ ์ˆ˜ ์žˆ๋Š” Qualifier๋ฅผ ๋ฐ˜๋Œ€์ชฝ์— ๋ช…์‹œํ•˜๋Š” ๊ฒƒ

  • Qualifier (ํ•œ์ •์‚ฌ): ๅคš์ชฝ์˜ Uniqueํ•œ Attribute ์ค‘ ํ•˜๋‚˜, ๊ฐ Instance ์ง€์นญ ๊ฐ€๋Šฅ
  • โค๏ธ ๋ถ€๊ฐ€ ์ •๋ณด ์ œ๊ณต

(Shared) Aggregation (์ง‘ํ•ฉ)

๐Ÿ“Œ Association์˜ ์ผ์ข…, IS-PART-OF Relationship์„ ๊ฐ€์ง€๋Š” ํŠน์ˆ˜ ๊ฒฝ์šฐ

  • ์ „์ฒด โ—‡- ๋ถ€๋ถ„ (Hollow Diamond)

IS-PART-OF Relationship

๐Ÿ“Œ ๋ถ€๋ถ„์ด ์ „์ฒด์— ๋…๋ฆฝ์ ์ธ ๊ด€๊ณ„, ํ•œ ์ชฝ์˜ ๋ถ€ํ’ˆ ๊ด€๊ณ„
= ์ „์ฒด๊ฐ€ ์—†์–ด์ง€๋”๋ผ๋„, ๋ถ€๋ถ„์ด ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ ๊ฐ€๋Šฅ

  • ํ•œ ๋ถ€๋ถ„์ด 0..*๊ฐœ์˜ ์ „์ฒด์— ์†ํ•  ์ˆ˜ ์žˆ์Œ
    โ†” Composition (ํ•ฉ์„ฑ, ํฌํ•จ), 0..1
  • ๐Ÿ”Ž ์ „๊ณต(์ „์ฒด) โ—‡- ๊ณผ๋ชฉ(๋ถ€๋ถ„), ์ˆ˜์—… โ—‡- ํ•™์ƒ, ์ปดํ“จํ„ฐ โ—‡- ํ‚ค๋ณด๋“œ, ๋ชจ๋‹ˆํ„ฐ, ํ”„๋ฆฐํ„ฐโ€ฆ
    • ์ „๊ณต์ด ์—†์–ด์ง€๋”๋ผ๋„ ๊ณผ๋ชฉ ๋‚จ์•„์žˆ์„ ์ˆ˜๋„
    • ์ˆ˜์—… ์—†์–ด์ง„๋‹ค๊ณ  ํ•™์ƒ์ด ๋ง‰ ์‚ฌ๋ผ์ง€์ง€๋Š” ์•Š์Œ
    • ์ปดํ“จํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค๊ณ  ํ•ด๋„, ํ‚ค๋ณด๋“œ๋‚˜ ๋ชจ๋‹ˆํ„ฐ, ํ”„๋ฆฐํ„ฐ๋Š” ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์—์„œ๋„ ์‚ฌ์šฉ ๋ฐ ๊ณต์œ  ๊ฐ€๋Šฅ
  1. Transitive (์ดํ–‰์ ): B is-part-of A && C is-part-of B โ‡’ C is-part-of A
  2. Asymmetric: B is-part-of A && A is-part-of B๋Š” ํ•ญ์ƒ False
    = ๋™์‹œ์— ์„œ๋กœ์˜ PART๊ฐ€ ๋  ์ˆ˜๋Š” ์—†์Œ
    โžก Directed Acyclic Graph, Deque

Composition (ํ•ฉ์„ฑ, ํฌํ•จ)

๐Ÿ“Œ Aggregation ์ค‘, HAS-A Relationship์„ ๊ฐ€์ง€๋Š” ๊ด€๊ณ„
= Composition (ํ•ฉ์„ฑ)

  • ์ „์ฒด โ—†- ๋ถ€๋ถ„ (Solid Diamond)

HAS-A Relationship

= HAS-A Relationship
๐Ÿ“Œ ๋ถ€๋ถ„์ด ์ „์ฒด์— ์˜์กดํ•˜๋Š” ๊ด€๊ณ„
= ๋ถ€๋ถ„์˜ ์ˆ˜๋ช…์ด ์ „์ฒด์— ์˜์กด

  • โญ ํ•œ ๋ถ€๋ถ„์€ ๋ฌด์กฐ๊ฑด 0..1๊ฐœ์˜ ์ „์ฒด์— ์†ํ•จ
    • Aggregation์—์„œ ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€๋จ, ๋” ๊ฐ•ํ•œ ๊ฒฐํ•ฉ
  • ๐Ÿ”Ž ๊ฑด๋ฌผ โ—†- ๊ฐ•์˜์‹ค โ—†- ๋น” ํ”„๋กœ์ ํ„ฐ, ๋‚˜๋ฌด โ—†- ๋‚˜๋ญ‡๊ฐ€์ง€, ์ž๋™์ฐจ โ—†- ํƒ€์ด์–ด
    • ๊ฑด๋ฌผ์„ ๋ถ€์ˆ˜๋ฉด ๋‹น์—ฐํžˆ ๊ฐ•์˜์‹ค๋„ ์‚ฌ๋ผ์งˆ ๊ฒƒ
    • ๋‚˜๋ฌด๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ๋‚˜๋ญ‡๊ฐ€์ง€๋Š” ์‚ฌ๋ผ์ง
    • ์ž๋™์ฐจ์™€ ํƒ€์ด์–ด ๊ฐ„์˜ ๋ชจ๋ธ๋ง
      • ์ด๋Š” Aggregation์œผ๋กœ๋„ ๋ชจ๋ธ๋ง ๊ฐ€๋Šฅ, ์˜๋„/๊ฐ•์ œํ•˜๊ณ  ์‹ถ์€ ์ƒํ™ฉ ์‚ดํŽด๋ณด๊ณ  ์„ ํƒ
  1. ๋ถ€๋ถ„์ด ์ „์ฒด์˜ Lifetime์— ์˜์กด โžก ์ „์ฒด๊ฐ€ ์†Œ๋ฉธํ•˜๋ฉด ๋ถ€๋ถ„๋„ ์†Œ๋ฉธ
    โ†” Aggregation, ๋ถ€๋ถ„์€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌ ๊ฐ€๋Šฅ, ์ „์ฒด์™€ ๋ณ„๊ฐœ์˜ Lifetime ๊ฐ€์ง
  2. ํ•œ ๋ถ€๋ถ„์€ 0..1๊ฐœ์˜ ์ „์ฒด์— ์†ํ•ด์•ผ ํ•จ
    โ†” Aggregation, ํ•œ ๋ถ€๋ถ„์ด ์—ฌ๋Ÿฌ ์ „์ฒด์— ๋™์‹œ์— ์†ํ•  ์ˆ˜ ์žˆ์Œ

Realization (์‹ค์ฒดํ™”)

= Implementation

  • ์ธํ„ฐํŽ˜์ด์Šค โ—--- ๊ตฌํ˜„

Generalization (์ผ๋ฐ˜ํ™”)

= Inheritance (์ƒ์†)
= Generalization

  • ๋ถ€๋ชจ โ—โ€•โ€• ์ž์‹
  • ๋‹ค์ค‘ ์ƒ์† ํ—ˆ์šฉ