블링블링 범블링

UML-Relationship(관계) 본문

Technology/객체 지향 디자인 패턴

UML-Relationship(관계)

뻠스키 2018. 4. 17. 02:06

UML-Relationship(관계)


UML에서 가장 중요하다고 생각되는 부분이 관계다. 그만큼 어려운 부분이기도 하다. 시간이 걸리겠지만 정리를 해보려고한다.



관계는 구성 요소들 간의 관계성을 표현하며, 주로 클래스들간의 표현 시에 사용된다. 크게 의존(Dependency), 연관(Association), 일반화(Generalization), 실체화(Realization) 관계로 이뤄져있다. 그림과 예시를 통해서 설명해볼 것이다.


1. Dependency Relationships(의존 관계)


[개념]

하나의 클래스에 변화가 있으면 다른 클래스에도 변화가 가는 것을 두 클래스는 의존 관계에 있다고 말할 수 있다.


1) 한 클래스의 메소드가 다른 클래스의 개체를 인자로 받아 그 메소드를 사용할 경우를 의존관계라고 말한다.

2) 한 클래스의 메소드 내부에서 다른 클래스의객체를 생성해 그 메소드를 사용한다.

3) 다른 클래스의 메소드가 또 다른 클래스의 객체를 반환한다. 이때 이 메소드를 호출하여 반환되는 객체의 메소드를 사용한다.


[표기법]

표기 방법은 점선 활살표를 이용한다 A가 B를 의존할 때 A->B방향으로 표기한다.



[예시와 코드]



위의 그림에 따라 코드로 표현한 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Student {
     
    private int money = 10000//가지고 있는 돈
     
    public int getMoney() {
        return money;
    }
}
 
public class Wallet{
     
    private int applePrice = 1000; //사과가격
     
    public boolean isPay(Student stu) {//살수있나?
         
        if(stu.getMoney()>applePrice)return true;// 구매가능
        else return false;//구매 불가능
    }
}


2. Association Relationships(연관 관계)


[개념]

하나의 객체가 다른 객체와 연관관계에 있다는 것을 의미하며 특정 클래스의 인스턴스가 작업을 수행하기 위해서는 다른 클래스를 알아야 한다.


[표기법]

1)다중도

1) *    : 0,1, 또는 그 이상을 의미한다.

2) 1    : 정확히 1개

3) 2..4 : 2~4개

4) 3..* : 3개 이상

2)이름 

객체들의 관계이름

3)방향성

질의의 방향이나 객체 사이의 실선으로 표시하며 양쪽 방향인 경우는 화살표시를 하지 않는다.




[코드]



위의 그림에 따라 코드로 표현한 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class School {
    public String name;
     
    School(String name){
        this.name =name;
    }
}
 
 
public class Student {
     
    School school_name;//학교
     
    private int Id;
    private int age;
 
    Student(int id, int age, School school_name){
        this.Id =id;
        this.age =age;
        this.school_name = school_name;
    }
 
}


[연관관계의 세부종류]

1.집합연관(Aggregation Relationship)

두 클래스가 전체-부분관계(Whole-part)에 있는 것을 말한다. 각 클래스는 독립적인 생명주기를 가지고 있다고 할 때 예를 들어서 학교를 들어보면 학교에는 학생과 선생님 등이 있다. 학교가 사라진다고 할 때 학생이 사라지는 것은 아니며 역으로 학생들이 사라지는 것은 학교가 사라지는 것이 아니다. 집합연관이 있는 클래스는 화살표 대신 색이 칠해지지 않은 다이아몬드로 표현한다. 




[소스 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class School {
     
    public Student stu;
    public Teacher tea;
     
    School(Student stu, Teacher tea){
        this.stu =stu;
        this.tea =tea;
    }
     
}
 
 
public class Student{
    Student(){
         
    }
}
 
public class Teacher{
    Teacher() {
     
    }
}


2.복합연관(Composition Relationship)

두 클래스가 부분-전체관계(part-whole)에 있는 것을 말한다. 부분의 생명주기가 전체에 영향을 받는다. 즉, 집합관계보다 더 강한 연관관계를 가진다. 예를 들면 학교에는 교실이 있다. 학교가 사라지면 교실도 사라지는 것으로 들 수 있고, 손과 손가락도 그 예가 된다. 복합연관에서는 다이아몬드가 색이 칠해져있다.



[소스 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class School {
     
        public ClassRoom room;
     
    School(Student stu, Teacher tea){
         
        room = new ClassRoom();
    }
     
}
 
public class ClassRoom{
    ClassRoom(){
         
    }
}


2. Generalization Relationships(일반화 관계)


[개념]

대표적으로 객체지향에서 상속관계를 말한다. 예를 들어 과일에는 사과, 바나나, 딸기 등이 있는 것을 상속관계에 있다고 말한다. 과일이라는 부모 클래스와 각각의 과일 종류의 자식 클래스가 있을 때 부모 클래스가 자식클래스를 가리키면 일반화(Generalization)관계에 있다고하고, 반대의 경우를 특수화(Specialization) 관계라고 한다.


[표기법]
화살표는 부모 클래스의 종류에 따라 다르다. 부모클래스가 일반 클래스인 경우 실선과 화살표를 사용하고, 추상 클래스인 경우는 실선과 화살표를 사용한다. 



[소스코드]

위의 그림에 따라 코드로 표현한 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Fruit {
    public String name;
    public String season;
     
    public grow() {
         
    }
}
 
 
public class Apple extends Fruit{
     
    public Apple() {
         
    }
}
 
public class StrawBerry extends Fruit{
    public Banana() {
     
    }
}
 
public class Banana extends Fruit{
    public Banana() {
         
    }
}


4. Realization Relationships(실제화 관계)


[개념]

인터페이스와 실제 구현된 일반 클래스간의 관계를 말한다. 일반화 관계는 존재하는 객체에 대한 오버라이딩(재구현)을 말하지만 실제화 관계에서는 존재하는 행동에 대한 구현을 말한다. 예를 들어서 공격하다라는 행동이 있을 때 '말한다' 행동을 가지는 동물, 사람, 식물이 될 수 있다. 이처럼 행동만 정의된 객체를 인터페이스라하고, 이를 구체적으로 구현한 것과의 관계를 실제화 관계에 있다고 말한다.


[표기법]

일반화 관계와 비슷하나 점선을 통해 나타낸다.



[소스코드]

위의 그림에 따라 코드로 표현한 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public interface Speak{
     
    public void Howspeak();
}
 
public class Human implements Speak{
    public void Howspeak() {
         
    }
}
 
public class Animal implements Speak{
    public void Howspeak() {
         
    }
}
 
public class Plant implements Speak{
    public void Howspeak() {
         
    }
}


Comments