UML | Class Diagram

호떡·2022년 12월 13일
0

객체

도형(class, interface)을 추가한다.

  • 클래스 이름은 대문자로 시작
  • 메서드와 필드는 모두 소문자로 시작
  • 메서드 이름은 동사로 시작

관계선


💡 관계선 등록하기


관계선의 종류

  1. Implementation(Realization) : 구현화, interface를 구현

  1. Generalization : 일반화, 부모 클래스를 상속

  1. Dependency

  • 외부 클래스를 사용하는 관계이다.
  • 단, 외부 클래스를 임시적으로 사용하는 관계이다. 즉 클래스가 참조를 유지하지 않는다.

👉 아래의 예제를 통해 알아보자.

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로 표현하면 다음과 같다.

  1. Association

다른 클래스를 사용하는데, 참조를 유지하는 방식


💡 Association은 Has a 관계이다.
Has a 관계에서, 소유 정도(세기)가 다르다.

Association은 지니고 있으며, 버릴 수도 있을 때
Aggregation은 Association 보다 좀더 강한 소유 혹은 여러 개를 가지고 있을 때
Composition은 완전한 소유이며, 없어서는 안될 때

세 관계는 모두 "has a" 관계이며, 세 관계 모두 Association이라고 해도 된다.
Association > Aggregation > Composition

Association과 Aggregation은 구분이 확실치 않다. (UML 표준에서도 제거하려다가 취소했었음) 따라서 Aggregation을 Association라고 불러도 된다.

  • 단순한 배열이면 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();
    }
}

0개의 댓글