소프트웨어 시스템의 시각적 모델을 만들기 위한 언어
소프트웨어 개발 시 산출물을 명세화, 시각화, 문서화할 때 사용한다.
UML은 프로세스나 방법을 안내하지 않고 표현 방법만 제시한다.
- 기능적 관점(functional view)
: 사용자 측면에서 본 소프트웨어의 기능을 나타낸다.- 정적 관점(static view)
: 소프트웨어 내부의 구성 요소와 구조적 관계를 나타낸다.- 동적 관점(dynamic view)
: 소프트웨어의 내부 동작을 나타낸다.
UML에는 여러 다이어그램이 있는데, 각 다이어그램은 소프트웨어에 대한 고객과 개발자의 관점을 다양하게 표현한 것이다.
클래스 내부의 정적인 내용이나 클래스 사이의 관계를 표시하는 다이어그램
클래스, 속성, 오퍼레이션, 연간 관계 등을 이용하여 시스템을 정적인 관점으로 나타낸 것
클래스(Class)
클래스는 사각형을 세 부분으로 나누어 내용을 정의한다.
- 클래스 이름(필수)
- 속성
- 메서드
스테레오 타입(Stereo Type)
추상 클래스/메서드
클래스 다이어그램의 주 목적은 클래스 간의 관계와 의존 관계를 한 눈에 파악하는 것이다.
일반화는 슈퍼 클래스와 서브 클래스 간의 상속관계를 나타낸다. 일반화라는 말은 서브 클래스를 슈퍼 클래스로 일반화 하는 것이고, 슈퍼 클래스에서 서브 클래스로는 구체화한다고 표현한다.
![]()
일반화 관계는 실선과 비어있는 화살표를 이용해 서브 클래스에서 슈퍼 클래스로 연결하여 표시한다.
실체화는 인터페이스의 정의만 있는 메서드를 오버라이딩하여 구현하는 것을 말한다. Swift에서는 프로토콜을 정의하고 채택하여 구현하는 과정을 말할 수 있다.
![]()
인터페이스를 클래스 처럼 표기하고 스테레오 타입으로 <>로 표시하고, 점선과 비어있는 삼각형으로 프로토콜 쪽으로 연결하여 표현한다.
의존은 어떤 클래스가 다른 클래스를 참조하는 것을 의미한다. 클래스 내부에서 프로퍼티로 가지지 않고 다른 클래스를 사용할 때 의존관계라고 한다.
class Schedule {
func date() {
...
}
}
class User {
func createSchedule() -> Schedule {
return Schedule()
}
func useSchedule(schedule: Schedule) {
schedule.date()
}
}
위와 같은 코드 상황일 때,
![]()
점선과 함께 얇은 화살표 모양으로 사용하는 방향으로 연결하여 표시한다.
다른 객체의 참조를 프로퍼티로 가질 때 연관 관계라고 한다.
class Address {
...
}
class User {
let adress: Address
}
위와 같은 코드 상황일 때,
![]()
실선과 얇은 화살표를 이용하여 사용하는 클래스에서 사용당하는 클래스 방향으로 화살표를 연결하여 표시한다.
집합은 연관 관계를 특수하게 나타낸 것으로 전체와 부분의 관계를 가진다. 전체-부분 관계는 부분 개념이 모여서 전체 개념을 이룰 때 적용한다. 집합 관계는 전체-부분에서 부분 스스로도 존재할 수 있는 관계를 말한다.
![]()
class Wheel {
...
}
class Vehicle {
let wheel: wheel
init(wheel: Wheel) {
self.wheel = wheel
}
}
코드에서는 차이를 구문하기 힘들지만 외부에서 부분을 받아온다. 이후 전체 클래스가 deinit이 되어도 Part는 deinit 되지 않는다.
표기는 실선으로 연결한 후 전체(whole)에 해당하는 쪽에 비어있는 다이아몬드 모양으로 한다. 부분(part)쪽에는 이미 방향성이 있기 때문에 화살표를 표시해도 되고 하지 않아도 된다.
합성 역시 집합처럼 전체-부분 관계를 가지지만 합성은 전체 개념이 소멸되면 부분 개념도 소멸되는 더 강한 집합 개념이다.

표현도 역시 집합과 비슷하지만 합성은 다이아몬드 내부가 채워져있다.
class Address {
...
}
class User {
let address = Address()
}
부분을 전체에서 직접 생성해서 전체가 없어지면 부분도 같이 소멸된다.