클래스 다이어그램의 기본 구성 요소
컨텍스트에 따라 클래스 다이어그램의 클래스는 주요 객체, 애플리케이션의 상호 작용 또는 프로그래밍할 클래스를 나타낼 수 있습니다. "UML 클래스 다이어그램이란 무엇인가요?"라는 질문에 답하려면 먼저 그 기본 구성을 이해해야 합니다.
- 클래스(Classes): 시스템에서 객체를 생성하고 동작을 구현하기 위한 템플릿입니다. UML에서 클래스는 공통된 구조와 동작을 공유하는 객체 또는 객체 집합을 나타냅니다. 클래스 이름, 속성, 작업 행을 포함하는 직사각형으로 표현됩니다. 클래스 다이어그램에서 클래스를 그릴 때는 맨 위 행만 필수로 작성하면 되며, 더 자세한 내용을 제공하려는 경우 나머지 행은 선택 사항입니다.
- 시그널(Signals): 액티브 객체 간의 단방향 비동기 통신을 나타내는 기호입니다.
- 데이터 유형(Data types): 데이터 값을 정의하는 분류자(classifier)입니다. 데이터 유형은 원시 유형(primitive types)과 열거형(enumerations)을 모두 모델링할 수 있습니다.
- 패키지(Packages): 다이어그램에서 관련된 분류자들을 정리하도록 설계된 도형입니다. 상단에 탭이 달린 큰 직사각형 모양으로 기호화됩니다.
- 인터페이스(Interfaces): 응집력 있는 행동 집합을 정의하는 작업 시그니처 및/또는 속성 정의의 모음입니다. 인터페이스는 클래스와 비슷하지만, 클래스는 해당 유형의 인스턴스를 가질 수 있는 반면 인터페이스는 이를 구현할 클래스가 최소 하나 이상 있어야 한다는 점이 다릅니다.
- 열거형(Enumerations): 사용자 정의 데이터 유형을 나타냅니다. 열거형에는 열거형의 값을 나타내는 식별자 그룹이 포함됩니다.
- 객체(Objects): 클래스 또는 여러 클래스의 인스턴스입니다. 클래스 다이어그램에 객체를 추가하여 구체적이거나 프로토타입 형태의 인스턴스를 나타낼 수 있습니다.
- 아티팩트(Artifacts): 문서, 데이터베이스, 실행 파일, 소프트웨어 구성 요소 등 소프트웨어 시스템의 구체적인 엔티티를 나타내는 모델 요소입니다.
클래스 내부 섹션
표준 클래스는 세 개의 섹션으로 구성됩니다.
상단 섹션
클래스의 이름이 포함됩니다. 분류자나 객체에 대해 이야기할 때 이 섹션은 항상 필수적입니다. 클래스 이름은 다음과 같아야 합니다.
- 대문자로 시작해야 합니다.
- 굵은 글씨체로 서식이 지정되어야 합니다.
- 상단 섹션의 중앙에 위치해야 합니다.
- 설명적이어야 합니다.
중간 섹션
클래스의 속성이 포함됩니다. 이 섹션을 사용하여 클래스의 특징을 설명하세요. 이는 클래스의 특정 인스턴스를 설명할 때만 필수적입니다.
하단 섹션
클래스 작업(메서드)이 포함됩니다. 목록 형식으로 표시되며 각 작업은 한 줄씩 차지합니다. 작업은 클래스가 데이터와 상호 작용하는 방식을 설명합니다. 하단 두 섹션의 텍스트는 보통 왼쪽으로 정렬되며 첫 글자는 소문자로 입력됩니다.
멤버 접근 제어자
모든 클래스는 접근 제어자(가시성)에 따라 서로 다른 접근 수준을 가집니다. 각 접근 수준과 이에 해당하는 기호는 다음과 같습니다.
- 퍼블릭(+)
- 프라이빗(-)
- 프로텍티드(#)
- 패키지(~)
- 파생(/)
- 정적(밑줄)
멤버 범위
멤버의 범위에는 분류자(classifier)와 인스턴스(instance) 두 가지가 있습니다.
분류자는 대개 정적(static)으로 인식되는데, 이는 속성 값이 모든 인스턴스에서 동일하게 유지되고 메서드 호출이 인스턴스의 상태에 영향을 주지 않음을 의미합니다. 반면 인스턴스는 인스턴스의 상태를 변경할 수 있는 메서드를 포함하며 속성 값은 인스턴스마다 다를 수 있습니다. 분류자를 나타내려면 이름을 밑줄로 표시하고, 인스턴스를 나타내려면 텍스트를 그대로 두세요.
상호 작용
"상호 작용"이라는 용어는 클래스 및 객체 다이어그램에 존재할 수 있는 다양한 관계와 링크를 의미합니다. 가장 일반적인 상호 작용은 다음과 같습니다.
상속(Inheritance): 자식 클래스 또는 서브클래스가 부모 클래스 또는 슈퍼클래스의 기능을 이어받는 과정으로, 일반화(generalization)라고도 합니다. 슈퍼클래스를 가리키는 닫힌 화살표가 있는 직선 연결선으로 기호화됩니다.

이 예시에서 "Car(자동차)" 객체는 고유한 클래스의 특정 속성(모델 유형, 문 개수, 자동차 제조업체) 및 메서드(Radio(), windshieldWiper(), ac/heat()) 외에도 부모 클래스("Vehicle(탈것)")의 모든 속성(속도, 승객 수, 연료) 및 메서드(go(), stop(), changeDirection())를 상속받습니다. 상속은 클래스 다이어그램에서 끝이 닫힌 빈 화살표가 있는 실선으로 표시됩니다.
양방향 연관(Bidirectional association): 두 클래스 간의 기본 관계입니다. 두 클래스 모두 서로를 인식하고 상대 클래스와의 관계를 알고 있습니다. 이 연관 관계는 두 클래스 사이의 직선으로 표현됩니다.

위의 예시에서 Car 클래스와 RoadTrip 클래스는 서로 연관되어 있습니다. 선의 한쪽 끝에서 Car는 다중성(multiplicity) 값이 0..1인 "assignedCar" 연관 관계를 가지므로, RoadTrip 인스턴스가 존재할 때 연관된 Car 인스턴스가 하나이거나 없을 수 있습니다. 이 경우 RoadTrip에 여러 Car 인스턴스가 연관될 수 있음을 보여주기 위해 다중성 값이 0..*인 별도의 Caravan 클래스가 필요합니다. 하나의 Car 인스턴스는 여러 개의 "getRoadTrip" 연관 관계를 가질 수 있으므로(즉, 한 대의 자동차가 여러 번의 로드 트립을 갈 수 있으므로), 다중성 값은 0..*로 설정됩니다.
단방향 연관(Unidirectional association): 비교적 덜 일반적인 두 클래스 간의 관계입니다. 한 클래스가 다른 클래스를 인식하고 상호 작용합니다. 단방향 연관은 인식하는 클래스에서 인식되는 클래스로 열린 화살표가 가리키는 직선 연결선으로 모델링됩니다.

예를 들어, 애리조나를 관통하는 로드 트립 중에 속도 단속 카메라가 운전 활동을 기록하는 과속 단속 구간을 지나갈 수 있지만, 우편으로 통지서를 받기 전까지는 그 사실을 알지 못할 것입니다. 이미지에는 그려져 있지 않지만, 이 경우 다중성 값은 속도 단속 카메라를 지나간 횟수에 따라 0..*가 됩니다.