클래스 다이어그램을 그리는 방법

클래스 다이어그램 소개

이전 UML 포스팅에서 각 관점에 따라 동적 다이어그램, 정적 다이어그램을 표현했었다.

https://guhonga.tistory.com/82

 

UML 방법 소개

UML(Unified Modeling Language)이란 통합 모델링 언어이다. 시스템 개발을 위해 시각적으로 설계 표기를 제공하는 방법으로 객체 지향 시스템을 개발할 때 사용한다. 이 방법을 사용하여 개발하는 시스

guhonga.tistory.com

클래스 다이어그램은 이 중 정적 다이어그램에 속한다.

 

 

이것은 클래스 내부의 정적인 내용이나 클래스 사이의 관계를 표기할 수 있다.

 

 

클래스의 내용으로 멤버변수와 멤버함수를,

클래스의 관계로는 상속, 클래스의 참조, 클래스 사이의 의존관계 등을 알수 있다.

 

클래스는 이름, 속성, 메서드로 구성되어 있다.

여기서 클래스란, 공통의 속성이나 메서드를 공유하는 객체 집합을 말한다.

 

 

속성은 당연히 클래스의 특성이나, 각 인스턴스가 보유할 수 있는 값의 범위를 쓰겠지만

메서드에서 부호가 달려있는건 바로 알기 어렵다.

주 기능을 부호로 표시하기 때문에 메서드를 오퍼레이션이라고도 한다.
이름, 타입, 매개변수들과 연관된 행위를 호출할 때 제약사항이 요구되는데, 이 제약사항을 알려주는 것이다.

 

이렇게 클래스를 구성하고 있는 것들을 알아봤다.

 

 

 

 

 

 

클래스 다이어그램 표현 방법

 

우선 명세서를 통해 클래스와 매서드를 추출한다. (소프트웨어 개발의 요구사항 추출 단계에서 작성한 요구사항 명세서)

 

 

예를들어 배구 클래스를 추출했다고 하자

여기서 화살표 방향은 객체가 화살표 방향 객체의 참조를 갖고 있다는 의미이다. (소스코드 의존성의 방향)

그냥 화살표 방향 클래스를 상속하고 있다고 봐도 된다.

 

그것 말고도 클래스 옆에 자그맣게 숫자가 적혀있는걸 볼 수 있는데, 클래스가 참조하는 개수를 의미한다.
(*는 여러개를 뜻함.)

 

 

클래스를 표현할 때 특히 화살표를 조심해서 그려야 한다. 화살촉이 없으면 단순 연관관계이고, 화살촉이 있으면 상속이다.

화살촉 만으로 구분하기에 직관적이지 않아서 보통 상속은 세로로, 연관관계는 가로로 그린다.

더보기

아래는 이와같은 클래스의 특징들을 포함하여 구현한 클래스 다이어그램의 사용 예시이다.

 

 

 

 

연관 관계 표현

화살촉의 종류가 하나만 있는 것은 아니다.

  • 연관(Association): 소유자가 없는 관계를 나타내는 실선 화살표
  • 탐색 가능한 연관(Navigable Association): 한 클래스 또는 객체가 다른 클래스 또는 객체로 탐색할 수 있음
  • 상속(Inheritance): 한 클래스(자식)가 다른 클래스(부모)로부터 속성과 행동을 상속받는 관계
  • 실현/구현(Realization/Implementation): 클래스가 인터페이스를 구현할 때 사용
  • 의존(Dependency): 한 클래스의 변경이 다른 클래스에 영향을 줄 수 있는 관계를 나타냄냄
  • 집합(Aggregation): 각각의 객체들이 생명주기를 가지고 있지만, 하나의 전체 집합 객체 안에 소속된 부분 집합인 연관관계의 특수한 형태를 나타냄
  • 구성(Composition): 집합 관계에서 일단은 연관관계이지만 더 강한 소유권을 갖는다. 전체가 파괴되면 부분도 함께 파괴되는 관계

 

 

 

 

 

추가 표현 기능

위와 같은 연관관계로도 표현할 수 없는 여러 상황들이 있다. 위 화살표가 사용되는 예시나 추가 상황들을 알아보자.

 

 

 

추상 클래스, { } 프로퍼티

추상 클래스를 표현하고 싶다면 클래스 이름 밑에 {abstract} 프로퍼티를 사용하거나 이탤릭체로 클래스 이름을 쓴다.

 

위의 {abstract} 같은 프로퍼티 {}는 어떤 클래스에도 붙일 수 있다.
예를들어 {author = Martin, date = 20240416, file = shpe.java} 등으로 표현할 수 있다.

이것은 보통 클래스에 속하지 않는 추가적인 정보를 나타낸다. (클래스 프로퍼티는 잘 사용하지 않음)

 

 

 

집합 관계 예시

클래스 다이어그램에서 부분과 전체 관계를 내포하는 집합을 표현할 수도 있다. 연관과 크게 차이가 있진 않다.

 

 

구성 composition

이와 비슷한 것으로 구성도 있다. 집합의 특별한 형태를 말한다.

자바에선 별로 유용하지 않지만 C++에선 꽤나 유용하다. 자바에서는 객체 소멸이 보이지 않기 때문이다.
참고로 한 인스턴스를 두 오너가 동시에 소유할 수 없다.

 

 

 

다중성

이진트리같이 다른 객체들의 배열이나 벡터를 가질 때 다중성multiplicity을 표현할 수 있다.

위에 숫자는 몇개의 객체와 연관되어 있는지 표시하는 것이다.

 

 

 

 


 

 

 

 

 

스테레오 타입

스테레오 타입은 <<create>>, <<local>>, <<parameter>>, <<delegate>> 4가지가 있다.

 

 

<<create>>는 연관된 구성요소 원본이 연관 대상을 생성한다. 원본이 대상을 생성해서 이 대상을 다른 부분에 넘긴다.

 

 

<<local>>은 원본 클래스가 대상 클래스의 인스턴스를 만들고 그 인스턴스의 참조가 지역변수에 담길 수 있다.
이 객체는 멤버변수에 할당되지 않으며 시스템의 다른 부분에 전달되지 않는다.

 

 

<<parameter>>는 원본 클래스의 멤버 함수가 호출될 때 대상 인스턴스가 인자로 넘어온다.

 

 

<<delegate>>는 원본 클래스의 멤버 함수가 호출될 때 이 호출을 대상 클래스에 그대로 전달해서 대상 클래스의 멤버 함수를 호출하는 경우에 사용한다.

 

 

클래스의 내부에 클래스를 구현하는 내부 클래스는 다음과 같이 표현한다.

 

 

연관 클래스는 특정한 연관을 어떻게 구현할 지 알려준다.
원본 클래스가 연관 클래스의 참조만 가지고 있고, 연관 클래스가 모든 대상의 참조를 가진다.

 

 

마지막으로 연관 한정사(association qualifier)는 일반적인 자바 참조가 아니라 어떤 종류의 키나 토큰을 통해 연관을 구현할 경우 사용한다.

(물론 이 경우는 잘 사용하지 않음)

 

 

 

 

이렇게 배운 것을 기반으로 소프트웨어 공학 과제인 클래스 다이어그램을 그려봤다..

출결 관리 시스템을 아주 간단하게 구현해보려고 하는데, 이런 간단한 것 조차도 막상 직접 클래스 다이어그램으로 표현하려고 하니 생각보다 많이 헷갈렸다. 솔직히 이게 맞는 그림인진 잘 모르겠다 ㅋㅋ..