본문 바로가기
Programming

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

by 느리게 걷는 즐거움 2024. 12. 28.
반응형

 

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

 

클래스 다이어그램(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을 활용하면 텍스트 기반 문법으로 간단하고 빠르게 클래스 다이어그램을 생성할 수 있어 설계 작업을 효율적으로 수행할 수 있습니다.

반응형