[컴퓨터공학]/[소프트웨어공학]

[소프트웨어공학] UML 정의와 종류

딥러닝 도전기 2022. 3. 16. 22:47

[소프트웨어공학] 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-Things

 


 

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) 

  • 모델 요소 사이의 구조적인 관계를 표현함
  • 클래스의 속성으로 실현됨
  • 개념적으로 같은 수준에 위치
  • 두 클래스가 서로 연관관계에 있다면 한 쪽 객체에서 다른 객체를 참조할 수 있음을 의미함

Bi-Directional 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)와는 다르게 한쪽으로만 방향성이 있는 연관관계를 의미하며 화살표로 방향성을 나타냅니다.

Directional Association

 위의 예시에서는 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{
}
반응형