본문 바로가기
Concepts/UML

UML - 클래스 다이어그램 고급 - 한정 연관

by ocwokocw 2021. 2. 10.

- 이 글은 UML Distilled (마틴 파울러)책을 기반으로 작성하였습니다.

- 한정 연관(Qualified association)

한정 연관은 UML 에서 관계 배열, 맵, 해시, 딕셔너리로 표현할 수 있다.

 

위 다이어그램은 Order 클래스와 OrderLine 클래스 사이의 관계를 Product를 이용하여 한정자(Qualifier)를 표시한것이다. 여기서 Product 의 인스턴스는 각 하나의 OrderLine 만 존재한다는것을 표현한다.

 

한정 연관에서 다중성을 잘 해석해야 한다. OrderLIne 의 0..1 다중성은 Product에 대한 것이지 Order에 대한것이 아니다. Order 는 여러 개의 OrderLine 을 가질 수 있더라도 위의 다이어그램에서 다중성 상한 1(0..1)이 나타내는것은 Product 맥락에서 다중성이다.

 

이를 Java 로 나타내면 어떻게 될까? 일반적인 속성과 같이 getter/setter 오퍼레이션을 단순하게 제공하면 될까? 코드에 한정이라는 개념을 표현해보자.

 

public class Product {

	private String name;
	private int price;

	public Product(String name, int price) {
		super();
		this.name = name;
		this.price = price;
	}
}

public class OrderLine {

	private int amount;
	private Product product;

	public OrderLine(int amount, Product product) {
		super();
		this.amount = amount;
		this.product = product;
	}
}

public class Order{

	private Map<Product, OrderLine> lineItems;
	
	public OrderLine getLineItem(Product product) {
		return lineItems.get(product);
	}
	
	public void addLineItem(int amount, Product product) {
		OrderLine newOrderLineForProduct = new OrderLine(amount, product);
		lineItems.put(product, newOrderLineForProduct);
	}
}

 

일단 제품명과 가격 속성을 가지고 있는 Product 클래스를 정의하였다. 그리고 해당 제품을 얼마나 주문하는지를 정의한 OrderLine 클래스가 있다. Order 에서는 여러 개의 OrderLine 갖는다. 예를 들어 "이번 주문에서는 TV 1대와 에어컨 2대를 주문한다." 라는 개념이라고 할 수 있다.

 

위 코드에서 한정 연관을 표현한 부분은 Order의 lineItems 를 Product key로 하는 map으로 정의했다는것이다. 사용자는 "내가 TV 와 에어컨을 주문한건 기억이 나는데, TV 를 몇 대 주문했고, 어떤 TV를 주문했었지?" 궁금해하며 TV 주문건에 대한 상세 정보(OrderLine)를 궁금해한다. 이 때 Product를 통해서 접근해야 한다. 그리고 해당 Order에서 신규 OrderLine을 추가할때에도 마찬가지다.

 

개념 모델링에서 위의 개념은 "Order의 Product당 하나의 Order Line만 존재한다." 를 한정 연관을 이용해 표현한것이다. 한정 연관의 다중성 상한이 꼭 1인 것은 아니다. 한정 연관이라도 다중성이 * 일 수 있다. "Order의 Product당 여러 개의 Order Line이 존재한다."로 표현할 수 있다. 다만 일반적인 연관과 다른 점은 "Product당" 이라는 한정 표현에 있다.

댓글