[소프트웨어공학] UML 정의와 종류
UML 정의
- UML이란 Unified Modeling Language의 약자로, 프로그램 설계를 표현하기 위하여 사용하는 "모델링 언어"입니다.
- 시스템의 산출물을 규정하고 문서화하기 위한 "시각적인 언어"입니다.
- UML이 등장하기 이전에, 다양한 객체 모델링 방법이 공존하였습니다. 이 점에 많은 불편함이 있어서 통합한 모델링 방법을 UML이라고 합니다. (Unified : 통합)
UML 모델의 기본 구성 요소
- UML의 기본 구성 요소에는 크게 사물(Things)과 관계(Relationships)가 있습니다. 사물에는 Actor, Class, Use Cases, Package, Component, Node, note가 있고 관계에는 일반화관계(Generalization), 실체화 관계(Realization), 의존관계(Dependency), 연관관계(Association)가 있습니다.
- 다시 의존관계는 확장 의존관계(Extend)와 포함 의존관계(Include)로 나뉘며 연관관계는 연관관계(Association), 직접 연관관계(Direct), 집합 연관관계(Aggregation), 나뉩니다.
UML의 사물을 정리하면 다음의 표와 같습니다.
사물(Things) |
Actor |
Class | |
Use Cases | |
Package | |
Component | |
Node | |
Note |
UML의 관계를 정리하면 다음의 표와 같습니다.
관계(Relations) | 일반화관계(Generalization) | |
실체화관계(Realization) | ||
의존관계(Dependency) | 확장의존관계(Extend) | |
포함의존관계(Include) | ||
연관관계(Associate) | 연관관계(Associate) | |
직접연관관계(Direct) | ||
집합연관관계(Aggregation) | ||
합성연관관계(Composition) |
- 확장 의존관계와 포함 의존관계는 화살표의 방향성으로 구분됩니다.
이제 관계에 대해서 각각 자세하게 살펴보도록 하겠습니다.
1. 일반화 관계(Generalization) : 상속
- 'is-a-kind-of' 관계 (SCV is a kind of Unit)
- 부모 객체가 사용되는 모든 곳에, 자식 객체를 사용 가능
- 자식 객체는 부모 객체의 구조와 행동을 공유
- ex) class, actor, use case, package
코드
public class Unit{
}
public class SCV extends Unit{
}
public class Probe extends Unit{
}
public class Drone extends Unit{
}
2. 실체화 관계(Realization) : 구현
- 한쪽 요소에는 다른 쪽 요소가 수행하기로 되어 있는 계약을 구현
- 인터페이스와 클래스 (인터페이스를 받아 추상 메서드를 오버라이딩)
- Use case와 Use case의 실현
코드
//인터페이스, true/false를 리턴
public interface CheckLogic{
public boolean isTrue();
}
//Realization - 인터페이스 메소드 구현
public class RainCheckLogic implements CheckLogic{
@override
public boolean isTrue(){
return true;
}
}
3. 의존관계(Dependency) : 참조
- 사용 관계
- 한쪽 사물의 변화가 다른 사물에 영향을 주는 관계
- 한 클래스가 다른 클래스를 operation의 매개변수로 사용하는 경우에 주로 사용
- 두 클래스의 관계가 메서드를 실행하는 동안만 유지됨
public class A{
public void dependency(B param){
B b = para;
}
}
public class B{
}
4. 연관관계(Association)
- 모델 요소 사이의 구조적인 관계를 표현함
- 클래스의 속성으로 실현됨
- 개념적으로 같은 수준에 위치
- 두 클래스가 서로 연관관계에 있다면 한 쪽 객체에서 다른 객체를 참조할 수 있음을 의미함
코드
class Company{
Person employee; //직원
Company(Person employee){
this.employee = employee;
}
}
class Person{
Company employer; //고용주
private String name;
private int age;
private String job;
Person(String name, int age, String job, Company employer){
this.name = name;
this.age = age;
this.job = job;
this.employer = employer;
}
}
직접 연관관계(Directional)
연관관계(Bi-Directional)와는 다르게 한쪽으로만 방향성이 있는 연관관계를 의미하며 화살표로 방향성을 나타냅니다.
위의 예시에서는 Student객체는 Course객체를 참조할 수 있지만, Course객체는 Student객체를 참조할 속성이 없습니다. 이를 직접 연관관계, 단방향 연관관계를 갖는다고 합니다.
코드
public class Student{
private String name;
private Vector<Course> course;
public Student(String name){
this.name = name;
courses = new Vector<Course>();
}
public void registerCourse(Course course){
courses.add(course)
}
public void dropCourse(Course course){
if (courses.contains(course)){
courses.remove(course);
}
}
public Vector<Course> getCourse(){
return courses;
}
}
public class Course{
private String name;
public Course(String name){
this.name = name;
}
public String getName(){
return name;
}
}
5. 집합 연관관계(Aggregation)
- 하나의 클래스가 여러 개의 컴포넌트 클래스로 구성되어있는 경우
- 전체/부분 연관 관계, 'has-a'관계
- 일부분이 되는 관계
public class Car{
Engine engine;
Wheel wheels;
}
public class Engine{
}
public class Wheel{
}
6. 합성 연관관계(Composition)
합성 연관관계는 집합 연관관계와 다르게 범위가 가장 큰 Person class가 삭제되면 그 컴포넌트들인 Leg와 Hand도 동시에 삭제됩니다.
집합연관관계 예시에서는 Car가 삭제된다고 해도 Engine과 Wheel이 삭제된다고 보지는 않습니다.
코드
public class Person{
private Hand hand;
private Leg leg;
public Person(Hand hand, Leg leg){
this.hand = hand;
this.leg = leg;
}
public void growUp(){
hand.growUp(1);
leg.growUp(20);
}
}
public class Hand{
}
public class Leg{
}
반응형
'[컴퓨터공학] > [소프트웨어공학]' 카테고리의 다른 글
[소프트웨어공학] SOLID - 단일 책임 원칙(Single Responsibility Principle) (0) | 2022.05.01 |
---|---|
[소프트웨어공학] 순차 다이어그램(Sequence Diagram) (0) | 2022.03.22 |
[소프트웨어공학] 유스케이스 다이어그램(Use-case Diagram) (0) | 2022.03.18 |
[소프트웨어공학] 컴포넌트 다이어그램(Component Diagram) (0) | 2022.03.18 |
[소프트웨어공학] 클래스 다이어그램(Class Diagram) (0) | 2022.03.17 |