4 분 소요

UML Class Diagram

객체와 클래스

  • Object (객체): 시스템 내의 개별 인스턴스
  • Class (클래스): 유사한 객체들의 설계도. 객체는 클래스의 인스턴스

객체 다이어그램 (Object Diagram)

  • 특정 시점에서 객체들의 상태와 관계를 스냅샷처럼 표현

사각형에 밑줄로 표현

예 ) lshwa:Person

lshwa: Object name / Person : Class


클래스 구성요소

  • Attributes (속성): 객체의 구조적 특징

이름:타입 으로 표기함. 예) name: String

  • Operations (연산): 클래스의 동작, 메소드라고 부르는 곳

표기방법 : 메소드: 리턴 타입 예) getABC() : int

  • Instance Variable / Operation: 개별 객체에 적용
  • Class Variable / Operation (static): 모든 인스턴스에 공유

public 은 +, private는 -, protected는 #으로 표기함.

표기법


추상 클래스와 연산

  • Abstract Class: 인스턴스 생성 불가
  • Abstract Operation: 몸체(body)가 없음
  • 표기: 기울임꼴, {abstract}, «abstract»

인터페이스 (Interface)

  • 추상 연산들의 집합
  • Provided Interface: 컴포넌트가 외부에 제공하는 기능 또는 서비스를 나타냄. 즉, 다른 컴포넌트가 사용할 수 있도록 공개한 기능들을 말함.

ball symbol 이나 realization connector를 사용해 표기

public interface PaymentService {
    void processPayment(double amount);
}

public class PaymentProcessor implements PaymentService {
    @Override
    public void processPayment(double amount) {
        System.out.println("Processing payment: $" + amount);
    }
}

=> PaymentProcessor는 processPayment() 기능을 제공

  • Required Interface: 컴포넌트가 동작하기 위해 외부로부터 필요로 하는 기능을 나타냄. 즉, 다른 컴포넌트에게 의존하는 기능들을 말함.

Socket symbol, Dependency arrow to ball or stereotyped class 를 통해 표기

public interface BankService {
    boolean verifyAccount(String accountId);
}

public class PaymentProcessor {
    private BankService bankService; // 요구 인터페이스

    public PaymentProcessor(BankService bankService) {
        this.bankService = bankService;
    }

    public void makePayment(String accountId, double amount) {
        if (bankService.verifyAccount(accountId)) {
            System.out.println("Payment of $" + amount + " completed.");
        }
    }
}

=> PaymentProcessor는 BankService의 verifyAccount() 기능을 요구


클래스 간 관계

1. Dependency(의존)

  • 한 클래스가 다른 클래스를 잠깐 사용하는 가장 약한 relationship

  • 메서드의 매개변수, 지역변수로 사용되며 필요할 때만 사용한다.
  • 생명주기 공유 X

2. Association(연관 관계)

  • 인스턴스 간의 일반적인 관계로, 두 클래스가 서로 연결되어 있다는 일반적인 관계로 한 클래스가 다른 클래스의 참조를 멤버 변수로 가짐
class Student {
    private Teacher teacher;
}

class Teacher {
    private String name;
}

Binary Association

Binary Association : Connects instances of two classes

  • Navigability (접근 가능성): 한쪽에서 다른 쪽 접근 가능 여부
    • Non-navigability : X 자로 표시하여 방향성 지정
    • Navigability undefined : 양방향의 access가 가능

navigation의 기능 : can access their visible attributes and operations

  • Multiplicity: 관계에 참여하는 객체 수

해석은 반대로 해야함.

  • Role: 관계 내 역할명, Visibility(+,-,#)이랑 같이 사용
  • Association Class: 관계 자체에 속성 부여 가능
    • N : M 관계에서는 필수
    • 1 : 1 OR 1 : N에서는 필수는 아님.

Association Class 와 Regular Class 차이

1. Regular Class

  • 단독으로 존재하며, 어떤 객체를 모델링한 클래스
  • 속성과 행동을 가지며 독립적인 개체로 사용

2. Association Class

  • 두 클래스 간의 연관을 나타내면서, 그 연관 자체에 속성이 필요한 경우에 사용된다. 연관 그 자체를 클래스로 모델링 한 것

즉, Regular Class는 현실 세계의 독립된 객체를 표현하기에 서로의 존재와 무관하게 혼자서도 의미있는 클래스이다. 관계 자체를 객체처럼 모델링한 Association Class에는 두 클래스 간의 관계를 표현하기에 추가 정보가 있을 때만 등장

EX) Student가 Study Program을 Enrollment 할 때,

Enrollment는 학생과 스터디 프로그램과의 관게를 포현하기에 Association Class로 표현하는게 정답!

Association class - unique / non-unique

1. Unique

  • 두 개의 연관된 클래스의 조합(인스턴스) 자체가 고유할 때 사용
  • 한 번만 있는게 default값임.
  • 예시
    • 학생이 Course에 등록한다.
    • 만약 또 등록하려고 하면, 이미 존재한다는 오류가 떠야함.

2. Non-unique

  • 같은 두 클래스 인스턴스 조합이 중복되어 여러 번 존재가 가능
  • {non-unique}으로 직접 명시해줌.
  • 예시
    • 학생이 수업A를 듣는다.
    • 재수강을 할 수 있다면, 학생은 수업A를 여러번 들을 수 있음.

Qualified Association(한정 연관)

  • 한 클래스에서 다른 클래스의 객체를 참조할 때, 특정 키(qualifier)를 사용해서 식별하고 접근을 제한하는 연관관계
  • 조건이 붙은 연관관계, 연관관계에 인덱스를 다는 것과 같음.
  • UML 표기에서는 연관선 옆에 작은 사각형에 qualifier를 사용함.

3. Aggregation: 부분-전체 관계

  • 한 객체가 다른 객체를 포함하지만, 포함된 객체가 독립적으로 존재 가능한 관계 (HAS-A 관계)
  • 포함된 객체는 생명 주기를 공유하지 않음
class Player {
    String name;
}

class Team {
    // aggregation: team이 없어도 player는 존재 가능
    Player player;
}
  • Aggragation의 특징
    • Transitive(추이성) : A가 B를 포함하고, B가 C를 포함하면, A는 C를 간접적으로 포함하는 관계
    • Asymmetric(비대칭성) : 두 객체 간의 관계가 일방향이라는 뜻

Shared Aggregation

  • 한 객체가 다른 객체를 참조하지만, 포함된 객체가 여러 객체와 공유될 수 있는 관계
  • 특징
    • 생명 주기를 공유하지 않음.
    • 공유가 가능함. (여러 Whole객체가 동일한 Part를 참조 가능)
    • 느슨한 결합

4. Composition (구성)

  • 객체 간의 강한 포함 관계를 의미함.
  • 하나의 객체가 다른 객체를 자기 일부로 포함하고, A가 사라지면 B도 함께 사라지는 관계
  • 생명 주기(life cycle)을 공유하는 관계
class Room {}

class House {
    private Room room;

    public House() {
        // House가 Room을 생성하고 관리함
        room = new Room();
    }
}

5. Generalization (상속)

  • 러 개의 하위 클래스(subclass)가 공통적인 속성과 동작을 공유할 때, 이를 하나의 상위 클래스(superclass)일반화하는 것을 의미
  • IS-A 관계
class Animal {
    void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("Bark");
    }
}

Abstract Class

  • 추상 클래스 : 직접 객체를 만들 수 없는 클래스공통적인 속성이나 동작을 정의하고 이를 상속받는 하위 클래스에서 구체화하도록 되어있음.
  • 공통의 뼈대만 정의하고 나머지는 자식이 완성하는 틀이라고 생각하면 됨.
  • 주요 특징
    • 추상클래스를 사용한 객체 생성 불가
    • 오직 상속만을 위한 전용
    • {abstract} 키워드를 통해 나타냄.

Multiple Inheritance

  • 다중 상속 : 하나의 클래스가 둘 이상의 부모 클래스로부터 속성과 메서드를 동시에 상속받는 것을 말함.
  • UML 에서 지원가능

relationship의 notation은 아래 사진과 같다.

Class Diagram relation


클래스 다이어그램 작성 가이드

  • 명사 → 클래스
  • 형용사 → 속성
  • 동사 → 연산
  • 관계 표현: 일반화, 연관, 포함 등

코드 생성과 연계

  • 클래스 다이어그램은 객체지향 언어 코드 생성에 활용 가능
  • Java 예시로 class, abstract class, interface, enum 등 생성 가능

UML Notation Summary (요소 요약)

요소 설명
Class 구조 및 동작의 설명
Abstract Class 인스턴스화 불가 클래스
Association 클래스 간 관계
Association Class 관계 자체에 속성 추가
Aggregation 포함 관계 (공유/강한 포함)
Generalization 상속 관계
Object 클래스의 인스턴스
Link 객체 간 관계