클래스 다이어그램을 사용하는 이유
클래스 다이어그램(Class Diagram)은 객체 지향 시스템의 구조를 시각적으로 표현하는 UML 다이어그램입니다. 시스템의 클래스, 속성, 메서드, 그리고 클래스 간의 관계를 나타내어 설계 및 구현 과정에서 큰 도움을 줍니다.
주요 이유:
- 시스템 구조의 시각화:
- 시스템의 주요 구성 요소(클래스)와 그 관계를 명확히 보여줍니다.
- 클래스 간의 의존성, 상속, 연관성을 이해하는 데 유용합니다.
- 설계 문서화:
- 시스템 설계의 문서화 도구로 활용됩니다.
- 팀원 간의 원활한 의사소통을 돕습니다.
- 코드 작성 및 유지보수:
- 클래스 다이어그램을 기반으로 구현 세부사항을 결정할 수 있습니다.
- 시스템 구조를 이해하고 유지보수 작업을 수행하는 데 도움을 줍니다.
- 복잡성 감소:
- 시스템의 복잡한 구조를 단순화하여 표현합니다.
- 높은 수준에서 설계를 검토할 수 있습니다.
클래스 다이어그램을 사용하는 시기
- 요구사항 분석 단계:
- 시스템의 구조적 요구사항을 정의하고 이해관계자와 논의할 때 사용합니다.
- 설계 단계:
- 객체 지향 설계에서 클래스 및 관계를 정의할 때 유용합니다.
- 구현 단계:
- 코드 작성 전 클래스 간의 관계를 명확히 이해하고 작업을 분배할 때 사용합니다.
- 테스트 및 디버깅 단계:
- 클래스 간의 관계를 확인하고 설계대로 구현되었는지 점검할 때 활용합니다.
클래스 다이어그램의 주요 구성 요소
클래스 다이어그램을 작성할 때 다음 요소들을 포함할 수 있습니다:
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을 활용하면 텍스트 기반 문법으로 간단하고 빠르게 클래스 다이어그램을 생성할 수 있어 설계 작업을 효율적으로 수행할 수 있습니다.
'Programming' 카테고리의 다른 글
코드로 시퀀스 다이어그램 그리기 (0) | 2024.12.28 |
---|---|
GIT Fork를 사용하는 이유? (0) | 2024.12.18 |
C++에서 sort 명령 사용법 (0) | 2024.12.11 |
Git Commit 내용을 수정하는 방법 (0) | 2024.12.11 |
Git Cherry-pick (특정 커밋만 선택적으로 가져오기) (1) | 2024.12.10 |