Class 다이아그램
태그 :
- 개념
- - 시스템에서 사용되는 객체 타입을 정의하고, 그들 간의 존재하는 정적인 관계를 다양한 방식으로 표현한 다이어그램
Ⅰ. 객체타입을 정의하고 정적인 관계의 표현, 클래스 다이어그램의 개요
가. 클래스 다이어그램(Class Diagram)의 정의
- 시스템에서 사용되는 객체 타입을 정의하고, 그들 간의 존재하는 정적인 관계를 다양한 방식으로 표현한 다이어그램
- Class, Interface, collaboration, Relation을 이용하여 시스템의 정적인 관점들을 가시화하고 구축을 위한 자세한 내용을 명세화
- System 어휘와 협력, Schema를 Modeling하는 것이 대부분
나. 클래스 다이어그램의 특징
- 클래스(Class), 인터페이스(Interface), 공동작업(Collaboration) 간의 관계를 나타내며, 객체지향 시스템 모형화에서 가장 공통적으로 많이 쓰이는 다이어그램
- 시스템 내 클래스들의 정적인 구조를 표현
- 작성 후 바로 프로그램 코드로 변환 가능
Ⅱ. 클래스 구조 및 클래스간 관계
가. 클래스의 구조
- 클래스는 속성(Attribute)과 연산(Operation)으로 구성
- 클래스 표기는 박스를 세 부분으로 나누어 첫번째 부분에는 클래스 이름이 위치하며, 두번째 부분은 속성, 세번째 부분은 연산을 기술
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’ 관계라고도 함.
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에서는 사용하지 않음
4) 복합집합 연관 관계(Composition Aggregation Relationship)
- 집합연관관계와 같이 부분과 전체 관계이나, 전체클래스 소멸시 부분클래스도 소멸하는 관계
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)
- 인터페이스와 그 인터페이스를 구현한 클래스 사이의 관계를 의미
라. 클래스간 관계 표기법
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를 상속
- Realization (실체화: 구현)
class A {} class B : public A {} //Java는 implement A |
- B가 A 인터페이스를 구현
라. 헷갈리는 클래스간의 관계(Associateion vs Aggregation vs Composition)
마. 클래스 다이어그램 예시