*관계 - 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();
}
}
잘 살펴 보면 이번에는 객체화가 내부에서 이루어 진다는 것을 발견 할 수 있다.
즉, 몸체 클래스 안에서 생성된 녀석 이기 때문에 몸체 클래스가 죽으면, 해당 객체들도 자연히 죽는다
- 집합 : 안경은 내 몸 에서 생긴 것이 아니기 때문에 내가 죽더라도 남게 된다.
- 복합 : 심장은 내 몸 안에서 생긴 것 이기 때문에 내가 죽으면 같이 죽게 된다.