멀티캠퍼스

UML(Unified Modeling Language)과 클래스 다이어그램(Class Diagram)

isaacagent 2025. 8. 6. 23:10
728x90

나의 개인적인 경험과 주위 사람들로부터 보고 듣는 이야기를 종합해보면 하나의 소프트웨어를 만든다고 생각을 했을 때, 좋은 소프트웨어를 결정하는 요인은 설계(기획)이라고 생각을 한다. 그러면 이 설계(기획)이 얼마나 중요하냐? 내 생각엔 거의 80%정도의 비율을 차지한다고 생각한다. 나머지 20%는 코딩 실력(구현) 으로 좋은 프로그램을 계획하는데 필요한 비율이라고 본다.

그러면 어떻게 좋은 소프트웨어를 만들까? 다행스럽게도 앞선 개발자 선생님들의 지혜를 물려받아 소프트웨어를 설계를 진행하는데 도움이 되는 UML이라는 것이 존재한다. 그럼 이 UML이라는건 뭘까?

 

UML

"소프트웨어 시스템을 시각적으로 설계하고 표현하기 위해 사용되는 표준화된 모델링 언어"라고 정의 되어있다. 주로 객체 지향 소프트웨어 개발에서 시스템의 구조, 동작, 상호 작용 등을 다이어그램 형태로 나타내어, 개발자와 기획자, 고객 등 다양한 이해관계자 간의 의사소통을 원활하게 해준다. 

뭐 이해관계자들 간의 의사소통을 원활하게 해준다는 의미는 잘 알겠다. 그래도 왜 사용을 해야되는지 한 번 알아보자.

  • 명확한 의사소통 : 시각적 다이어그램을 통해 시스템의 구조와 동작을 문서화하며, 개발자, 기획자, 이해관계자간에 복잡한 시스템을 쉽고 정확하게 공유가 가능하다.
  • 표준화된 표현 방식 : 범용적이고 표준화된 모델링 언어이기 때문에, 팀원과 조직이 달라도 동일한 의미로 시스템 해석이 가능하다.
  • 요구사항 분석과 추적의 용이성 : 시스템의 요구사항과 기능을 명확하게 다이어그램으로 정리할 수 있어서, 오해나 누락의 비율이 줄어든다.
  • 설계의 구조화와 유지보수성 향상 : 시스템의 구조, 동작을 체계적으로 표현하기 때문에 변경 사항이 생겼을 때 전체 구조에 미치는 영향을 쉽게 파악 할 수 있다.

뭐 표준화를 통한 정석적인 장점들 모음이라고 보면 될 거 같다.

그럼 이제 설계를 진행 할 때 어떤 UML을 사용을 해야 될 지 종류와 용도를 한 번 알아보도록 하자.

 

첫 번째 UML로는 클래스 다이어그램이 되겠다.

 

그림 1. 클래스 다이어그램

 

클래스 다이어그램은 시스템의 정적인 구조를 시각적으로 표현한 다이어그램이다. 클래스, 그 클래스의 속성(변수)과 메소드(연산), 그리고 클래스 간의 다양한 관계(상속, 연관, 구현 등)를 직사각형 및 연결선으로 표시를 한다.

 

그림 2. 클래스 다이어그램의 클래스 표기법

 

그림 3. 클래스 다이어그램의 접근 제한자

 


그림 4. 클래스 다이어그램 관계 모음

다음은 예시 코드로 클래스 다이어그램을 어떻게 보아야 할 지 알아보도록 하자.

 

첫 번째로는 일반화 관계이다.

그림 5. 일반화 관계 예시 코드

클래스 Dog와 Cat은 Animal이란 클래스의 메소드를 상속 받아서 Override를 통해서 sound() 메소드를 재구성하였다.

이걸 수식으로 표현을 할 수 있다면 일반화는 빈 삼각형 화살표를 사용하므로

Animal -> △ Dog, Cat 

 

두 번째는 집합 관계이다.

그림 6. 집합 관계 예시 코드

class Address와 Student가 존재한다. class Student 에서는 Address 인스턴스 객체를 참조해서 사용을 하고 있다. 그림 4에서 말을 했듯이 두 클래스는 서로 독립적이기 때문에 한 클래스가 사라진다고 해도 다른 클래스에 영향을 미치지 않는다. 즉, Student 클래스가 사라진다한들 Address 클래스를 사용 못하는 형태가 아니라는 것이다.

이걸 수식으로 표현을 한다면 집합은 빈 마름모를 사용을 한다.

Student -> ◇Address

세 번째는 합성 관계이다.

그림 7. 합성 관계 예시 코드

Car 클래스가 생성자를 통하여 Engine 객체를 직접 생성하여 갖는 구조이다. 이런 구조로 인하여  Engine 객체의 생명주기는 Car 클래스에 종속하게 된다. 만약 Car 클래스가 사라지게 된다면 Engine 객체도 같이 소멸을 하는 이러한 관계를 합성 관계라고 한다.

이걸 수식으로 표현한다면 합성은 채워진 마름모를 사용한다.

Car -> ◆ Engine

 

네 번째는 의존 관계이다.

그림 8. 의존 관계 예시 코드

Report 클래스가 Printer 객체를 생성하거나 멤버 변수로 가지지 않고, generate 메소드의 매개 변수로 받아서 일시적으로 사용을 하고 있는 구조이다. Report 클래스가 사라지더라도 Printer 클레스는 독립적으로 존재를 할 수 있다. 수식으로 표현을 하면 점선 화살표를 사용한다.

Report - - -> Printer

다섯 번째는 연관 관계이다. 

그림 9. 연관 관계 예시 코드

Employee 클래스가 Company 클래스를 멤버 변수로 가지고 있고 두 클래스 간의 연관 관계가 형성되어 있다. 두 객체는 서로 독립적으로 생성되고 소멸이 될 수 있다. 또한 방향성에 따라서 단방향 또는 양방향으로 설정이 가능하다. 이걸 수식으로 표현하면 일반 실선 화살표로 가리킬 수 있고, 양방향일 경우 양쪽에 화살표를 추가할 수 있다.

Employee -> Student , (양방향) Employee <-> Student 

'멀티캠퍼스' 카테고리의 다른 글

Servlet MVC 실습 코드 리뷰  (0) 2025.09.01
서블릿 기초  (1) 2025.08.25
데이터베이스 Index  (1) 2025.08.19
데이터베이스 (DDL)  (2) 2025.08.12
(Java)abstract, interface  (6) 2025.08.04