조금 더 나은 객체지향 개발자가 되기 위하여,
클래스 다이어그램에 대하여 공부한 내용을 공유해보고자 합니다.
클래스 표현
클래스는 다음과 같이 표현합니다.
위 표현을 더 익숙한 형태로 표현하면,
속성 → 멤버변수
연산 → 매서드
로 이해할 수 있습니다.
만약 간단한 형태의 자동차 클래스를 표현한다면 이런 모습입니다.
클래스 속성과 연산 앞에 붙는 +, - 표시는 접근 제어자를 의미합니다.
표시 |
접근 제어자 |
+ |
public |
- |
private |
# |
protected |
~ |
internal |
접근 제어자 별 의미는 이전 글에서 설명한 적 있습니다.
만약 프로그램 개발에 클래스 다이어그램을 작성하기로 한 경우,
분석단계를 거친 후 실제 설계 단계로 넘어가게 됩니다.
분석단계에서는 속성들의 형이나 매서드 등의 반환형, 매개변수등은 고려하지 않습니다.
해당 항목은 실제 설계 단계에서 확정할 수 있습니다.
관계
관계 |
표시 |
내용 |
연관 |
실선 또는 화살표 ![]() |
개념적으로 연결되어있음 일반적으로 한 클래스의 기능을 다른 클래스가 사용하며 이 관계가 지속적으로 유지되는 관계 단방향일 경우 화살표를 사용하고, 양방향일 경우 실선을 사용함 |
의존 |
점선 화살표 ![]() |
연관과 유사한 관계에서, 클래스간 관계가 매우 짧은 시간만 유지되는 관계 |
일반화 |
속이 빈 화살표 ![]() |
상속 관계 |
집약 |
속이 빈 다이아몬드 ![]() |
전체와 부분의 관계에서, 전체 객체가 메모리에서 사라져도 부분 객체는 사라지지 않는 관계 |
합성 |
속이 찬 다이아몬드 ![]() |
전체와 부분의 관계에서, 전체 객체가 메모리에서 사라지면 부분 객체도 사라지는 관계 |
실체화 |
속이 빈 점선 화살표 ![]() |
인터페이스 관계 |
1. 연관과 의존 관계
1) 연관관계
- 오랜시간 관계가 유지될 객체 관계
예시> 소유자와 자동차의 관계
public class Person
{
private Car owns;
public Car OwnCar
{
get { return this.owns; }
set { this.owns = value; }
}
}
2) 의존관계
- 짧은시간만 관계가 유지될 객체 관계
예시> 자동차와 주유기의 관계
public class Car
{
public void FillFuel(GasTank g)
{
g.GetFuel(amount);
}
}
2. 일반화 관계
- 자식과 부모의 상속관계
- 자식에서 부모로 화살표를 향함
- 추상 클래스 일 경우, <<abstract>>로 표시
예시> 추상화 클래스 가전제품과 실제 구현 클래스인 냉장고와 에어컨
3. 집약과 합성 관계
1) 집약 관계
- 부분과 전체의 관계
- 부분에서 전체로 다이아몬드가 향함
- 전체 객체가 메모리에서 사라져도 부분 객체는 메모리에 유지됨
예시>
public class Car
{
private Engine e;
private Transmission t;
public Car(Engine e, Transmission t)
{
this.e = e;
this.t = t;
}
}
2) 합성 관계
- 부분과 전체의 관계
- 부분에서 전체로 다이아몬드가 향함
- 전체 객체가 메모리에서 사라지면 부분 객체도 메모리에서 사라짐
예시>
public class Car
{
private Engine e;
private Transmission t;
public Car()
{
this.e = new Engine();
this.t = new Transmission();
}
}
4. 실체화 관계
- 약속의 개념인 인터페이스와 구현의 개념인 클래스의 관계
- 인터페이스의 경우 <<interface>>로 표시