Class 다이아그램

개념
- 시스템에서 사용되는 객체 타입을 정의하고, 그들 간의 존재하는 정적인 관계를 다양한 방식으로 표현한 다이어그램

Ⅰ.  객체타입을 정의하고 정적인 관계의 표현, 클래스 다이어그램의 개요

 가. 클래스 다이어그램(Class Diagram)의 정의

  1. 시스템에서 사용되는 객체 타입을 정의하고, 그들 간의 존재하는 정적인 관계를 다양한 방식으로 표현한 다이어그램
  2. Class, Interface, collaboration, Relation을 이용하여 시스템의 정적인 관점들을 가시화하고 구축을 위한 자세한 내용을 명세화
  3. System 어휘와 협력, Schema를 Modeling하는 것이 대부분

 

나. 클래스 다이어그램의 특징

  1. 클래스(Class), 인터페이스(Interface), 공동작업(Collaboration) 간의 관계를 나타내며, 객체지향 시스템 모형화에서 가장 공통적으로 많이 쓰이는 다이어그램
  2. 시스템 내 클래스들의 정적인 구조를 표현
  3. 작성 후 바로 프로그램 코드로 변환 가능

 

Ⅱ. 클래스 구조 및 클래스간 관계

가. 클래스의 구조

  1. 클래스는 속성(Attribute)과 연산(Operation)으로 구성
  2. 클래스 표기는 박스를 세 부분으로 나누어 첫번째 부분에는 클래스 이름이 위치하며, 두번째 부분은 속성, 세번째 부분은 연산을 기술

      3. 속성(attribute)

  - Class의 특징(property)에 이름을 부여

  - 표기법: 의미 있는 명사형으로 표현

      visibility name: type-expression = initial-value{property-string}
     예) + variableName: byte

          4. 연산(Operation)

           - 객체 행동에 영향을 주기 위해 특정 class의 객체로부터 요청할 수 있는 서비스를 표현(Class 인터페이스의 일부)

           - 표기법: 의미있는 동사형으로 표현
                - visibility name(parameter-list): return-type-expression{property-string}
                     예) + createMethodName(int parm): int

       - Method: Operation의 구현

                         - Stereotype을 사용하여 해당 구분에 대한 설명으로 표기

               5. Visibility

                     - public(+), private(-), protected(#) 등과 같은 접근 지정자

나. 클래스 간 관계

명칭

표현방식

설명

Associate

(연관)

-클래스가 개념적으로 서로 연관되어 있는 경우 사용

-두 클래스간 서로 어떠한 연관을 가지고 있는지 의미(has a)

Dependency

(의존)

-클래스가 개념적으로 서로 연관되어 있으나 일시적인 관계

-클래스가 변경되면 그것을 사용하는 다른 곳도 같이 변경하는 관계

Aggregation

(집합연관)

-Associate 관계이면서 전체와 부분의 관계(part of)

-생명 주기를 같이 하지 않는다.

Composition

(복합연관)

-전체와 부분의 관계,전체가 소멸 시 부분도 소멸(contains a)

-생명 주기를 같이 한다.

Inheritance

(상속)

-일반화된 개념적 사물과 구체화된 특수 사물의 관계

-부모 자식 간의 상속 개념,자식은 부모의 속성과 행동을 공유

 

다. 클래스 간 관계 상세 설명

1) 일반화 관계(Generalization Relationship)

- 상위와 하위의 관계를 의미. 하위는 상위의 공통점을 상속받아 가짐

- ‘is a 관계’ 또는 ‘is a kind of’ 관계라고도 함.

그림 4

 

2) 연관 관계(Association Relationship)

- 한 객체가 다른 객체와 연결되어 있음을 나타낼 때 그들을 연관관계로 지칭하며. 클래스들 사이에 선을 그어서 표현한다.

- 한 클래스와 다른 클래스 간에 연결된 선이 있으면 한 클래스의 객체가 다른 클래스의 객체를 사용하는 것을 암시한다.

- 이 연관관계는 두 가지 요소에 초점이 맞춰져야 한다. 연관 관계의 방향( navigability )과 멀티플리시티( multiplicity )이다.

 

A ━━━━━━━   B은 양방향 연관관계 즉, "서로의 존재를 알고 있다."

A ━━━━━━━> B 은 단방향 연관관계 즉, "A는 B를 알고 있으나 B는 A의 존재를 모른다."

 

멀티 플리시티가 『1』이면 객체가 1개 『1..*』이면 한 개 이상, 『* 또는 0..*』이면 0개 이상, 『0..1』이면 없거나 1개이다.

 

2. 구현

class House {

       Person[] persons;    // 집에 살고 있는 사람들, 또는 Vector persons

       House(Person[] persons) {

           this.persons = persons;

       }

}

 

class Person {

       House house;    // 자신이 살고 있는 집에 대한 링크

    private String name;

       private int age;

       private String job;

       Person(String name, int age, String job, House house) {

           this.name = name;

           this.age = age;

           this.job = job;

           this.house = house;

       }

    public void sleep(int hours){ // ... }

    public void run() {  // ... }

    public void eat() {   // ... }

}

 

 

3) 집합연관 관계(Aggregation Relationship)

- 클래스와 클래스간의 부분과 전체의 관계를 의미

- UML 2.0에서는 사용하지 않음

그림 12 예제 이미지

4) 복합집합 연관 관계(Composition Aggregation Relationship)

- 집합연관관계와 같이 부분과 전체 관계이나, 전체클래스 소멸시 부분클래스도 소멸하는 관계

그림 13 예제 이미지

5) 의존 관계(Dependency Relationship)

- 한 클래스의 변화가 다른 클래스에 영향을 미치는 관계

- 한 클래스가 변경 되었을 때 이것을 사용하는 다른 클래스에 영향이 미치는 관계를 의존 관계라고 한다. 그러나 반드시 역이 성립하는 것은 아니다.

- 화살표가 있는 점선으로 표현한다. "B ━ ━ ━ ━> A"의 의존관계에서는 A가 변경되면 B가 영향을 받는다.

-

    한 클래스의 메소드가 다른 클래스의 객체를 인자로 받아 그 메소드를 사용한다 (가장 일반적).  한 클래스의 메소드 내부에서 다른 클래스의 객체를 생성하여 그 메소드를 사용한다.  다른 클래스의 메소드가 또 다른 클래스의 객체를 반환한다. 이때 이 메소드를 호출하여 반환되는 객체의 메소드를 사용한다.

 

2. 구현

Student 클래스가 A이고 School 클래스가 B이다. A의 메소드가 변경되면 B도 수정해야 한다.

 

public class Student {

    private String grade;    

    public String getGrade() {

        return grade;

    }

}

 

public class School {

    public boolean isAdmitable(Student st) {

        // st 객체의 메소드를 호출하여 입학이 가능한지를 체크한다.

        if( st.getGrade().equals("A"))

            return true;

        else

            return false;

    }

}

 

 

6) 인터페이스 실체화 관계(Interface Realization Relationship)

- 인터페이스와 그 인터페이스를 구현한 클래스 사이의 관계를 의미

그림 10 예제 이미지

  

라. 클래스간 관계 표기법

  1.Association (연관) - 지속적인 강한 관계

A. 양방향

class A {

                           private B b

             }                                                  

             class B {

                           private A a

             }

             - 서로에 대한 참조 멤버 변수를 갖음

B. 단방향

 

class A {

                           private B instance[16];

             }

             class B {}

             - A가 B 객체의 instance라는 이름의 참조 멤버 변수 16개를 갖음.

               16 대신 *일 경우 vector나 list등을 의미할 수 있음.

  2. Recursive Association (재귀)

class A {

                           private A a;

             }

        - 자기 자신을 참조할 수 있는 경우

  3. Inner Class (내부 클래스)

            

class A {

                           class B {}

             }

             - 클래스 안의 클래스

  4. Association Class (연관 클래스)

             class A {

                           private Vector instance;

             }

        - A는 B를 Vector에 담아 표현함을 나타낸다.

             Association Class보다 아래처럼 스테레오 타입으로 표현하는 것이 더 나음.

  5. Association Qualifier (연관 한정사)

             class A {

                           private int id;

                           public string getName() {

                                        B b = DB.getB(id);

                                        return e.getName();

                           }

             }

             class B {}

        - A는 B에 id를 통해 접근함을 표현

        - 키나 토큰을 통해 연관을 나타낼 때 사용

  6. Dependency (의존)

class A  {

                           void method(B b) {

                           }

             }           

             class B {}

        - 일시적인 약한 관계

  7. Aggregation (집합, 집합연관)

             class A {

                           private Vector<B> vectorB;

             }

             class B {}

             - A가 B의 집합을 가지나 생명주기는 이질적인 경우에 사용

               (A가 소멸한다고 해서 B가 소멸하지는 않음)

             - UML2에서 제외됨(Association(연관)와 차이 없음)

  8. Composition (합성, 복합연관)

             class A {

                           private Vector<B> vectorB;

             }

             class B {}

             - A가 B의 집합을 갖고 생명주기도 동일

               (A 소멸 시 B소멸. A, B가 항상 같이 소멸)

  9. Generalization (일반화: 상속)

             class A {}

             class B : public A {}        //Java는 extends A

         - B가 A를 상속

  1. Realization (실체화: 구현)

             class A {}

             class B : public A {}        //Java는 implement A

        - B가 A 인터페이스를 구현

 

 

라. 헷갈리는 클래스간의 관계(Associateion vs Aggregation vs Composition)

 

 

마. 클래스 다이어그램 예시

 

댓글