도형(class, interface)을 추가한다.
💡 관계선 등록하기
👉 아래의 예제를 통해 알아보자.
interface Coffee {
void drink();
void make();
}
class Latte implements Coffee {
@Override
public void drink() {
System.out.println("라떼 냠냠");
}
@Override
public void make() {
System.out.println("라떼 만드는 중");
}
}
class Americano implements Coffee {
@Override
public void drink() {
System.out.println("아메리카노 냠냠");
}
@Override
public void make() {
System.out.println("아메리카노 만드는 중");
}
}
❌ 아래의 경우는 Dependency가 아니다.
class Person {
Coffee coffee = new Latte();
void drink()
{
coffee.drink();
}
}
class Person {
Coffee coffee;
void select(Coffee coffee)
{
this.coffee = coffee;
}
void drink()
{
coffee.drink();
}
}
⭕ Dependency인 경우는 다음과 같다.
Dependency의 기본적인 세 가지 형태는 Local, Parameter, Factory이다.
1) Local
// 지역변수로 쓰이고 유지되지 않는 경우
class Person {
void eat()
{
Coffee coffee = new Latte();
}
}
UML로 표현하면 다음과 같다.
2) Parameter
// 파라메터로 사용되고 저장되지 않는 경우
class Person {
void eat(Coffee coffee)
{
// ...
}
}
UML로 표현하면 다음과 같다.
3) Factory
// 생성해서 호출한 곳으로 return만 할 뿐 참조한 것을 보관하고 있지 않는 경우
class Person {
Coffee makeCoffee()
{
return new Latte();
}
}
UML로 표현하면 다음과 같다.
다른 클래스를 사용하는데, 참조를 유지하는 방식
💡 Association은 Has a 관계이다.
Has a 관계에서, 소유 정도(세기)가 다르다.
Association은 지니고 있으며, 버릴 수도 있을 때
Aggregation은 Association 보다 좀더 강한 소유 혹은 여러 개를 가지고 있을 때
Composition은 완전한 소유이며, 없어서는 안될 때
세 관계는 모두 "has a" 관계이며, 세 관계 모두 Association이라고 해도 된다.
Association > Aggregation > Composition
Association과 Aggregation은 구분이 확실치 않다. (UML 표준에서도 제거하려다가 취소했었음) 따라서 Aggregation을 Association라고 불러도 된다.
1) Association 3
class Person {
Coffee myCoffee;
void buy(Coffee coffee) {
this.myCoffee = coffee;
}
}
// drink()가 호출될 때 유지상태가 시작
class Person {
Coffee myCoffee;
void buy() {
this.myCoffee = new Latte();
}
}
UML로 표현하면 다음과 같다.
2) Aggregation 2
// 많이 가지고 있을 때
class Person {
ArrayList<Coffee> coffeeBox;
void make(Coffee coffee) {
if(coffeeBox == null) coffeeBox = new ArrayList<>();
coffeeBox.add(coffee);
}
}
UML로 표현하면 다음과 같다. Association으로 표현해도 무방하다.
3) Composition 2
// Person 객체가 생성되면 Coffee도 함께 생성된다.
// 동시에 myCoffee는 Person이 소멸하면 없어진다.
class Person {
Coffee myCoffee = new Latte();
}
// 생성자에 선언되었으므로
// Person 객체가 생성되자마자 Coffee가 생성되어 유지상태가 지속
class Person {
Coffee myCoffee;
Person() {
this.myCoffee = new Latte();
}
}