HAyOunG0518 2018. 12. 10. 05:04

Class Diagram 기본

참고 http://www.uml-diagrams.org/class-diagrams-overview.html





1. 개요


1.1 UML 다이어그램 종류


  • Structure Diagram : 정적이고, 구조 표현을 위한 다이어그램
  • Behavior Diagram : 동적이고, 시퀀셜한 표현을 위한 다이어그램
클래스 다이어그램은 Structure Diagram에 속한다.


1.2 클래스 다이어그램 (Class Diagram)

1.2.1 개요

클래스 내부의 정적인 내용이나 클래스 사이의 관계를 표현할 수 있다.
클래스 다이어그램은 의존 관계를 명확히 보게 해주며, 순환 의존이 발생하는 지점을 찾아내서 어떻게 이 순환 고리를 깨는 것이 가장 좋은지 결정할 수 있게 해준다.
UML은 목적에 따라 다르게 그려지고 사용된다.




1.2.2 언제 사용할까
    • 다른 사람들과의 의사소통 또는 설계 논의
    • 전체 시스템의 구조 및 클래스의 의존성 파악
    • 유지보수를 위한 설계의 back-end 문서
1.2.3 작성 시 주의사항
    • Access : 다이어그램을 보고 직관적으로 이해할 수 있도록 의미있고 명확한 이름을 부여한다.
    • Simplicity : 불필요한 내용을 제외하고 모델을 간결하게 그려야 한다. (Getter, Setter, Constructor는 생략이 가능하다)
    • Cost : UML을 작성하는 것이 개발비용보다 더 들어가는 경우도 있으므로 비용을 고려하여 작성여부를 검토하는 것이 좋다.


2. Class Diagram Overview
  • Class
  • Relationship


3. Class

3.1 Class Overview

Class는 객체지향에서 사용되는 클래스를 표현하는 모델링 언어이다.

Middle compartment holds attributes and the bottom one holds operations - analysis. Class is shown as solid-outline rectangle containing the class name.





3.2 표기 방법

3.2.1 클래스 (Class)

클래스를 표현할 때에는 세 가지 부분으로 나누어 표현한다. 



3.2.1 이름 (Name)

Class name should be centered and in bold face, with the first letter of class name capitalized (if the character set supports upper case).

클래스 이름은 다음과 같이 네모 박스 안에 기입한다. 다음의 규칙을 따라야 한다.
  • 상자의 가운데에 위치해야 한다.
  • 굵은 글씨체로 기입해야 한다.
  • 첫번째 글자는 대문자로 기입해야 한다.


3.2.2 멤버변수 (Attributes)

클래스의 멤버변수는 UML에서 Property라고 하는 개념의 한 종류이다. 각 멤버변수 하나 하나가 property 하나 하나이다. 
property는 다음과 같은 순서로 작성한다.

[visiblity] property-name : property-type


visiblity는 접근제어자를 표현한다.
  • +  : public
  • -  : private
  • #  : protected
  • ~  : package
property-name은 변수명이고, property-type은 변수타입이다. 다음 클래스 다이어그램과 소스코드를 비교하며 확인해보자 


 class diagram

source code 

 Middle compartment holds attributes and the bottom one holds operations - analysis.

  1. package com.tistory.devdasom;
  2.  
  3. public class SearchService {
  4. private SearchEngine engine;
  5. private SearchRequest query;
  6. ...
  7. }



3.2.3 메서드 (Operations)

클래스의 메서드는 UML에서 Operation라고 하는 개념의 한 종류이다. 각 메서드 하나 하나가 operation 하나 하나이다. 
operation 다음과 같은 순서로 작성한다.

[visiblity] operation-name (property1, property2, ...) : return-type

operation-name은 메서드명이다. 메서드의 파라미터는 ( ) 괄호 안에 작성하면 되고 작성방법은 property와 동일하다. 리턴타입은 : 콜론 뒤에 작성한다. 다음 클래스 다이어그램과 소스코드를 비교하며 확인해보자.


class diagram

 source code 

 Visibility of the operation could be public, proected, package, or private.

  1. package com.tistory.devdasom;
  2.  
  3. public class SQLStatement {
  4. public ResultSet executeQuery(String sql) { ... }
  5. protected Boolean isPoolable() { ... }
  6. int getQueryTimeout() { ... }
  7. void clearWarnings() { ... }
  8. }




4. Relationship


UML에서 Relationship은 클래스의 관계를 표현하기 위한 모델링 언어이다.



4.1 Relationship 종류


 이름

의미

표기법

 설명

 

 Generalization

 일반화

 상속관계

 


 class A가 Super class

class B가 Sub class

 

 Dependency

의존

 지역변수로 사용하거나, 파라미터로 사용하는 등 멤버변수로 갖지 않고 사용하는 관계 

 


 class A의 메서드가 class B의 메서드를 호출하거나, class B를 메서드의 인자로 받는 등 사용하는 경우

 

 Realization

실체화

Dependency의 한 종류이고, 인터페이스를 구현하는 관계 

 


 interface A가 있고, class B가 interface A를 구현한 경우

 

 Association

연관

Dependency와 달리 멤버변수로 가지고 사용하는 관계 

 


 class A가 class B를 멤버변수로 가지고 있고, 사용하는 경우

 

 Aggregation

집합연관

 Association의 한 종류이며 전체와 부분의 관계를 가지는 클래스에 적용된다.


멤버변수로 가지고 있지만, new를 직접하지 않는 관계

 


 class A가 class B를 멤버변수로 가지고 있는 경우.


class A가 전체개념이고, class B가 부분의 개념이다.


하지만 class A가 직접 class B를 new 하지는 않는다...??

 

 Composition

복합연관

 Association의 한 종류이며 전체와 부분의 관계를 가지는 클래스에 적용된다.


멤버변수로 가지고 있고, Aggregation과 달리 직접 new를 하는 관계

 


 class A가 class B를 멤버변수로 가지고 있는 경우.


class A가 전체개념이고, class B가 부분의 개념이다.


class A가 직접 class B를 new 해서 생성한다.

 

 Nested

Inner Class의 관계 

 


 class A의 안에 class B가 이너클래스로 존재하는 경우

 


+) 인터페이스는 추상메소드로만 이루어져있음

인터페이스란 필요한 메소드들의 이름, 매개변수에 대하여 서로 합의하는 것.

public interface aaa{

public void a();

public string b(int d);

- 인터페이스만으로는 객체를 생성할 수 없다. 인터페이스는 다른 클래스에 의하여 구현(implement)될 수 있다, 즉 인터페이스에 정의된 추상메소드릐 몸체를 정의한다는 의미이다.

보통 인터페이스의 구현은 이런식

public class 클래스명 implement 인터페이스이름{

반환형 추상메소드1(...){

...

}

}



4.2 Generalization




상속관계의 클래스를 실선으로 연결하고 Super class 쪽에 빈 삼각형을 그린다.




4.3 Dependency


4.3.1 Dependency



Dependency는 의존관계이다. 단, 한 클래스가 다른 클래스를 멤버변수로 가지지 않고 지역변수, 파라미터 등 일시적으로 사용하는 경우에 성립되는 관계이다.


다음 클래스 다이어그램과 소스코드를 비교해보자.


Sale 클래스가 ProductDescription 클래스를 사용하고 있지만 멤버변수로 가지고 있지는 않다.


class diagram

source code 

 


  1. public class Sale {
  2. ...
  3.  
  4. void updatePriceFor(ProductDescription description) {
  5. description.xx();
  6. ...
  7. }
  8. }
  9.  





4.3.2 Realization




Realization은 인터페이스와 구현 관계이다. 두 클래스를 점선으로 연결하고 인터페이스쪽에 화살표를 그린다.


다음 클래스 다이어그램과 소스코드를 비교해보자.


class diagram 

source code 

 


  1. class Person {
  2. String firstName;
  3. String lastName;
  4. }
  5.  
  6. class Professor extends Person {
  7. Dollars salary;
  8. }
  9.  
  10. class Student extends Student {
  11. String major;
  12. }
  13.  
  14.  


-> 저 코드는 상속이잖아.. 인터페이스 구현관계여야하니깐  implement Person  이렇게 해줘야하는것아닌가...그리고 필드(변수)는 선언될 수 없으며, 상수는 정의할 수 있다고 알고있는데 저게 가능하다고..?ㅣ;;;

애초에 인터페이스는 클래스가 아닌데 





4.4 Association


4.4.1 Association



Association은 한 클래스가 다른 클래스를 멤버변수로 가지는 경우이다. 두 클래스를 실선으로 연결하고 사용 당하는 클래스쪽에 화살표를 그린다.


다음 클래스 다이어그램과 소스코드를 비교해보자.


이 클래스 다이어그램은 화살표 근처에 -address 라는 표현이 되어 있다. 이것은 Person이 Address라는 클래스를 address라는 변수명으로 가지고 있다는 것을 의미한다. - 표시는 private으로 가지고 있다는 것을 의미한다. 그래서 class diagram에서의 Person에는 address라는 필드가 없지만 코드를 구현할 때에는 -address를 필드로 구현해야 한다.


class diagram 

source code 

 


  1. class Person {
  2. private String name;
  3. private Address address;
  4. public void doSomething() { ... }
  5. }
  6.  
  7. class Address {
  8. ...
  9. }



여기서 중요한 것은, 화살표가 없거나 한쪽만 있거나 양쪽 다 있는 경우 등 다양하게 있다. 화살표가 아예 없다는 것은 Unspecifiy로 구현하는 사람이 적절하게 구현하면 되는 것이다. 한쪽만 있다는 것은 그 한쪽은 확실하게 구현해야 한다는 것이고 양쪽 다 있는 경우는 서로를 멤버변수로 가지고 있다는 것을 의미한다. (심화편에서 자세하게 설명할 예정입니다!)




4.4.2 Aggregation



Aggregation은 한 클래스가 전체의 역할을 하고 다른 클래스가 부분의 역할을 하는 전체-부분 관계일 때 사용되는 표현이다. Composition 또한 전체-부분 관계에서 사용되는 표현이며 둘의 차이는 전체가 부분 클래스를 new 하는지 여부이다. Aggregation은 전체 클래스가 부분 클래스를 new하지 않고 외부에서 주입받는다. 반면 Composition은 전체가 부분 클래스를 직접 new 하여 사용한다. 이 차이를 기억하며 다음 클래스 다이어그램과 코드를 비교해보자.


다음 코드 중 Car 클래스에는 Wheel이나 Engine을 new하는 코드가 없는 것을 볼 수 있을 것이다. 이는 부분 클래스(Engine, Wheel)을 외부에서 생성한 뒤 Car 클래스에 주입해준다는 의미이고, 결국 이들은 서로 다른 생명 주기를 가지게 된다. 이것이 Composition과의 차이이다.


class diagram 

source code 

 


  1. class Car {
  2. private Engine m_Engine;
  3. private Wheel[] m_Wheel;
  4.  
  5. public void setEngine(Engine m_Engine) {
  6. this.m_Engine = m_Engine;
  7. }
  8.  
  9. public void setWheel(Wheel[] m_Wheel) {
  10. this.m_Wheel = m_Wheel;
  11. }
  12. }




4.4.3 Composition



Composition은 Aggregation과 거의 동일하고 다른점은 사용하는 클래스에서 직접 new를 해준다는 점이다. 정확히 말하자면 부분 클래스의 생명주기를 관리하는 경우이다. 다음 클래스 다이어그램과 소스코드를 비교해보자. Aggregation과 비교하여 보자.


Telephone의 생성자에서 new를 통해 각 클래스를 생성하는 것을 볼 수 있다. Aggregation관계에서는 new가 없지만, Composition 관계에서는 전체클래스가 부분클래스의 생명주기를 관리하는 것이다. 이 차이점을 확실하게 이해하자!


그리고, 정확하게는 Composition관계에서는 전체 클래스가 부분 클래스의 생명주기를 관장하는 것이지 new를 할때만 Composition 관계가 아니라는 것을 이해해야 한다. 그렇다면 new를 하는 위치가 꼭 생성자가 아니어도 상관없다는 것도 이해할 수 있어야 한다.



class diagram 

source code 

 



  1. class Telephone {
  2. private Button m_Button;
  3. private Headset m_Headset;
  4.  
  5. public Telephone () {
  6. m_Button = new Button();
  7. m_Headset = new Headset();
  8. }
  9. }



4.5 다중성(Multiplicity)


다중성(multiplicity)은 하나의 인스턴스에 연관된 다른쪽 클래스의 가능한 인스턴스의 수를 의미합니다. 다중성은 하나의 숫자 또는 수의 범위로 나타낼 수 있습니다. 아래의 다이어그램에서는 각 Order에 하나의 Customer만 연관이 되지만, Customer는 다수의 Order를 가질 수 있습니다. 

 표기법

의미 

0...1 

0또는 하나의 인스턴스, N..M 표기법은 N에서 M까지의 범위 

0,,*    또는 *

0을 포함한 무한수, 제한없음 

명백한 하나 

1..* 

적어도 하나이상 





5. 연습


다음 클래스 다이어그램은 도서관 관리 시스템이다. 이 다이어그램을 코드로 구현해보고, 구현한 코드를 UML 툴로 표현하였을 때 동일한 결과가 나오는지 확인해보자. (궁금한 것은 다솜이에게 질문주세요!ㅋㅋ)


(*이나 0..* 등 앞서 설명하지 않은 내용은 건너뛰고 구현해도 된다!)





코드 하이라이터 정보

<pre class="prettyprint linenums lang-java" style="font-size: 10pt; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important;">

여기에 코드

</pre>



출처: http://infinitejava.tistory.com/61 [InfiniteJava]