*관계 - 4가지로 구분

-1. 일반화
-2. 실체화
-3. 의존관계
-4. 연관관계 
    -1)직접 연관
    -2)집합 연관
    -3)복합 연관

 


관계명

설명

관계

Generalization(일반화 관계)

일반적인 것(동물)과 특화된 것(포유류)과의 관계

상속

Realization(실체화 관계)

인터페이스와 그것을 구현한 것과의 관계

구현

Dependency(의존관계)

어떤 클래스가 다른 클래스를 참조하는 관계

참조

 

1) 일반화 관계

일반화 관계는 쉽게 말해 상속 관계

ex) User 라는 클래스를 상속받은 Customer 와 Admin 클래스

public class User {    
    private String id;
    private String pass;
    
    public void login(){}
}
 
public class Customer extends User {
    @Override
    public void login() {
        //일반 유저의 로그인...
    }
}
 
public class Admin extends User {
    @Override
    public void login() {
        //관리자 로그인
    }
}

2) 실체화

실체화는 인터페이스를 구현받아 추상 메서드를 오버라이딩 하는 것을 의미

이것은 UML 로 표기하는데 두가지 방법이 있다.

방법은 다르나 같은 표기

public class DateCheckLogic implements CheckLogic {
    @Override
    public boolean isTrue() {
        return true;
    }
}

 


3) 의존(Dependency)

의존 관계는 어떤 클래스가 다른 클래스를 참조하는 것을 의미

이 참조 형태는 객체 생성이나 사용 메서드 호출, 매개변수로 객체 사용 등이며, 

해당 객체는 사용 후 참조를 유지 하지 않음. 

클래스간 객체화 및 메서드 사용은 빈번한 일 이므로 가장 많이 사용되는 관계이다

public class Driving {
 
    public static void main(String[] args) {
        Car myCar = new Car();
        myCar.turnOn();
        myCar.turnOff();
    }
}
 
public class Car {
    
    public void turnOn(){
        System.out.println("시동이 켜졌습니다.");        
    }
    
    public void turnOff(){
        System.out.println("시동이 꺼졌습니다.");
    }
 
}

 


4) 연관관계(Association)

연관 관계는 직접연관, 집합연관, 복합 연관으로 나뉜다

관계

설명

직접연관

화살표의 방향에 따라 참조를 나타냄

집합연관

whole(몸통) part(액세서리)의 관계(몸통이 죽어도 부분은 살아남는다.)

복합연관

whole(몸통) part(신체일부분)의 관계(몸통이 죽으면 부분도 같이 죽는다.)


 

- 1) 직접 연관

이놈이 -> 이놈을 참조

직접 연관은 한 클래스가 다른 클래스를 참조하는 관계

이 부분은 의존(Dependency)와 헷갈릴 수도 있으나 차이가 있다.

관계

차이점

의존

참조하는 객체나 클래스가 사용 후 사라지는 관계

직접연관

참조하는 객체나 클래스가 사용 후에도 유지되는 관계

 

직접 연관 관계는 객체화 하지 않은 클래스 자체를 참조 하는 것 이라고 할ㅅ 있다.

import java.util.List;
 
public class User {    
     private List<Address> addr;
 }

 

위 그림은 User 가 Address 를 참조한다는 의미이다.

1…* 은 대상 클래스가 가질 수 있는 인스턴스의 개수 범위를 나타낸다

점(…) 을 기준으로 앞에 값은 최소값, 뒤에 값은 최대값을 의미하는데 

1…* 이라면 객체가 최소 1개는 사용되어야 하고, 최대 값은 정하지 않는다는 뜻 이다.
0…* 이라면 객체화 하지 않아도 무방하며, 최대값도 정해지지 않은 상태로 * 만으로도 표현 가능 하다.


추가로 List 라는 컬레션 프레임워크를 사용한 점과 이것을 addr 변수에 담았다는 내용.
그것을 표현하기 위해서는 아래와 같이 두 가지 방법이 있다.

 

public class Subject {    
    public String name;
}
 
public class Grade {    
    public Subject subject = null;
    public String grade;
}
  
import java.util.List;
 
public class Student {    
    private List<Grade> gradeList = null;
}


보면 아래와 같은 순서로 UML 을 그릴 수 있다.

1. Grade 는 Subject 를, Student 는 Grade 를 참조 한다.
2. Grade 클래스는 Subject 클래스를 subject 변수에 1 개만 객체화 가능 
3. Student 클래스는 Grade 클래스를 gradeList 변수에 List 형태 참조하여 가져옴 객체생성은 1~무한대

 

최종적으로 3번과 같은 그림이 그려진다.

* 의존과 연관 : 객체가 유지되느냐 사라지느냐 라는 차이

* 유지된다 -> 전역변수에 객체가 보관되어 클래스 생명 주기 까지 유지된다.

* 사라진다. -> 지역 변수에 객체 보관되어 메서드 종료 시 사라진다.


 

- 2) 집합 연관(Aggregation)

몸통 ◇-> 부분

 

집합연관은 전체와 부분의 관계 입니다.

하지만 직접 연관과는 코드상에 차이를 구분하기가 참으로 애매한 것도 사실 입니다.

그래서 가급적으로 사용하지 않는다는 주장들이 있고, 거의 그렇게 되어가는 추세 입니다

 

public class Computer {
    
    private Monitor screen;
    private Body body;
    private Keyboard keyboard;
    
    public Computer(Monitor screen, Body body, Keyboard keyboard){
        this.screen = screen;
        this.body = body;
        this.keyboard = keyboard;
    }
 
}

 

위 소스를 보면 외부 클래스를 생성시 받아 오지만 객체화를 외부에서 한다
그래서 Computer 클래스가 종료된다고 하더라도 screen, body, keyboard 의 객체는 여전히 살아 있고,
몸체(Computer)가 죽어도 액세서리(screen, body, keyboard) 가 남는 관계라고 한다


 

 

- 3) 복합 연관(Composition)


몸통 ◆-> 부분

복합연관이 집합연관과 다른 점은 앞서 말했듯이 몸체 클래스가 죽었을 경우 다른 객체도 함께 죽는 다는 것 이다. 

 

public class Computer {
    
    private Monitor screen;
    private Body body;
    private Keyboard keyboard;
    
    public Computer(){
        this.screen = new Monitor();
        this.body = new Body();
        this.keyboard = new Keyboard();
    }
 
}

 

잘 살펴 보면 이번에는 객체화가 내부에서 이루어 진다는 것을 발견 할 수 있다.

즉, 몸체 클래스 안에서 생성된 녀석 이기 때문에 몸체 클래스가 죽으면, 해당 객체들도 자연히 죽는다

 

- 집합 : 안경은 내 몸 에서 생긴 것이 아니기 때문에 내가 죽더라도 남게 된다.

- 복합 : 심장은 내 몸 안에서 생긴 것 이기 때문에 내가 죽으면 같이 죽게 된다.

'UML' 카테고리의 다른 글

UML 이란  (1) 2019.05.18

+ Recent posts