A A
[Design Pattern] Unified Modeling Language (UML)

What is UML?

UML(Unified Modeling Language, 톡합 λͺ¨λΈλ§ μ–Έμ–΄)λŠ” μ‹œμŠ€ν…œμ˜ ꡬ쑰와 λ™μž‘μ„ μ‹œκ°ν™”ν•˜κ³ , 사양(specification)을 λ¬Έμ„œν™”ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν‘œμ€€ν™”λœ λͺ¨λΈλ§ μ–Έμ–΄μž…λ‹ˆλ‹€.
  • μ‹œμŠ€ν…œμ„ μ‹œκ°ν™” ν•˜κ±°λ‚˜ μ‹œμŠ€ν…œμ˜ 사양, 섀계λ₯Ό λ¬Έμ„œν™” ν•˜κΈ° μœ„ν•œ ν‘œν˜„ λ°©λ²•μž…λ‹ˆλ‹€.
  • 톡합 λͺ¨λΈλ§ μ–Έμ–΄λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ†Œν”„νŠΈμ›¨μ–΄ 집얍 μ‹œμŠ€ν…œμ„ κ°œλ°œν•  λ•Œ μ‚°μΆœλ¬Όμ„ λͺ…μ„Έν™”, μ‹œκ°ν™”, λ¬Έμ„œν™”ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.
  • 일반적으둜 UML의 λ²”μœ„λŠ” 맀우 λ„“μ§€λ§Œ, μ—¬κΈ°μ„œλŠ” 클래슀 λ‹€μ΄μ–΄κ·Έλž¨ 및 μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨μ— λŒ€ν•΄μ„œλ§Œ μ„€λͺ…ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.
  • Code Pattern듀을 ν‘œν˜„ν•  λ•Œλ„ μœ μš©ν•©λ‹ˆλ‹€.

UML μ˜ˆμ‹œ μž…λ‹ˆλ‹€.


Class Diagram: ν΄λž˜μŠ€μ™€ 계측 관계

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ€ μ‹œμŠ€ν…œμ˜ 정적 ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚΄λŠ” UML ꡬ쑰 λ‹€μ΄μ–΄κ·Έλž¨ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€
이 λ‹€μ΄μ–΄κ·Έλž¨μ€ μ‹œμŠ€ν…œμ„ κ΅¬μ„±ν•˜λŠ” ν΄λž˜μŠ€λ“€ μ‚¬μ΄μ˜ 관계λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€
  • 각 ν΄λž˜μŠ€λŠ” 속성(attributes)κ³Ό λ©”μ†Œλ“œ(methods)λ₯Ό 가지며, 클래슀 κ°„μ—λŠ” 상속, μ—°κ΄€, 집합, 의쑴 λ“± λ‹€μ–‘ν•œ 관계가 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
from abc import *

class ParentClass(metaclass=ABCMeta):

	field1 = 0
    field2 = 0

    @abstractmethod
    def methodA(self):
        pass
    
    def methodB(self):
        pass

class ChildClass(ParentClass):

    def methodA(self):
        print("methodA is implemented", field1)

    def methodB(self):
        print("methodC is defined")

  • abstract 클래슀, Method등은 μ΄νƒ€λ¦­μ²΄λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.
  • ν΄λž˜μŠ€κ°„ ν™”μ‚΄ν‘œμ˜ λ°©ν–₯은 ν•˜μœ„ν΄λž˜μŠ€μ—μ„œ μƒμœ„ν΄λž˜μŠ€λ‘œ μ—°κ²°λ©λ‹ˆλ‹€.

Class Diagram: κ΅¬ν˜„ 관계

from abc import *

class Printable(metaclass=ABCMeta):

    @abstractmethod
    def show(self):
        pass
    
    @abstractmethod
    def newpage(self):
        pass

class PrintClass(Printable):

    def show(self):
        print("show implemented")

    def newPage(self):
        print("newPage implemented")

pc = PrintClass
pc.show()

κ΅¬ν˜„ 클래슀 관계


Class Diagram: 집약(aggregation)

class Color():
    def __init__(self):
        self.r = 0
        self.g = 0
        self.b = 0

class Fruit():
    def __init__(self):
        self.color = Color()

class Basket():
    def __init__(self):
        self.fruits = []

        for i in range(10):
            self.fruits.append(Fruit())

Class Diagram: 집약(aggregation)


Class의 관계

  • 클래슀의 관계λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ κ΄€λ ¨λœ 이름에 > ν‘œμ‹œλ₯Ό λΆ™μ—¬μ€λ‹ˆλ‹€.

  • 이 κ²½μš°λŠ” Clientκ°€ Target을 Use(μ‚¬μš©)ν•©λ‹ˆλ‹€.

  • 이 κ²½μš°λŠ” Factoryκ°€ Productλ₯Ό Create(생성)ν•©λ‹ˆλ‹€.

  • Subjectκ°€ Observerμ—κ²Œ Notifies(톡지)ν•©λ‹ˆλ‹€.

Sequence Diagram (μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨)

μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨μ€ UML의 μƒν˜Έμž‘μš© λ‹€μ΄μ–΄κ·Έλž¨ 쀑 ν•˜λ‚˜λ‘œ, 객체 κ°„μ˜ μƒν˜Έμž‘μš©κ³Ό μ΄λŸ¬ν•œ μƒν˜Έμž‘μš©μ΄ μ‹œκ°„ μˆœμ„œμ— 따라 μ–΄λ–»κ²Œ λ°œμƒν•˜λŠ”μ§€λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨(Sequence Diagram)은 ν”„λ‘œκ·Έλž¨μ΄ μž‘λ™ν•  λ•Œ μ–΄λ–€ λ©”μ†Œλ“œκ°€ μ–΄λ–€ μˆœμ„œλ‘œ μ‹€ν–‰λ˜λŠ”κ°€, μ–΄λ–€ 좔상 ν΄λž˜μŠ€κ°€ μ–΄λ–€ μˆœμ„œλ‘œ μ‹€ν–‰λ˜λŠ”κ°€λ₯Ό ν‘œν˜„ν•©λ‹ˆλ‹€.
  • 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ€ ‘μ‹œκ°„μ— μ˜ν•΄ λ³€ν•˜μ§€ μ•ŠλŠ”κ²ƒ (정적)’을 λ‚˜νƒ€λ‚΄λ©°, μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨μ€ ‘μ‹œκ°„μ— 따라 λ³€ν•˜λŠ”κ²ƒ(동적)’ 을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • → λ©”μ†Œλ“œ 호좜, ← λ©”μ†Œλ“œ λ°˜ν™˜
class Device():

    def write(self):
        print("write")

class Server():

    def _init_(self):
        self.device = Device()
    
    def open(self):
        pass
    
    def print(self):
        self.device.write()
    
    def close(self):
        pass

class Client():

    def _init_(self):
        self.server = Server()
    
    def operation(self):
        self.server.open()
        self.server.print()
        self.server.close()

c = Client()
c.work()

Sequence Diagram