ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • UML [1] - Class Diagram
    UML 2016. 12. 30. 21:44



    본 게시물은 도서 [UML 실전에서는 이것만 쓴다]의 내용을 재구성 하여 작성하였습니다. 본 게시물이 출판사/작가의 저작권의 침해할 소지가 있는 경우 비공개/삭제 될 수 있음을 알립니다.



    클래스 다이어그램 맛보기





    그림 1.2의 클래스 다이어그램(class diagram)은 프로그램 안의 주요 클래스와 주요 관계를 보여 준다. 다이어그램을 보면 TreeMap이라는 클래스가 있고, 이 클래스에 add와 get이라는 public 메서드가 있다. 그리고 TreeMap이 topNode라는 변수로 TreeMapNode 객체를 참조하며 모든 TreeMapNode는 nodes라는 컨테이너에 다른 TreeMapNode 인스턴스 두 개의 참조를 담아 두는 것도 알 수 있다. 그리고 모든 TreeMapNode는 itsKey와 itsValue라는 변수로 또 다른 두 인스턴스도 참조한다. itsKey 변수는 Comparable 인터페이스를 구현하는 인스턴스의 참조를 담으며, itsValue 변수는 그런 제한 없이 그냥 어떤 객체의 참조를 담는다. 


    - 사각형은 클래스를 나타내고, 화살표는 관계를 나타낸다.

    - 이 다이어그램에서 모든 관계는 연관(association)이다. 연관은 한쪽 객체가 다른쪽 객체를 참조하며, 그 참조를 통해 그 객체의 메서드를 호출하는 것을 나타내는 단순한 데이터 관계다.

    - 연관 위에 쓴 이름은 참조를 담는 변수의 이름과 대응한다.

    - 화살표 옆에 쓴 숫자는 보통 이 관계를 맺음으로써 생기는 인스턴스의 개수를 나타낸다. 만약 이 숫자가 1보다 크다면 어떤 컨테이너를 사용한다는 뜻인데, 컨테이너로 대개 배열을 사용한다. 

    - 클래스 아이콘은 여러 구획으로 나뉠 수도 있다. 첫 번째 구획에는 언제나 클래스 이름을 쓴다. 다른 구획에는 각각 함수와 변수를 쓴다.

    - <<interface>> 표기법은 Comparable 이 인터페이스임을 나타낸다. 

    - 설명한 표기법은 대부분 반드시 써야 하는 것이 아니다. 선택해서 쓸 수 있다. 




    Class Diagram 개요


    UML 클래스 다이어그램을 사용하면 클래스 내부의 정적인 내용이나 클래스 사이의 관계를 표기할 수 있다. 클래스 다이어그램으로 클래스의 멤버 변수와 멤버 함수를 보여 줄 수 있다. 그리고 그 클래스가 다른 클래스에서 상속되었는지, 다른 클래스를 참조하는지도 알 수 있다. 한 마디로, 소스코드에 나타나는 클래스 사이의 의존 관계를 모두 표기할 수 있다. 


    이 클래스 다이어그램은 굉장이 유용하다. 소스코드를 보고 시스템 구성 요소들의 상호 의존 구조를 평가하기보다 다이어그램을 보고 평가하기가 훨씬 쉽다. 다이어그램은 의존 관계의 구조를 명확히 '보게' 해주며, 순환 의존이 발생하는 지점을 찾아내서 어떻게 이 순환 고리를 깨는 것이 가장 좋은지 결정할 수 있게 해준다. 그리고 추상 클래스가 컨크리트 클래스에 의존하는 경우도 찾아내서 이런 의존 관계를 재조정할 전략을 결정하게 해준다.




    Class Diagram 기본 개념


    클래스

    아래의 그림은 클래스 다이어그램의 가장 간단한 형태다. Dialer 라는 클래스를 단순한 사각형으로 그렸다. 이 다이어그램은 그 왼쪽에 나온 코드 정도 외에는 별로 말해 주는 것이 없다.




    아마 클래스를 이 형태로 가장 많이 표현하게 될 것이다. 대부분의 다이어그램에서 클래스 이름만 가지고도 지금 일이 어떻게 돌아가는지 충분히 명확하게 보여줄 수 있다.


    하지만, 클래스 아이콘을 여러 구획으로 나눌 수도 있다. 첫째 구획에는 클래스의 이름이, 둘째 구획에는 클래스의 변수가, 셋째 구획에는 클래스의 메서드가 들어간다. 아래의 그림은 이 구획과 각각의 구획이 어떻게 코드로 바뀌는지 보여준다. 클래스 아이콘 안의 변수와 함수 앞에 있는 글자를 주의해서 보아야 한다. 대시(-)는 private를, 해시(#)는 protected를 더하기(+)는 public을 나타낸다. 변수나 함수 인자의 타입은 저마다 자기 이름 뒤에 콜론을 찍고 적는다. 함수의 반환값도 비슷하게 함수 뒤에 콜론(:)을 찍고 적는다.


    세부사항을 이와같이 상세히 적는 것도 유용할 때도 있지만 UML 다이어그램은 변수나 함수를 선언하는 장소가 아니므로 코드에서 하는 편이 낫다.






    연관

    클래스 사이의 연관은 대개 다른 객체의 참조(reference)를 가지는 인스턴스 변수를 의미한다. 아래의 그림을 보면 Phone과 Button 사이에 연관이 하나 있는데, 화살표 방향으로 미루어 보아 Phone이 Button의 참조를 가짐을 알 수 있다. 화살촉 근처의 이름은 인스턴스 변수의 이름이다. 그리고 화살촉 근처의 숫자는 이 인스턴스 변수가 참조를 몇 개나 가질지 알려준다.




    위의 그림을 보면 Phone 객체에 Button 객체가 15개 '연결'되어 있다. 아래의 그림에서 개수의 제한이 없는 경우를 볼 수 있다. 전화번호부는 '여러 개의' 전화번호 객체와 '연결된다'. 별표(*)는 '여러 개'를 뜻한다. 자바에서는 이런 연관을 벡터(Vector)나 리스트(List) 또는 다른 컨테이너 타입으로 구현하는 경우가 자주 있다. 





    상속




    UML에서는 화살촉을 그릴 때 매우 주의해야 한다. 위의 그림을 보면 Employee를 가리키는 작은 화살촉은 상속을 나타낸다. UML에서 화살촉의 방향은 모두 소스코드 의존성의 방향이다. SalariedEmployee 의 소스코드에서 Employee라는 이름을 언급하기 때문에, 화살촉은 Employee를 가리킨다. 따라서 UML에서 상속 화살표는 기반 클래스(base class)를 가리킨다.





    UML에는 자바 클래스와 자바 인터페이스 사이의 상속관계를 나타내는 특별한 표기법도 있다. 이 관계는 위의 그림처럼 점선과 화살표로 그린다. 





    위의 그림은 같은 정보를 전달하는 다른 방법이 나온다. 인터페이스는 인터페이스를 구현하는 클래스에서 뻗어 나온 막대 사탕처럼 그린다. 이런 표기법은 COM 설계에서 자주 볼 수 있다. 




    예제 클래스 다이어그램


    아래의 그림은 ATM 시스템의 일부분을 간단하게 그린 클래스 다이어그램이다. 이 다이어그램이 무엇을 나타내는지, 무엇을 나타내지 않는지 모두 흥미롭다.

    이 다이어그램은 어떤 클래스가 어떤 인터페이스를 구현하는지 신경 쓰지 않는다. 다양한 UI 인터페이스들의 메서드를 모두 철저히 기록하지 않은 점도 주의해야 한다. 메서드들 가운데 중요한 것만 보여 줌으로써 어떤 메서드가 필요한지 아이디어를 전달한다 실제로는 이 정도면 충분하다. 


    연관은 가로로 표시하고 상속은 세로로 표시하기로 한 약속도 눈여겨보아라. 상속과 연관은 상당히 다르므로, 이렇게 하면 두 관계를 구분하는데 크게 도움이 된다. 이런 약속 없이는 얽혀 있는 선에서 의미를 뽑아내기가 쉽지 않다.





    다이어그램을 서로 구분되는 세 구역으로 나눈 것도 보인다. 트랜잭션과 이것들의 행동은 왼쪽에 있고, 여러 UI 인터페이스는 모두 오른쪽에 있고, UI 구현은 아래에 있다. 세 그룹 간의 연결은 개수가 최소한으로 한정되고 매우 규칙적이라는 점도 눈여겨 보아야 한다. 한 예로 모두 같은 방향을 가리키는 세 연관을 들 수 있다. 다른 예로 한 선으로 합쳐지는 상속 관계 세 개도 들 수 있다. 그룹 짓기와, 이 그룹들이 서로 연결된 방법은 이 다이어그램을 읽는 사람이 다이어그램을 각각 응집된 여러 조각으로 나누어 볼 수 있게 도와준다. 아래의 코드가 UI 클래스의 구현과 비슷한가?





    'UML' 카테고리의 다른 글

    UML - 기본 표기 형식 및 관계 표현법  (0) 2017.01.05
    UML [3] - Class Diagram  (0) 2016.12.30
    UML [2] - Class Diagram  (0) 2016.12.30
Designed by Tistory.