λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
πŸ’» Computer Science/- Software Engineering

[μ†Œν”„νŠΈμ›¨μ–΄ 곡학] UML-클래슀 λ‹€μ΄μ–΄κ·Έλž¨ μ΄ν•΄ν•˜κΈ°

by Wonit 2022. 2. 2.

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ΄λž€?

 

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ„€κ³„ν•˜λŠ”λ° 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ€ ν•„μˆ˜μ μœΌλ‘œ λ“±μž₯ν•˜λŠ” UML이닀.

 

μ†Œν”„νŠΈμ›¨μ–΄ κ³΅ν•™μ—μ„œ μ΄μ•ΌκΈ°ν•˜λ“― UML μ—λŠ” 크게 2κ°€μ§€μ˜ μ’…λ₯˜λ‘œ λ‚˜λ‰˜κ²Œ λ˜λŠ”λ°

 

  1. Behavior Diagram
  2. Structure Diagram

 

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ€ 각 μ»΄ν¬λ„ŒνŠΈλ“€μ˜ 정적인 면을 보기 μœ„ν•œ Structure Diagram 에 μ†ν•˜λŠ” λŒ€ν‘œμ μΈ λͺ¨λΈλ§ 기법을 μ˜λ―Έν•œλ‹€.

 

λ‹€μ‹œ ν•œ λ§ˆλ””λ‘œ 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ„ μ •μ˜ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ€ μ‹œμŠ€ν…œμ˜ 정적인 면을 λ³΄μ—¬μ£ΌλŠ” λŒ€ν‘œμ μΈ UML둜 각 μ»΄ν¬λ„ŒνŠΈλ“€ μ‚¬μ΄μ˜ 관계λ₯Ό ν‘œν˜„ν•œλ‹€.

 

μš°λ¦¬λŠ” μ΄λŸ¬ν•œ 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ„ μ΄μš©ν•΄μ„œ μ‹œμŠ€ν…œμ„ μ„€κ³„ν•˜κ³  ν˜‘μ—…μ— μžˆμ–΄ μ˜μ‚¬μ†Œν†΅ λ„κ΅¬λ‘œ μ‚¬μš©ν•˜κ²Œ λœλ‹€.

 

이런 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ„ μ΄μš©ν•˜κ²Œ λœλ‹€λ©΄ 각 ν΄λž˜μŠ€κ°„μ˜ 의쑴 관계λ₯Ό λͺ…ν™•νžˆ ν‘œν˜„ν•˜κΈ° λ•Œλ¬Έμ— μˆœν™˜μ  의쑴이 λ°œμƒν•˜λŠ” 지점을 μ‰½κ²Œ 찾을 수 있게 λœλ‹€.

 

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ˜ μš”μ†Œ

 

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ—λŠ” 크게 3κ°€μ§€μ˜ μš”μ†Œκ°€ μ‘΄μž¬ν•œλ‹€.

 

  • Class
  • Stereo Type
  • Abstract Class/Method

 

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ˜ μš”μ†Œ 1. Class

 

ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같이 3개의 파트둜 ꡬ성이 λœλ‹€.

 

 

  1. 클래슀 이름
  2. 속성
  3. κΈ°λŠ₯

 

예λ₯Ό λ“€μ–΄ λ‹€μŒκ³Ό 같은 ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•œλ‹€κ³  ν•΄λ³΄μž.

 

public class User {
    private int age;
    private String address = "μ„œμšΈνŠΉλ³„μ‹œ";
    private String name;

    public void setInformation(int age, String address, String name) {
        // do something
    }

    public String introduceMessage() {
        return "some string";
    }

    private void delete() {
        // do something
    }
}

 

μœ„μ˜ ν΄λž˜μŠ€μ—λŠ” 3개의 속성과 3개의 λ©”μ„œλ“œ κΈ°λŠ₯이 μ‘΄μž¬ν•˜κ³  그듀은 각각 public / private μ ‘κ·Ό μ œν•œμžκ°€ κ±Έλ €μžˆλ‹€λ©΄ λ‹€μŒκ³Ό 같은 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ΄ λ‚˜μ˜€κ²Œ 될 것이닀.

 

 

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ—μ„œλŠ” μœ„μ™€ 같은 ν˜•νƒœλ‘œ Access Modifier, Fields, Data Type, Parameters, Return Type 을 ν‘œν˜„ν•  수 μžˆλ‹€.

 

ν΄λž˜μŠ€μ—μ„œλŠ” 속성과 κΈ°λŠ₯은 ν•„μš”μ— 따라 μƒλž΅λ  수 μžˆμ§€λ§Œ 클래슀λͺ…은 λ‹Ήμ—°νžˆλ„ μƒλž΅μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€.

 

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ˜ μš”μ†Œ 2. Stereo Type

 

μŠ€ν…Œλ ˆμ˜€ νƒ€μž…μ΄λž€ UML μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ μš”μ†Œ 외에 좔가적인 ν™•μ • μš”μ†Œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ²ƒμœΌλ‘œ 쌍 κΊΎμ‡  Guillemet <<>> 사이에 λͺ…μ‹œν•œλ‹€.

 

public interface Notificator {
    void execute();
}

 

μœ„μ™€ 같은 interface λ˜ν•œ ν™•μž₯ μš”μ†ŒμΈ μŠ€ν…Œλ ˆμ˜€ νƒ€μž…μ— μ†ν•˜λŠ”λ°, 이λ₯Ό 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ—μ„œλŠ” λ‹€μŒκ³Ό 같이 ν‘œν˜„ν•œλ‹€.

 

 

μ΄λŸ¬ν•œ μŠ€ν…Œλ ˆμ˜€ νƒ€μž…μ€ μΈν„°νŽ˜μ΄μŠ€ 뿐만 μ•„λ‹ˆλΌ Enum, μ™ΈλΆ€ λͺ¨λ“ˆμ˜ μœ ν‹Έλ¦¬ν‹° λ˜ν•œ ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

 

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ˜ μš”μ†Œ 3. Abstract Class/Method

 

좔상 클래슀 λ˜ν•œ 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ—μ„œ ν‘œν˜„ν•  수 μžˆλ‹€.

 

 

좔상 클래슀λ₯Ό ν‘œν˜„ν•˜λŠ” 방법은 크게 2가지가 μžˆλ‹€.

 

  1. Italic Font
  2. {abstract} ν”„λ‘œνΌν‹°

 

UML νˆ΄μ„ μ΄μš©ν•˜κ±°λ‚˜ GoF 의 λ””μžμΈ νŒ¨ν„΄ μ±…μ—μ„œλŠ” 좔상 클래슀λ₯Ό μ΄νƒ€λ¦­μœΌλ‘œ ν‘œν˜„ν•˜μ§€λ§Œ ν˜Όλ™μ΄ μžˆμ„ 수 있기 λ•Œλ¬Έμ— {abstract} ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜κΈ°λ„ ν•œλ‹€.

 

클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ˜ 관계 ν‘œν˜„

 

클래슀 λ‹€μ΄μ–΄κ·Έλž¨ μ—μ„œλŠ” 각 클래슀 μ»΄ν¬λ„ŒνŠΈκ°„μ˜ 관계λ₯Ό ν‘œν˜„ν•˜λŠ” 것이 κ°€μž₯ μ€‘μš”ν•˜λ‹€.

 

 

이런 κ΄€κ³„μ˜ ν‘œν˜„μ„ μœ„ν•΄λŠ” λ‹€μ–‘ν•œ 관계가 μ‘΄μž¬ν•˜λŠ”λ°,

 

  • μΌλ°˜ν™” 관계
  • 싀체화 관계
  • 의쑴 관계
  • μ—°κ΄€ 관계
  • 집합 관계
  • ν•©μ„± 관계

 

ν•˜λ‚˜μ”© μ•Œμ•„λ³΄λ„λ‘ ν•˜μž

 

클래슀의 관계 ν‘œν˜„ - Generalization, μΌλ°˜ν™” 관계

is a kind of 관계

 

μΌλ°˜ν™” κ΄€κ³„λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ μžμ‹ 클래슀 κ°„μ˜ 상속 관계λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

 

public class User {
    private int age;
    private String address = "μ„œμšΈνŠΉλ³„μ‹œ";
    private String name;

    public void setInformation(int age, String address, String name) {
        // do something
    }

    public String introduceMessage() {
        return "some string";
    }
}

public class Member extends User {
    @Override
    public void setInformation(int age, String address, String name) {
        // do something
    }

    @Override
    public String introduceMessage() {
        return "return something";
    }
}

public class Admin extends User {
    @Override
    public void setInformation(int age, String address, String name) {
        // do something
    }

    @Override
    public String introduceMessage() {
        return "return something";
    }
}

 

 

μžμ‹ ν΄λž˜μŠ€μ—μ„œ 슈퍼 클래슀둜 μ‹€μ„ κ³Ό λΉ„μ–΄μžˆλŠ” μ‚Όκ°ν˜•μ„ μ΄μš©ν•˜μ—¬ ν‘œν˜„ν•œλ‹€.

 

클래슀의 관계 ν‘œν˜„ - Realization, 싀체화 관계

 

싀체화 κ΄€κ³„λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ…μ„Έλ§Œ μ‘΄μž¬ν•˜λŠ” λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ μ‹€μ œ κΈ°λŠ₯이 λ™μž‘ν•˜λ„λ‘ κ΅¬ν˜„ν•˜λŠ” 것을 λ§ν•œλ‹€.

 

싀체화 관계가 λ°”λ‘œ λ‹€ν˜•μ„±μ„ μ‹€ν˜„ν•  수 μžˆλŠ” 관계이닀.

 

public interface Notificator {
    void execute();
}

public class ToastNotificator implements Notificator {
    @Override
    public void execute() {
        // do something
    }
}

 

 

κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ‘œ 점선과 λΉ„μ–΄μžˆλŠ” μ‚Όκ°ν˜•μ„ μ΄μš©ν•˜μ—¬ ν‘œν˜„ν•œλ‹€

 

클래슀의 관계 ν‘œν˜„ - Dependency, 의쑴 관계

 

의쑴 κ΄€κ³„λŠ” 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ—μ„œ 일반적으둜 κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” κ΄€κ³„λ‘œ λ‹€λ₯Έ 클래슀λ₯Ό μ°Έμ‘°ν•  λ•Œ 의쑴 관계라고 ν•œλ‹€.

 

μΆ”κ°€λ‘œ μ–΄λ–€ λͺ©μ μ˜ Dependency 인지 λͺ…ν™•νžˆ λͺ…μ‹œν•  수 μžˆλŠ”λ°, 의쑴의 λͺ©μ μ— 따라 ν‘œν˜„ν•˜λŠ” 것이 λͺ…ν™•ν•  수 μžˆλ‹€.

 

의쑴의 λͺ©μ μ—λŠ” λ‹€μŒκ³Ό 같은 ν•­λͺ©λ“€μ΄ μ‘΄μž¬ν•œλ‹€.

 

  • create : λ‹€λ₯Έ 클래슀둜 λ©”μ‹œμ§€κ°€ 전달될 λ•Œ
  • local : λ‹€λ₯Έ 클래슀의 λ°μ΄ν„°μ˜ 일뢀가 될 λ•Œ
  • parameter : λ‹€λ₯Έ 클래슀의 μ˜€νΌλ ˆμ΄μ…˜μ˜ λ§€κ°œλ³€μˆ˜

 

public interface Notificator {
    void execute();
}

public class ToastNotificator implements Notificator {
    @Override
    public void execute() {
        System.out.println("Toast λ₯Ό μ΄μš©ν•˜μ—¬ notify");
    }
}

public class Notifier {
    void notifyBy(Notificator notificator) {
        if (notificator.getClass().equals(ToastNotificator.class)) {
            notificator.execute();
        }
    }
}

 

 

Dependency κ΄€κ³„μ—μ„œλŠ” Instance 의 reference κ°€ μœ μ§€λ˜μ§€ μ•ŠλŠ”λ‹€.

 

μœ„μ˜ κ²½μš°μ—μ„œλŠ” Notificator 의 reference λ₯Ό 가지고 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ’€ 연관을 끊고 μžˆκΈ°μ— Dependency 관계가 λ§Œμ‘±λ˜λŠ” 것이닀.

 

μ°Έμ‘°ν•˜λŠ” ν΄λž˜μŠ€μ—μ„œ λŒ€μƒ 클래슀둜 점선과 ν™”μ‚΄ν‘œλ₯Ό μ΄μš©ν•˜μ—¬ ν‘œν˜„ν•œλ‹€.

 

참고둜 참쑰의 ν˜•νƒœλŠ” λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ λŒ€μƒ 클래슀의 객체의 생성, λ©”μ„œλ“œ 호좜, 객체 리턴 등을 μ˜λ―Έν•˜λ©° κ³„μ†ν•΄μ„œ 객체의 μ°Έμ‘°λ₯Ό μœ μ§€ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.

 

클래슀의 관계 ν‘œν˜„ - Association, μ—°κ΄€ 관계

 

μ—°κ΄€ κ΄€κ³„λŠ” λ‹€λ₯Έ 객체의 μ°Έμ‘°λ₯Ό κ°€μ§€λŠ” ν•„λ“œλ₯Ό μ˜λ―Έν•œλ‹€.

 

μ—°κ΄€ κ΄€κ³„λŠ” 의쑴 관계와 λ‹€λ₯΄κ²Œ μ°Έμ‘°λ₯Ό κ³„μ†ν•΄μ„œ μœ μ§€ν•œλ‹€

 

public class UserService {
    void add() {
      // do something
    }
}


public class UserController {
    private UserService userService;

    void create() {
        userService.add();
    }
}

 

 

클래슀의 관계 ν‘œν˜„ - Aggregation, 집합 관계

has a 관계 (μ•½ν•œ 집합)

 

집합은 Aggregration, Shared Aggregation 으둜 2가지 λ°©λ²•μœΌλ‘œ ν‘œν˜„λœλ‹€.

 

주둜 Whole - Part, 전체 - λΆ€λΆ„ 의 관계λ₯Ό ν‘œν˜„ν•œλ‹€.

 

Aggregation 은 Association 의 집합 관계λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ²ƒμœΌλ‘œ Collections λ‚˜ Array λ₯Ό μ΄μš©ν•˜μ—¬ 집합을 λ‹€λ£¨λŠ” 관계이닀.

 

λ˜ν•œ λ‹¨μˆœ 집합을 μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ— 전체가 μ†Œλ©Έλ˜λ”λΌλ„ λΆ€λΆ„ μš”μ†ŒλŠ” μ†Œλ©Έλ˜μ§€ μ•Šκ³ , 전체 μš”μ†Œκ°€ μ†Œλ©Έλ  λ•Œ λΆ€λΆ„ μš”μ†Œκ°€ μ†Œλ©Έλ˜μ§€ μ•Šμ„ 수 μžˆλ‹€. 이λ₯Ό λŠμŠ¨ν•œ 집합 (μ—°κ²°) 관계라고도 ν•œλ‹€

 

public class House {
    private AirConditioner airConditioner;
    private TV tv;

    public House(AirConditioner airConditioner, TV tv) {
        this.airConditioner = airConditioner;
        this.tv = tv;
    }
}

public class AirConditioner {
    void turnOn() {
        // do Something
    }
}

public class TV {
    void turnOn() {
        // do Something
    }
}

 

 

집합 λŒ€μƒ ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘°ν•˜λŠ” 클래슀둜 속이 λΉ„μ–΄μžˆλŠ” λ§ˆλ¦„λͺ¨λ‘œ ν‘œν˜„ν•œλ‹€.

 

클래슀의 관계 ν‘œν˜„ - Composition, ν•©μ„± 관계

 

has a 관계 (κ°•ν•œ 집합)

합성은 Composition, Composite Aggregation 이라고 λΆˆνžŒλ‹€.

 

Aggregation κ³Ό λΉ„μŠ·ν•˜κ²Œ Whole - Part, 전체 - λΆ€λΆ„ 의 관계λ₯Ό ν‘œν˜„ν•˜μ§€λ§Œ Aggregation 보닀 더 κ°•ν•œ 집합 관계이닀.

 

κ°•ν•œ μ§‘ν•©μ΄λž€ part κ°€ whole 에 μ’…μ†μ μ΄μ–΄μ„œ partκ°€ whole 에 μ†Œμœ λ˜λŠ”λ° 이에 λ°˜ν•΄ Aggregation 은 Part κ°€ Whole 에 λ…λ¦½μ μ΄μ–΄μ„œ Whole 이 Part λ₯Ό 빌렀 μ“°λŠ” 것과 λΉ„μŠ·ν•˜λ‹€.

 

이런 κ°•ν•œ μ§‘ν•©μ—μ„œλŠ” 전체 μš”μ†Œκ°€ μ†Œλ©Έλ  λ•Œ λͺ¨λ“  λΆ€λΆ„ μš”μ†Œλ„ ν•¨κ»˜ μ†Œλ©Έλ˜κ²Œ λœλ‹€λŠ” νŠΉμ§•μ΄ μ‘΄μž¬ν•œλ‹€.

 

즉, Composition κ΄€κ³„λŠ” 전체 μš”μ†Œμ™€ λΆ€λΆ„ μš”μ†Œκ°€ 같은 Life-Cycle을 κ°–λŠ” 것이라고 ν•  수 μžˆλ‹€.

 

public class Car {

    private Engine engine;
    private Wheel wheel;

    public Car() {
        this.engine = new Engine();
        this.wheel = new Wheel();
    }
}

public class Engine {
    void start() {
        // do something
    }
}

public class Wheel {
    private int inch = 33;

    public int getInch() {
        return inch;
    }
}

 

 

집합 λŒ€μƒ ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘°ν•˜λŠ” 클래슀둜 속이 μ°¬ λ§ˆλ¦„λͺ¨λ‘œ ν‘œν˜„ν•œλ‹€.

 

전체 정리

 

μœ„μ˜ λ‚΄μš©λ“€μ„ μ •λ¦¬ν•œλ‹€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

 

public class A {
    B b;
    C c;
    D d;

    public A() {
        b = new B(); // ν•©μ„± 관계
    }

    public A(C c) {
        this.c = c; // 집합 관계
    }

    public void doSomething(D d) { // μ—°κ΄€ 관계
        this.d = d;
    }

    public void doSomething(E e) { // 의쑴 관계
        e.trigger();
    }
}

 

  • A 와 B λŠ” ν•©μ„± 관계
  • A 와 C λŠ” 집합 관계
  • A 와 D λŠ” μ—°κ΄€ 관계
  • A 와 E λŠ” 의쑴 관계

μΆ”κ°€λ‘œ μ–΄λ– ν•œ 사싀 κ΄€κ³„λ‘œ 따진닀면 μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같이 λ‚˜λˆ„λŠ” 것도 κ°€λŠ₯ν•˜λ‹€

λŒ“κΈ€