UML 클래스 다이어그램 공부 정리

준우·2023년 12월 17일
0

CS 이야기

목록 보기
2/3
post-thumbnail

UML 클래스 다이어그램

UML 이란?

  • Unified Modeling Language 의 약자이며, 통합 모델링 언어입니다.

UML 클래스 다이어그램을 사용하는 이유는 무엇인가요?

  • 전체 시스템의 구조와 클래스의 의존성을 쉽게 파악할 수 있습니다.
  • 다른 사람들과의 의사소통을 조금 더 명확하고, 세부적으로 논의를 할 수 있습니다.
  • 백엔드 문서로 사용합니다.
  • 위 다이어그램을 코드로 구현
public class User {
	private int id;
    private String name;
    
    public Todo getTodo() {
    	// 투두리스트를 확인한다.
        return null;
    }
    
    public void write(String text) {
    	// 투두리스트에 글을 적는다.
    }
}

Class Diagram Element

Class

  • 클래스는 3개 구역으로 나뉜 사각형으로 그립니다.
  • 클래스의 이름, 속성, 기능을 표기할 수 있으며, 이름만 필수로 명시해야 합니다.
  • 보통 속성과 기능을 생략해 다이어그램을 그리는 경우는 주로 클래스의 흐름 분석 위주의 작업입니다.

클래스의 세부사항

  • 클래스의 세부사항은 다음으로 나타낼 수 있습니다.
    • 접근 제한자(Access modifier)
    • 필드명(메서드명)
    • 데이터 타입
    • 매개변수(parameter)
    • 리턴 타입

접근 제한자 (Access modifier)

+ : Public
- : Private
# : Protected

속성 (Attribute)

- 접근 제어자 이름 : 타입 = 기본 값
- 기본 값 생략 가능
- title : String = ""

기능 (Method)

- 접근제어자 이름(파라미터 속성): 리턴값
- void 리턴 값은 생략 가능
- + setTitle(String)
- + getTitle(): String

Stereo Type

  • UML 에서 제공하는 기본 요소 외에 추가적인 확장 요소를 나타내는 타입입니다.
  • 길러멧 기호 (<< >>) 사이에 적습니다.
  • 필드, 메소드의 밑줄은 Static(정적) 필드 또는 메소드입니다.
  • {readOnly} 는 Final 키워드를 사용하는 상수를 의미합니다.
  • 위 다이어그램을 코드로 구현
// Java 코드 입니다.
public interface Shape {
	public double area;
}

public class Math {
	public static final double PI = 3.14;
    
    public static double cos(double theta) {
    	// Cosine 계산...
        return 0.0
    }
}

Abstract Class / Method

  • 추상 클래스란, 1개 이상의 메소드가 구현체 없이 명세만 존재하는 클래스입니다.
  • 추상클래스의 이름과 메소드를 italic 폰트를 기울여서 표현하거나, {abstract} 를 사용합니다.
  • 스테레오 타입을 사용해 표기할 수도 있습니다.
// Java 코드 입니다.
public abstract class User {
	public abstract void work();
}

Class Relationship

일반화 (Generalization)

  • 부모(슈퍼) 클래스와 자식(서브) 클래스 간의 상속 관계 (Inheritance) 를 나타냅니다.

  • 부모 클래스 : 자식 클래스를 일반화한(Generalize) 것

  • 자식 클래스 : 부모 클래스를 구체화한(Spectialize) 것

  • IS - A 관계

  • 상속 : 부모 클래스의 필드 및 메소드를 구체화하여 사용하며, 필드 및 메소드를 추가하거나 필요에 따라 메소드를 재정의하여(overriding) 사용합니다.

  • 부모 클래스가 추상 클래스인 경우는 추상 메소드를 반드시 오버라이딩 해야합니다.

  • 위 그림을 코드롤 작성한 예시
// User
public class User {
	private int id;
    private String name;
    
    public Todo getTodo() {
    	// 투두리스트를 확인한다.
        return null;
    }
    
    public void write(String text) {
    	// 투두리스트에 글을 적는다.
    }
}

// 자바에서는 extends 키워드를 사용해 상속을 구현합니다.

// Student
public class Student extends User {
	public void study() {
    	// 공부한다.
    }
}

// Teacher
public class Teacher extends User {
	public void teach() {
    	// 가르친다.
    }
}

실체화(Realization)

  • Interface 의 기능을 실제 기능으로 구현하는 것을 의미합니다.
  • 인터페이스와 클래스 사이의 Realize 관계는 점선과 인터페이스 쪽에 비어있는 삼각형 화살표로 연결합니다.
  • 위 사진을 코드로 구현한 예시
public interface Shape {
	public double area;
    
    public abstract double calcArea();
}

// 자바에서는 implements 키워드를 사용하여 인터페이스를 구현합니다.

public class Circle implements Shape {
	@Override
	public double calcArea() {
    	// 면적 계산
        return area;
    }
}

의존 (Dependency)

  • 어떤 클래스가 다른 클래스를 참조하는 것을 의미합니다.
  • 클래스 사이를 점선과 참조할 클래스에 화살표를 선으로 그려 표현합니다.

  • 참조의 형태는 아래와 같습니다.

    • 메서드 내 대상 클래스 객체 생성
    • 메서드 내 대상 클래스 객체 사용
    • 메서드 내 대상 클래스 메서드 호출
    • 메서드 내 대상 클래스 객체 리턴
    • 메서드에서 대상 클래스 객체를 매개변수로 받는 것
  • 메서드의 호출이 끝나면 의존 관계의 클래스와 관계가 끝이 납니다.

  • 다이어 그램은 위에 그려진 어떤 형태로도 모두 가능합니다.

    • 스테레오 타입으로 어떤 목적의 Dependency 인지 의미를 명확히 명시할 수 있습니다.
    • 스테레오 타입을 사용하는 방법은 Dependency 의 목적 또는 형태가 중요할 경우 사용할 수 있습니다.
  • 예제 코드

// 자바에서 참조하는 형태에 따른 코드입니다.
public class User {
	public Todo createTodo() {
    	// 객체 생성 및 리턴
    	return new Todo();
    }
    
    public void writeTodo(Todo todo) {
    	// 객체를 매개변수로 받아 사용
        Todo todo = todo.getTodo();
    }
}

연관(Association, Directed Association)

  • 다른 객체의 참조를 가지는 필드를 의미합니다.
  • 위의 다이어그램은 두 가지 형태의 Association 을 나타내고 있습니다.
    • 일반적인 Association
      • 실선 하나로 클래스를 연결합니다.
    • Directed Association
      • 클래스를 실선으로 연결 후에 끝에 화살표를 추가합니다.
    • 두 형태의 Association 간의 차이는 방향성입니다.
      • 방향의 유무에 따라 참조하는 쪽과 참조 당하는 쪽을 구분합니다.
  • " * *" 은 개수를 나타내는데, 대상 클래스에 가질 수 있는 인스턴스 개수 범위를 뜻합니다.
    • 1 : 1개
    • " * " : 0 ~ n 개
    • n ... m : n 부터 m 까지 연관관계를 맺음
  • 위 그림을 코드로 표현한 예시
public class User {
	private List<Phone> phones;
}

집합 (Aggregation)

  • Association 관계를 조금 더 특수하게 나타내 전체(Whole) 와 부분(part) 의 관계를 나타냅니다.

합성 (Composition)

  • 전체(Whole) 와 부분(part) 의 집합 관계를 나타내지만 개념적으로 Aggregation 보다 강한 집합을 의미합니다.

Composition(=합성) vs Aggregation(=집합)

  • Composition은 Aggregation보다 강한 집합입니다.
  • Composition은 part가 whole의 소유입니다.
  • Aggregation은 part가 whole에 독립적이어서 whole이 part를 빌려쓰는 것과 비슷합니다.

Aggregation 과 명확하게 다르게 나타나는 부분들

  • part를 가지는 whole 인스턴스가 part 인스턴스의 전체 수명을 책임집니다.

    • whole 인스턴스가 part 인스턴스를 생성
    • whole 인스턴스가 소멸하면 part 인스턴스도 함께 소멸
    • whole 인스턴스가 복사되면 part 인스턴스도 함께 복사
  • part 에 해당하는 인스턴스는 공유될 수 없습니다.

  • Aggregation과 Composition을 UML 툴에서 그린 후 코드를 만들면 똑같은 코드가 생성됩니다.

    • part 인스턴스의 공유 방지를 위한 Deep Copy 를 구현합니다.

    • whole 인스턴스가 part 인스턴스의 수명을 책임져야 하므로 whole 클래스의 생성자 또는 기타 메소드 내에서 part 인스턴스를 생성합니다.

    • 외부에서 part 객체를 생성하지 못하도록 whole 클래스에는 part 인스턴스에 대한 setter를 삭제합니다.

0개의 댓글