[UML] 클래스 다이어그램 완벽하게 이해하기
소프트웨어 개발은 복잡한 시스템을 구축하는 과정입니다. 여러 개발자가 협업하고, 시스템의 구조를 한눈에 파악해야 할 때가 많죠. 이때, 통일된 약속으로 시스템을 시각적으로 표현하는 도구가 있다면 어떨까요? 바로 여기서 UML(Unified Modeling Language)이 등장합니다.
UML은 객체 지향 소프트웨어 시스템을 시각화(Visualize)하고, 명세화(Specify)하며, 문서화(Document)하는 표준 모델링 언어입니다. 특히 마이크로서비스 아키텍처나 대규모 시스템 설계가 보편화되면서 UML의 중요성은 더욱 커지고 있습니다. 수많은 UML 다이어그램 중에서도 클래스 다이어그램(Class Diagram)은 시스템의 정적 구조를 명확하게 보여주는 핵심적인 도구입니다.
이 글에서는 클래스 다이어그램의 기본 개념부터 구성 요소, 그리고 실제 활용법까지 차근차근 알아보겠습니다. 이 가이드를 통해 시스템 구조를 더 명확하게 이해하고, 팀원들과 효과적으로 소통하는 역량을 갖추게 될 것입니다.
클래스 다이어그램의 핵심 요소
클래스 다이어그램은 시스템을 구성하는 클래스와 그들 사이의 관계를 시각적으로 표현합니다. 마치 건물의 설계도처럼 시스템의 구조를 한눈에 보여주는 도구죠. 다이어그램을 제대로 읽고 그리려면 먼저 기본 구성 요소를 이해해야 합니다.
1. 클래스 (Class)
클래스는 동일한 특징과 행위를 공유하는 객체들의 집합을 나타냅니다. 다이어그램에서는 속성(attributes)과 오퍼레이션(operations)을 포함하는 사각형으로 표현됩니다.
- 클래스 이름: 사각형의 가장 윗부분에 위치합니다. 이름은 굵은 글씨와 가운데 정렬을 사용하고, 첫 글자는 대문자로 표기하는 것이 관례입니다.
- 속성 (Attributes): 클래스가 가지는 정적 데이터 또는 필드를 나타냅니다. 중간 부분에 위치하며 왼쪽 정렬로 표기합니다. 보통 접근 제어자, 이름, 데이터 타입을 함께 명시합니다.
+: public-: private#: protected~: default (package-private)
예:
userId,totalPrice등
- 오퍼레이션 혹은 메서드 (Operations 혹은 method): 클래스가 수행할 수 있는 동작, 즉 메서드를 의미합니다. 가장 아랫부분에 위치하며, 속성과 마찬가지로 왼쪽 정렬로 표기합니다.
예:
login(),calculateTotal(),cancelOrder()등
- 정적(Static) 멤버: 정적 속성이나 오퍼레이션은 이름에 밑줄을 그어 표현합니다.
UML 표준에서는 속성과 메서드의 순서나 줄바꿈도 일관되게 유지해야 합니다. 실제 개발팀 내 문서화를 위해서는 ‘팀 내 UML 네이밍 룰’을 별도로 정의해두면 좋습니다.
2. 관계 (Relationships)
클래스 다이어그램의 진정한 힘은 클래스 간의 관계를 명확히 보여주는 데 있습니다. 관계는 주로 화살표로 표현되며, 각기 다른 모양의 화살표는 서로 다른 의미를 가집니다. 화살표 방향은 한 클래스가 다른 클래스를 어떻게 사용하는지를 나타냅니다.
| 관계 유형 | 의미 | 화살표/기호 형태 | 설명 |
|---|---|---|---|
| 일반화 (Generalization) | 상속 관계 | 부모 클래스(Superclass)와 자식 클래스(Subclass) 간의 관계를 나타냅니다. | |
| 실체화 (Realization) | 인터페이스 구현 관계 | 클래스가 인터페이스를 implements할 때 사용합니다. 점선 화살표로 표현합니다. | |
| 연관 (Association) | 참조 관계 | 한 클래스가 다른 클래스의 객체를 속성으로 참조합니다. 방향성은 참조 흐름을 나타냅니다. | |
| 의존 (Dependency) | 일시적 사용 관계 | 한 클래스가 다른 클래스를 메서드 매개변수나 반환 값으로 사용하는 관계입니다. | |
| 집합 (Aggregation) | 약한 전체-부분 관계 | ‘전체’가 ‘부분’을 포함하지만, 부분의 생명주기가 전체에 의존하지 않습니다. | |
| 합성 (Composition) | 강한 전체-부분 관계 | 부분의 생명주기가 전체에 완전히 종속될 때 사용합니다. |
예시
쇼핑몰 시스템을 개발한다고 가정해보면. ‘사용자(User)’, ‘상품(Product)’, ‘주문(Order)’ 클래스와 이들의 상호작용을 클래스 다이어그램으로 표현할 수 있습니다.
classDiagram
class User {
- userId: int
- name: string
- email: string
+ login(): void
+ logout(): void
}
class Product {
- productId: int
- name: string
- price: float
+ getInfo(): string
}
class Order {
- orderId: int
- date: Date
- total: float
+ calculateTotal(): float
}
User "1" --> "1..*" Order : places >
Order "1..*" --> "1..*" Product : contains >
클래스 다이어그램은 시스템의 청사진 역할을 하며, 개발 초기 단계에서 팀원들과 구조를 공유하는 데 매우 효과적입니다.
고급 개념: 추상 클래스와 인터페이스
객체 지향 설계에서 추상화(Abstraction)는 핵심 개념입니다. 클래스 다이어그램에서도 이를 표현하는 방법이 있습니다.
- 추상 클래스 (Abstract Class): 직접 인스턴스화할 수 없는 클래스입니다. 클래스 이름을 _이탤릭체_로 표기하거나, 이름 아래
{abstract}키워드 또는«abstract»길러멧으로 표시합니다. - 인터페이스 (Interface): 클래스가 반드시 구현해야 하는 오퍼레이션의 집합입니다. 클래스 이름 위에
«interface»키워드를 붙여 명확히 구분합니다.
‘실체화(Realization)’와 ‘구현(Implementation)’은 같은 개념입니다. UML 표준에서는 Realization이라는 용어를 공식적으로 사용합니다.
클래스 다이어그램은 언제 사용할까?
클래스 다이어그램은 개발 단계에 따라 다양한 목적으로 활용됩니다.
- 개념 단계 (Conceptual): 시스템의 핵심 클래스와 관계만 단순히 표현합니다. 비즈니스 로직 이해에 초점을 둡니다.
- 명세 단계 (Specification): 실제 개발 전, 클래스의 모든 속성·메서드·관계를 상세히 설계합니다. 개발자가 코드를 작성할 수 있는 수준의 청사진입니다.
- 구현 단계 (Implementation): 실제 코드 구조를 그대로 반영한 다이어그램으로, 유지보수나 타인에게 코드 구조를 설명할 때 유용합니다.
더 나은 개발을 위한 첫걸음
지금까지 UML 클래스 다이어그램의 기본 개념부터 고급 활용법까지 살펴보았습니다. 클래스 다이어그램을 그리는 것은 단순한 그림 작업이 아니라, 시스템 구조를 깊이 고민하고 복잡한 관계를 명확히 정리하는 과정입니다. 처음엔 어색할 수 있지만, 꾸준히 연습하다 보면 코드보다 먼저 구조를 설계하는 습관이 생깁니다. 지금 진행 중인 프로젝트나 사이드 프로젝트에 클래스 다이어그램을 적용해보세요. 이 작은 시도가 여러분의 개발 생산성과 설계 능력을 한 단계 끌어올릴 것입니다.
《UML Distilled》는 UML을 실무 관점에서 가장 효율적으로 익힐 수 있는 입문서로, Martin Fowler가 집필한 고전입니다.