Programming

코드로 클래스 다이어그램 그리기

느리게 걷는 즐거움 2024. 12. 28. 15:16
반응형

 

클래스 다이어그램을 사용하는 이유

 

클래스 다이어그램(Class Diagram)은 객체 지향 시스템의 구조를 시각적으로 표현하는 UML 다이어그램입니다. 시스템의 클래스, 속성, 메서드, 그리고 클래스 간의 관계를 나타내어 설계 및 구현 과정에서 큰 도움을 줍니다.

주요 이유:

  1. 시스템 구조의 시각화:
    • 시스템의 주요 구성 요소(클래스)와 그 관계를 명확히 보여줍니다.
    • 클래스 간의 의존성, 상속, 연관성을 이해하는 데 유용합니다.
  2. 설계 문서화:
    • 시스템 설계의 문서화 도구로 활용됩니다.
    • 팀원 간의 원활한 의사소통을 돕습니다.
  3. 코드 작성 및 유지보수:
    • 클래스 다이어그램을 기반으로 구현 세부사항을 결정할 수 있습니다.
    • 시스템 구조를 이해하고 유지보수 작업을 수행하는 데 도움을 줍니다.
  4. 복잡성 감소:
    • 시스템의 복잡한 구조를 단순화하여 표현합니다.
    • 높은 수준에서 설계를 검토할 수 있습니다.

클래스 다이어그램을 사용하는 시기

  • 요구사항 분석 단계:
    • 시스템의 구조적 요구사항을 정의하고 이해관계자와 논의할 때 사용합니다.
  • 설계 단계:
    • 객체 지향 설계에서 클래스 및 관계를 정의할 때 유용합니다.
  • 구현 단계:
    • 코드 작성 전 클래스 간의 관계를 명확히 이해하고 작업을 분배할 때 사용합니다.
  • 테스트 및 디버깅 단계:
    • 클래스 간의 관계를 확인하고 설계대로 구현되었는지 점검할 때 활용합니다.
 

 

클래스 다이어그램의 주요 구성 요소

 

클래스 다이어그램을 작성할 때 다음 요소들을 포함할 수 있습니다:

1. Class (클래스):

  • 시스템의 데이터를 표현하는 객체를 나타냅니다.
  • 속성(Attributes)과 메서드(Operations)를 포함합니다.
@startuml
class User {
    - username: String
    - password: String
    + login(): Boolean
    + logout(): void
}
@enduml

2. Attributes (속성):

  • 클래스의 데이터를 나타냅니다.
  • 각 속성은 데이터 타입과 접근 제어자(public, private, protected)를 포함합니다.
@startuml
class Product {
    - id: Integer // private
    # name: String // protected
    ~ price: Double // package private
    + date : date // public
}
@enduml

 

3. Operations (메서드):

  • 클래스에서 수행할 수 있는 동작을 정의합니다.
  • 메서드는 매개변수와 반환 타입을 가질 수 있습니다.
@startuml
class Order {
    + addProduct(product: Product): void
    + calculateTotal(): Double
}
@enduml

4. Relationships (관계):

연관 (Association): 클래스 간의 기본적인 관계를 나타냅니다.

@startuml 
class Customer 
class Order 
Customer -- Order: places 
@enduml

 

상속 (Inheritance): 한 클래스가 다른 클래스를 확장할 때 사용됩니다.

@startuml 
class Person 
class Employee extends Person 
class Manager extends Employee 
@enduml

 

집합 (Aggregation): 한 클래스가 다른 클래스의 집합으로 포함될 때 사용됩니다. 부분 객체(Part)는 전체 객체(Whole)에 포함되지만, 독립적으로 존재할 수 있습니다.

 

  • 존속성: 전체 객체가 소멸하더라도 부분 객체는 별도로 존재할 수 있습니다.
  • 팀(Team) 은 팀원(Member)의 집합을 포함하지만, 팀원이 팀과 관계없이 존재할 수 있습니다.
  • 참조 기반 구현: 전체 객체는 부분 객체를 참조만 하며, 별도로 생성/삭제를 관리하지 않습니다.

 

@startuml 
class Team 
class Member 
Team o-- Member 
@enduml

 

구성 (Composition): 클래스가 구성 요소를 강하게 소유할 때 사용됩니다. 부분 객체는 전체 객체에 강하게 의존하며, 전체 객체가 없어지면 부분 객체도 사라집니다.

 

  • 존속성: 전체 객체의 수명 주기가 끝나면 부분 객체도 함께 소멸합니다.
  • 집(House) 은 방(Room)을 구성하고 있으며, 방은 집이 없으면 존재할 수 없습니다.
  • 소유 기반 구현: 전체 객체는 부분 객체를 생성하고, 부분 객체는 독립적으로 존재할 수 없습니다.

 

@startuml 
class House 
class Room
House *-- Room 
@enduml

 

Multiplicity (다중성): 클래스 간의 관계에서 포함되는 인스턴스의 수를 나타냅니다.

@startuml
class Company
class Employee
Company "1" -- "*" Employee
@enduml
 
 

PlantUML을 이용한 클래스 다이어그램 작성 예시

 

PlantUML은 간단한 문법으로 클래스 다이어그램을 작성할 수 있는 강력한 도구입니다. 아래는 실제 시스템을 설계할 때 사용할 수 있는 예제입니다.

예제 1: 사용자 인증 시스템

@startuml
class User {
    - username: String
    - password: String
    + login(): Boolean
    + logout(): void
}

class AuthService {
    + authenticate(user: User): Boolean
    + logout(user: User): void
}

User --> AuthService: uses
@enduml

  • 단방향 연관
    • 화살표는 User 클래스에서 AuthService 클래스로 향하고 있습니다.
    • 이는 User 객체가 AuthService 객체를 사용한다(uses) 는 것을 의미합니다.
    • 반대로, AuthService 클래스는 User 클래스에 대해 직접적인 참조가 없습니다
  • 강도
    • 이 관계는 느슨한 결합(Loose Coupling) 을 나타냅니다.
    • 즉, User 클래스는 AuthService 클래스를 사용하지만, 두 클래스는 독립적으로 존재할 수 있습니다.
  • 연관의 역할
    • User 클래스는 로그인과 로그아웃 기능을 위해 AuthService 클래스의 기능(메서드)을 호출합니다.
    • 예를 들어, authenticate(user: User) 메서드를 호출하여 사용자 인증을 처리합니다.

 

예제 2: 온라인 쇼핑 시스템

@startuml
class Customer {
    - name: String
    - email: String
    + placeOrder(order: Order): void
}

class Order {
    - id: Integer
    - date: Date
    + calculateTotal(): Double
}

class Product {
    - id: Integer
    - name: String
    - price: Double
}

Customer -- Order: places
Order *-- Product: contains
@enduml

  • Customer -- Order: places
    • 이 관계는 Customer 클래스와 Order 클래스 사이에 존재합니다. Customer는 Order를 places (주문한다)라는 관계로 연결합니다.
    • 고객은 주문을 할 수 있습니다. 즉, 고객 객체는 주문 객체를 생성할 수 있으며, 고객은 여러 번 주문할 수 있습니다.
    • Customer에서 Order로 향하는 단방향 화살표는 고객이 주문을 한다는 의미를 전달합니다.
  • Order *-- Product: contains
    • 이 관계는 Order 클래스와 Product 클래스 사이에 존재합니다. Order는 Product를 contains (포함한다)라는 관계로 연결합니다.
    • 주문은 여러 개의 상품을 포함할 수 있습니다. 즉, Order 객체는 여러 개의 Product 객체를 포함하는 구조입니다. 이는 "하나의 주문에 여러 개의 상품이 포함될 수 있다"는 것을 의미합니다.
    • Order에서 Product로 향하는 집합 관계로, 여러 상품이 하나의 주문에 포함된다는 점을 나타냅니다.
    • *--는 집합 관계를 나타내며, 이는 "1개 주문에는 여러 상품이 포함될 수 있다"는 것을 의미합니다.

 

예제 3: 도서 관리 시스템

@startuml
class Book {
    - title: String
    - author: String
    - ISBN: String
}

class Library {
    + addBook(book: Book): void
    + findBook(title: String): Book
}

Library *-- Book
@enduml

 

  • Library *-- Book:
    • Library 클래스는 Book 클래스를 contains (포함한다는 의미) 관계로 연결합니다. 
    • 즉, 도서관은 여러 책을 포함하는 구조를 나타냅니다.
    • *--는 집합 관계를 나타내며, 하나의 도서관이 여러 책을 포함할 수 있음을 시사합니다. 이 관계는 도서관에 여러 책이 저장되어 있다는 것을 의미합니다.

 

결론

클래스 다이어그램은 객체 지향 시스템의 구조를 명확히 하고, 설계 및 구현 과정을 지원하는 중요한 도구입니다. PlantUML을 활용하면 텍스트 기반 문법으로 간단하고 빠르게 클래스 다이어그램을 생성할 수 있어 설계 작업을 효율적으로 수행할 수 있습니다.

반응형