클래스 다이어그램은 UML의 구조 다이어그램(Structure Diagram)으로 클래스 내부 구성 요소와 클래스 간의 관계를 도식화 하여 시스템의 특정 모듈이나 일부 및 전체를 구조화 합니다.
프로그램을 개발 하기 전, 클래스 다이어그램을 그리므로써 시스템 내 클래스 간의 의존성을 파악하고, 협업에서 팀원과의 의사소통이 편리해 집니다.
클래스 다이어그램은 목적에 따라 개념, 명세, 구현 단계로 나눌 수 있습니다.
개념 단계는 클래스를 도출하고, 클래스 간 추상적인 관계를 기술 하는 것이 목적입니다.
명세, 구현 단계는 개발 직전 설계나 구현 이후 설명의 목적으로 사용합니다. 이 때, 다이어그램을 기반으로 코드를 구현하거나 코드를 기반으로 다이어그램을 도식화 하기에 소스코드와 관계가 깊습니다.
클래스 다이어그램에서 클래스는 이름, 속성(변수), 메소드 순으로 나열합니다. 속성과 메소드는 생략 가능하지만, 이름은 필수로 입력해야합니다.
제한자는 속성(필드, 변수)와 메소드 앞에 표기하며 +는 public, -는 private, #은 protected, ~는 default를 의미합니다.
{readonly}가 붙으면 final을, 밑줄이 그어져 있으면 static을 의미합니다.
[*]나 [0..1]은 리스트와 같은 변수에 지정된 사이즈를 뜻합니다. *은 가변적인 크기를, 숫자는 특정 크기를 나타내며 n...m은 n개에서 m개 사이에 특정 값이 될 수 있다는 뜻 입니다.
속성(변수)는 {접근제어자}{필드명}: {타입} 형식으로 작성합니다.
메소드는 {접근제어자}{메소드명}{(파라미터 타입)}: {반환 타입} 순으로 작성합니다.
Classname {
public int field1;
private int field2;
protected int field3;
int field4;
public static final int NUM;
private List<String> fields;
private Optional<String> field5
public boolean method(String param) {
...
}
인터페이스나 추상 클래스, 특수한 목적의 클래스와 같은 요소를 표기하기 위해 길러멧(guillemet)(<< >>)을 사용합니다.
public interface Creature {
public String getSpecies();
}
public class Math {
public static final PI = 3.14159;
public static double cos(double theta) {
...
}
public static double sin(double theta) {
...
}
}
추상 클래스를 나타내는 방법은 총 3가지로 이텔릭체, {abstract} 표기, 길러멧 표시가 있습니다.
클래스간 관계를 표현할 때 다른 클래스를 관계하는(주체)
클래스에서 관계되는(객체)
클래스 방향으로 화살표를 그립니다. 클래스간 관계를 표현하는 방법은 다음이 있습니다.
부모 클래스와 자식 클래스간의 상속 관계
를 나타내며 이때 자식 클래스가 부모 클래스를 일반화 한다고 표현할 수 있습니다.
class Animal {
public String name;
public String location() {
...
}
}
class Cat extends Animal {
@Override
public String location() {
...
}
}
class Dog extends Animal {
@Override
public String location() {
...
}
}
클래스가 인터페이스를 구현
할 때 사용합니다.
public interface User {
public void setName(String name);
}
public class Vip implements User {
public String name;
public void setName(String name) {
this.name = name;
}
}
한 클래스가 다른 클래스를 참조할 때(사용할 때) 의존 관계라고 합니다.
public class User {
public void setGrade(Grade) {
...
}
public Grade getGrade() {
...
}
}
public class Grade {
public String grade;
}
클래스가 다른 객체의 참조를 속성(변수)
로 가지고 있을 때 연관 관계에 있다 합니다.
다음은 같은 코드를 나타내는 다른 방법입니다.
public class Person {
public List<Hobby> hobbies;
}
public class Hobby {
public String hobby;
}
Association 관계를 조금 더 특수하게 나타낸 것으로, 전체(whole)
와 부분(part)
의 관계를 나타냅니다.
public class Person {
public List<Hobby> hobbies;
}
그런데 코드에서는 Association과 차이가 없습니다. Association과 Aggregation는 집합이라는 개념적인 차이는 있지만 코드에서는 이 차이를 구분하기 힘듭니다.
UML역시 집합이라는 개념 외 명확한 정의를 제공하지 않습니다. 이에 Aggregation을 사용하는 것에 대한 찬반은 많은 설계사와 프로그래머들에게 뜨거운 감자입니다.
Composition 역시 Aggregation과 비슷하게 집합 관계를 나타내지만 개념적으로 더 강한 집합을 의미합니다
Aggregation은 부분이 전체와 독립적
이며 전체가 부분을 빌려쓰는 것과 비슷합니다. 하지만 Composition은 부분이 전체에 종속적
이어서 전체가 부분의 생성과 수명, 소멸
을 책임진다는 차이가 있습니다.
https://en.wikipedia.org/wiki/Class_diagram
https://www.nextree.co.kr/p6753/
https://brownbears.tistory.com/577
https://ocwokocw.tistory.com/15
좋은 글 감사합니다!
개인적으로 클래스 다이어그램이 어려웠는데 이렇게 정리해주시니 좋습니다
특히 집합과 합성 관계 부분이 자주 헷갈리곤 했는데 설명을 잘 해주셨네요!
글 잘 읽었습니다.
클래스 다이어그램을 보고 실선, 점선 등 잘 몰라서 어려움이 많았는데,
깔끔하게 정리해주셔서 추후 다이어그램 볼 때 도움이 많이 될 것 같습니다~