본 게시물은 도서 [UML 실전에서는 이것만 쓴다]의 내용을 재구성 하여 작성하였습니다. 본 게시물이 출판사/작가의 저작권의 침해할 소지가 있는 경우 비공개/삭제 될 수 있음을 알립니다.
다수성
객체는 다른 객체들의 배열이나 벡터를 가질 수 있으며, 같은 종류의 객체라도 배열이 아니라 여러 인스턴스 변수에 따로 가질 수도 있다. UML에서는 이런 상황을 연관의 먼 쪽 끝에 다수성(multiplicity) 표현식을 적어서 표현한다. 다수성 표현식은 단순한 숫자나 숫자 범위를 사용하거나, 또는 이 둘을 같이 사용할 수도 있다. 아래의 예시는 다수성을 사용하는 BinaryTreeNode 이다
다음 형식들을 사용할 수 있다
- 숫자 원소의 정확한 숫자
- * 또는 0..* 0개 또는 그 이상
- 0..1 0개 또는 1개. 자바에서는 흔히 null 값을 가질 수도 있는 참조로 구현된다.
- 1..* 1개 또는 그 이상
- 3..5 3개 에서 5개까지
- 0, 2..5, 9..* 바보 같지만, 올바른 형식이다.
연관 스테레오타입
연관에 스테레오타입을 붙여서 의미를 바꿀 수 있다. <<create>> 스테레오타입은 연관의 원본이 연관의 대상을 생성함을 나타낸다. 이 스테레오타입에는 원본이 대상을 생성해서 이 대상을 시스템의 다른 부분에 넘긴다는 뜻이 들어 있다. 이 예제에서 나는 전형적인 팩터리를 보이고 있다.
<<local>> 스테레오 타입은 원본 클래스가 대상 클래스의 인스턴스를 만들고 그 인스턴스의 참조가 지역 변수에 담길 때 사용한다. 이 스테레오타입에는 생성한 인스턴스의 수명이 그 인스턴스를 만드는 멤버 함수 안에 한정된다는 뜻이 들어 있다. 그러므로 이 객체는 멤버 변수에 할당되지 않으며 시스템의 다른 부분에 전달되지도 않는다.
<<parameter>> 스테레오타입은 원본 클래스의 멤버 함수가 호출될 때 대상 인스턴스가 인자로 넘어옴으로써 원본 클래스가 대상 클래스에 접근할 수 있게 됨을 보여 준다. 이 스테레오타입에도 원본은 그 멤버 함수가 리턴한 이후에 그 객체에 대해 모두 잊는다는 뜻이 들어 있다. 대상은 원본 클래스의 인스턴스 변수에 저장되지 않는다.
아래 그림에서 보듯 의존성 화살표를 점선으로 그리는 것이 인자를 나타내는 약속으로 널리 편리하게 쓰인다. 나는 <<parameter>> 스테레오타입보다 이쪽을 더 좋아한다.
<<delegate>> 스테레오타입은 원본 클래스의 멤버 함수가 호출될 때 이 호출을 대상 클래스에 그대로 전달해서 대상 클래스의 멤버 함수를 호출하는 경우 등에 사용된다. 프록시(Proxy), 데코레이터(Decorator), 컴포지트(Composite) 처럼 이 기법을 사용하는 디자인 패턴이 꽤 있다. 나는 이 패턴을 자주 쓰이는 이 표기법이 꽤 유용하다.
내부 클래스
내부 클래스는 그림 3.21처럼 연관의 가까운 쪽 끝에다가 내부에 십자 표시를 한 원을 덧붙여서 표현한다.
익명 내부 클래스
익명 내부 클래스는 자부의 흥미로운 기능이다. 익명 내부 클래스에 대한 UML의 공식 입장은 없지만, 아래의 표기법을 쓰고 있다. 이 표기법은 간결한 데다 필요한 것도 모두 설명한다. 익명 내부 클래스는 <<anonymous>> 스테레오타입과, 자신이 구현하는 인터페이스의 이름을 가지는 중첩된 클래스로 표현한다.
연관 클래스
다수성을 표기한 연관을 보면 연관의 원본이 연관 대상의 여러 인스턴스와 연결된 다는 것을 알 수 있다. 다이어그램만 보고 어떤 종류의 컨테이너 클래스가 사용되는지 알아낼 수는 없지만 아래의 그림처럼 연관 클래스를 사용하면 이 정보도 나타낼 수 있다.
연관 클래스는 특정한 연관을 어떻게 구현하는지 보여 준다. 다이어그램에서 연관 클래스는 연관과 점섬으로 연결된 보통 클래스로 그린다. 우리 자바 프로그래머는 이것을, 원본 클래스가 사실 연관 클래스의 참조만 가지고 있고, 연관 클래스가 모든 대상의 참조를 가진다는 의미로 받아들인다.
연관 클래스는 약한(weak), 부드러운(soft), 유령(phantom) 참조처럼 특별한 형태의 참조를 나타내려고 사용하기도 하지만 이 표기법을 이런 목적으로 사용하는 것은 그다지 깔끔하지 못하며, 아마 아래의 그림처럼 스테레오타입을 사용하는 편이 나을 것이다.
연관 한정사
일반적인 자바 참조가 아니라 어떤 종류의 키나 토큰을 통해 연관을 구현할 경우, 연관 한정사(association qualifier)를 사용한다. 아래의 그림은 직원(Employee)과 연관된 로그인 서블릿(LoginServlet) 예제다. 로그인 서블릿과 직원 사이의 연관은 대상 직원에 대한 데이터베이스 키를 담은 멤버 변수 empid를 통해 맺어진다.
결론
UML에는 수많은 위젯과 장식물 그리고 온갖 것이 다 들어 있다. 긴 시간을 투자해서 UML 언어 법률가가 된 다음, 모든 법률가가 그렇듯 다른 사람은 아무도 이해하지 못하는 문서를 작성할 수도 있을 정도다.
이 장에서 UML의 난해하고 복잡한 기능은 거의 언급을 피했다. 그 대신 '내가 사용하는' UML의 부분집합을 여러분에게 보였다. 나는 이런 지식 말고도 미니멀리즘의 가치도 여러분이 배웠기를 바란다. UML을 너무 적게 사용하는 편이 UML을 너무 많이 사용하는 것보다 대개 낫다.