- 시스템을 구성하는 클래스들 사이의 관계를 표현 (클래스+관계로 표현) - 시간에 따라 변하지 않는 시스템의 정적인 면을 보여줌
클래스 (Class)
동일한 속성과 행위를 수행하는 객체의 집합 (객체를 생성하는 설계도)
변화의 기본 단위
클래스 표현 방법 = [클래스이름, 필드변수, 메소드]
클래스 표현 방법접근 제어자
관계
1. 연관 관계 (Association)
각 클래스의 객체는 해당 연관 관계에서 어떤 역할을 수행
보통 한 클래스가 다른 클래스에서 제공하는 기능을 사용하는 상황
단방향(화살표) - 한 쪽은 알지만, 다른 쪽은 상대방의 존재를 모름
양방향(실선) - 두 클래스의 객체들이 서로의 존재를 인식
💡 연관 클래스 - 연관 관계에 추가할 속성이나 행위가 있는 경우 - 연관 클래스를 일반 클래스로 변환 - 양방향 연관 관계는 구현이 복잡, 보통 다대다 연관 관계를 일대다 단방향 연관 관계로 변환해 구현
다중성 표시 방법 (표시 안한 경우 일대일 관계)
2. 일반화 관계 (Generalization)
한 클래스가 다른 클래스를 포함하는 상위 개념인 경우
상속 관계 ("is a kind of")
UML에서의 추상 클래스와 추상 메소드 표현 = 이탤릭체, << abstract>>
3. 집합 관계 (Aggregation, Composition)
UML 연관 관계의 특별 경우
전체와 부분의 관계를 명확히 명시할 때 사용
1. 집약 관계 (Aggregation) - 한 객체가 다른 객체를 포함하는 관계 - '부분'을 나타내는 객체를 다른 객체와 공유 가능 - 생성자에서 참조값을 인자로 받아 필드를 세팅 = 전체 클래스가 부분 클래스를 new로 생성하지 않고외부에서 주입 받음 - 전체 객체의 라이프 타임과 부분 객체의 라이프 타임은 독립적
public class Computer {
private MainBoard mb;
private CPU c;
public Computer(MainBoard mb, CPU c) { // 생성자
this.mb = mb;
this.c = c;
}
}
2. 합성 관계 (Composition) - 부분 객체가 전체 객체에 속하는 관계 - '부분'을 나타내는 객체를 다른 객체와 공유 불가능 - 생성자에서 필드에 대한 객체를 생성 = 클래스에서 직접 new로 생성 - 전체 객체의 라이프 타임과 부분 객체의 라이프 타임은 의존적
public class Computer {
private MainBoard mb;
private CPU c;
public Computer() { // 생성자
this.mb = new MainBoard();
this.c = new CPU();
}
}
4. 의존 관계 (Dependency)
일반적으로 클래스가 다른 클래스를 사용하는 경우
💡연관관계와 의존관계의 공통점 = 한 클래스가 다른 클래스의 기능을 사용
💡 연관관계와 의존관계의 차이 = 유지기간
연관 관계 - 오랜 시간 동안 같이할 객체와의 관계 ex) 사람 - 자동차 - 클래스의 속성에서 참조
의존 관계 - 짧은 시간 동안 이용하는 관계 ex) 자동차 - 주유기 - 연산의 인자로 사용 (메소드의 호출이 끝나면 연관된 클래스와의 관계가 마무리)