프로젝트를 진행하다 보니 클래스들의 개수 자체도 많아지고 성능향상을 위해서 디자인 패턴 같은것도 적용하려고 하다 보니 코드를 파악하는게 머리아파 지기 시작했다.
그래서 디자인 패턴을 공부하기 위해서 기본적인 UML다이어 그램에 대해 공부하려고 한다.
그리고 예제 코드는 JAVA로 할것이다.
1. 기능적 모델링, 시스템의 기능을 나타낸다.
2. 정적 모델링, 시스템의 구조를 나타낸다.
3. 동적 모델링, 시스템의 동작을 나타낸다.
클래스 다이어그램만 일단 다루어 볼 것이다.
abstract class Parent{
int someVar1;
static char someVar2;
abstract void someMethodA();
double someMethodB(){
}
}
//Parent클래스를 상속받는 클래스
class Child extends Parent {
void someMethodA(){
}
static void someMethodC(){
}
}
다음과 같은 두 클래스의 관계를 클래스 다이어그램으로 표현하면 다음과 같다.
클래스 기본 표현 형태는 위와 같이 표현한다
위에서부터 순서대로 클래스이름, 필드(변수), 메소드를 이름만 작성해서 표현한다.
- + # ~ 은 접근지정자에 대한 표시이다
- + public
- - private
- # protected
- ~ default
상속은 위와같은 화살표로 표현한다.
화살표는 여러 종류가 있는데 사용경우는 다음과 같다
static과 추상요소는 다음으로 표현한다.
추상클래스 {abstract}
이탤릭체 로 클래스이름을 작성하거나 클래스 이름 아래에 태그로 {abstract}로 표현
추상메소드 {abstract}
자식에서 구현해야하는 메소드, 클래스와 마찬가지로
이탤릭체 로 이름을 작성하거나 이름 옆에 태그로 {abstract}로 표현
static 필드
필드 = 변수라고 이해하면 됨
이름에 밑줄로 표현한다.
static 메소드
필드와 마찬가지로 밑줄을 그어서 표현한다.
이 다이어그램의 경우 다음 코드를 도식화 한것이다.
interface Printable{
abstract void print();
abstract void newPage();
}
class Print implements Printable{
void print(){
}
void newPage(){
}
}
interface의 경우 클래스 이름 표현하는곳 위에 << interface >> 라고 표기해야 된다
interface의 구현
의 경우 점선 화살표로 표기한다.
interface의 경우 abstract가 생략가능하다, 모든 메소드가 추상메소드 이기 때문 고로 interface의 메소드를 표현하는 경우에는 이탤릭으로 표현해야 함
다음과 같이 클래스간의 연관관계를 표현한다.
연관관계란? “객체 간의 상호 참조 관계” 정도로 생각하면 된다.
즉 클래스간에 서로의 객체를 얼마나 사용하는지를 표현한다.
class Man{
public Woman wife;
}
class Woman{
public Man husband;
}
다음 코드를 연관관계로 표시하면 다음과 같다.
Man클래스와 Woman클래스는 wife객체와 husband객체로 서로 한번씩 참조하고 있는 관계이다.
하단의 숫자는 참조하는 횟수를 작성한것이고 각 클래스 옆 상단에 단어는 다른 클래스에서 자신을 참조하는 이름을 작성한다.
class Man{
public Woman wife;
}
class Woman{
//none
}
위의 관계는 Man클래스만 Woman클래스를 참조하는 관계이다.
때문에 Man클래스가 Woman클래스를 가리키는 화살표로 표현하였다
참조횟수와 참조한 객체 이름을 Woman클래스 옆에 작성하였다
숫자는 참조한 횟수를 표현한다.
연관관계에서 한쪽만 참조하는 경우 다음과 같은 화살표를 사용한다.
위처럼 한번만 참조할 수 도 있지만 클래스타입의 배열로 n개를 참조할 수 도 있다.
public class Child
{
private Mother mom;
public void setMom(Mother mom){ };
}
public class Mother
{
private Child[] theKids = new Child[20];
public void addChild(Child ch) {…};
…
}
이 코드는 여러명의 자식을 슬하에 둔 어머니의 관계를 클래스로 표현한것이다.
도식화 하면 다음과 같다.
n번 참조하는 경우 숫자를 표현하는곳에 *를 이용해서 표현한다
연관관계의 일종이다
집합 관계(Aggregation)는 UML 다이어그램에서 두 클래스 간의 부분-전체 관계를 나타내는 관계 중 하나이다.
이는 한 객체가 다른 객체의 일부가 될 수 있지만, 그 부분 객체는 독립적으로 존재할 수 있음을 의미합니다.
class Fruit{
Color color;
}
class Basket{
Fruit[] fruits;
}
다음은 집합관계를 표현하는 예제 코드이다 과일 클래스와 과일을 여러개 담는 바구니 클래스를 정의했다.
둘의 관계는 다음과 같이 표현이 가능하다
과일은 과일바구니에 속하지만 독립적으로도 존재 가능하다 이러한 관계가 집합관계이다.
화살표는 방향성을 나타내는것으로 Basket은 Fruit으로만 갈수 있음을 의미한다.
표현은 다음과 같이 표현한다
의존관계란? 한 요소가 변경되면 다른 클래스도 변경되는 것을 말한다.
예) import
크게보면 상속도 의존관계라고 할 수 있음, 의존 관계에서 가장 약한 의존
클래스 다이어그램에서 의존관계는 꼭 표기할 필요가 없다면 생략하여 표현한다.
(의존관계가 그만큼 흔하기 때문)