Post

🎨 UML μž‘μ„± 방법

🎨 UML μž‘μ„± 방법

UMLμ΄λž€?

  • Unified Modeling Language의 μ•½μ–΄λ‘œ, μ‹œμŠ€ν…œμ„ μ‹œκ°ν™”ν•˜μ—¬ λ¬Έμ„œν™”ν•˜κΈ° μœ„ν•œ ν‘œν˜„ 방법이닀.

μ™œ UML을 μž‘μ„±ν•΄μ•Ό ν• κΉŒ?

졜근 μžλ°” λ””μžμΈ νŒ¨ν„΄κ³Ό λ¦¬νŒ©ν† λ§ κ΄€λ ¨ 책을 μ½μ—ˆλŠ”λ°, λͺ¨λ‘ UML을 ν†΅ν•΄μ„œ κ°œλ…μ„ μ„€λͺ…ν•΄ μ£Όμ—ˆλ‹€.
λ¬Όλ‘  μΉœμ ˆν•˜κ²Œλ„ μ±…μ˜ 첫 μž₯μ—μ„œ UML의 기초적인 뢀뢄을 λ‹€λ€„μ„œ 책을 μ½λŠ” λ°λŠ” λ¬Έμ œκ°€ μ—†μ—ˆμ§€λ§Œ, λ‚˜μ€‘μ— ν”„λ‘œμ νŠΈ μ§„ν–‰ν•  λ•Œ μ½”λ“œμ˜ 흐름을 μ„€λͺ…ν•˜κΈ°μ— 쒋을 것 κ°™μ•„μ„œ 정리해 λ†“μœΌλ €κ³  ν•œλ‹€.

λŒ€ν‘œμ μΈ λ‹€μ΄μ–΄κ·Έλž¨ μ’…λ₯˜

  1. 클래슀 λ‹€μ΄μ–΄κ·Έλž¨
  2. μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface Executable {
	abstract void execute();
}

abstract class ParentClass {
	Something _field1;
	static int FIELD2;

	abstract void method1();
	void method2() { /* ... */}
	static void method3() { /* ... */}
}

class ChildClass extends ParentClass implements  Executable {
	void method1() { /* ... */}
	void execute() { /* ... */}
}

class Something {
	int _value;
	// ...
}
  • 상기 μ½”λ“œλ₯Ό 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ λ„μ‹ν™”ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ€ 클래슀, μΈμŠ€ν„΄μŠ€, μΈν„°νŽ˜μ΄μŠ€ λ“± μ‹œκ°„μ΄ μ§€λ‚˜λ”λΌλ„ 변함이 μ—†λŠ” 정적인 관계λ₯Ό ν‘œν˜„ν•œλ‹€.
  • μƒλž΅μ΄ μ‘΄μž¬ν•˜λ―€λ‘œ 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œλΆ€ν„° μ†ŒμŠ€ μ½”λ“œλ₯Ό 볡원할 μˆ˜λŠ” μ—†λ‹€.
βœ… ν΄λž˜μŠ€μ™€ 계측 관계
  • ν™”μ‚΄ν‘œλ₯Ό 가리킀렀면 μƒλŒ€λ₯Ό μ•Œκ³  μžˆμ–΄μ•Ό ν•˜λ―€λ‘œ ν™”μ‚΄ν‘œλŠ” ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μƒμœ„ 클래슀둜 ν–₯ν•œλ‹€.
  • μƒμœ„ ν΄λž˜μŠ€λŠ” ν•˜μœ„ 클래슀λ₯Ό λͺ°λΌλ„ λ˜μ§€λ§Œ, ν•˜μœ„ ν΄λž˜μŠ€λŠ” μƒμœ„ 클래슀λ₯Ό μ•Œμ•„μ•Ό ν•œλ‹€.
  • 이걸 μ˜μ‘΄ν•œλ‹€κ³  ν‘œν˜„ν•  수 μžˆλ‹€.
βœ… λ‹€μ΄μ–΄κ·Έλž¨ μž‘μ„± 방법
  1. 각각의 ν΄λž˜μŠ€λŠ” μ§μ‚¬κ°ν˜•μœΌλ‘œ ν‘œν˜„ν•œλ‹€.
  2. μ§μ‚¬κ°ν˜•μ„ μˆ˜ν‰μ„ μœΌλ‘œ λ‚˜λˆ  클래슀λͺ…, ν•„λ“œλͺ…, λ©”μ†Œλ“œλͺ…을 μˆœμ„œλŒ€λ‘œ μ λŠ”λ‹€.
  3. μ•‘μ„ΈμŠ€ μ œμ–΄ λ˜λŠ” λ©”μ†Œλ“œμ˜ 인자 λ“± λΆ€κ°€ 정보λ₯Ό μ κ±°λ‚˜ μƒλž΅ν•΄λ„ λœλ‹€.
  4. 좔상(abstract) ν΄λž˜μŠ€μ™€ ν•„λ“œλŠ” κΈ°μšΈμž„ 꼴둜 μž‘μ„±ν•œλ‹€.
  5. 정적(static) ν΄λž˜μŠ€μ™€ ν•„λ“œλŠ” 밑쀄을 κΈ‹λŠ”λ‹€.
βœ… μΈν„°νŽ˜μ΄μŠ€μ™€ κ΅¬ν˜„
1
2
3
4
5
6
7
8
9
interface Printable {
	abstract void print();
	abstract void newPage();
}

class PrintClass implements Printable {
	void print() { /* ... */ }
	void newPage() { /* ... */ }
}
  • <<interface>>λ₯Ό λͺ…μ‹œν•˜μ—¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν‘œν˜„ν•œλ‹€.
  • ν™”μ‚΄ν‘œλŠ” κ΅¬ν˜„μ²΄κ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 가리킀도둝 μž‘μ„±ν•œλ‹€.
βœ… μ§‘μ•½
1
2
3
4
5
6
7
8
9
10
class Color { /* ... */ }

class Fruit {
	Color color;
}

class Basket {
	Fruit[] fruits;
	// ...
}
  • μΈμŠ€ν„΄μŠ€λ₯Ό ν•„λ“œλ‘œ κ°–κ³  μžˆλŠ” ν˜•νƒœλ₯Ό 집약이라고 ν•œλ‹€.
  • κ°€λ Ή λ°”κ΅¬λ‹ˆμ— μ—¬λŸ¬ 개의 과일이 있고, 각 κ³ΌμΌμ—λŠ” 색깔이 μ‘΄μž¬ν•œλ‹€.
  • 각각을 μΈμŠ€ν„΄μŠ€μ™€ ν•„λ“œ κ°œλ…μœΌλ‘œ 보고 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

βœ… μ•‘μ„ΈμŠ€ μ œμ–΄
1
2
3
4
5
6
7
8
9
10
11
class Something {
	private int privateField;
	protected int protectedField;
	public int publicField;
	int packageField;

	private void privateMethod() { /* ... */ }
	protected void protectedMethod() { /* ... */ }
	public void publicMethod() { /* ... */ }
	void packageMethod() { /* ... */ }
}
  • public은 +, privateλŠ” -, protectedλŠ” #을 클래슀 μ•žμ— λͺ…μ‹œν•œλ‹€.
  • 같은 νŒ¨ν‚€μ§€ λ‚΄μ˜ 클래슀만 μ•‘μ„ΈμŠ€ ν•˜κ²Œ ν•˜λ €λ©΄ ~λ₯Ό 클래슀 μ•žμ— λͺ…μ‹œν•œλ‹€.
βœ… 관계

  • 클래슀 κ°„ 관계λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ ν™”μ‚΄ν‘œμ— β–Ά λ§ˆν¬μ™€ μ„€λͺ…을 ν•¨κ»˜ κΈ°μž¬ν•  수 μžˆλ‹€.
  • κ°€λ Ή μ‚¬μš©ν•˜κ±°λ‚˜ μƒμ„±ν•˜λŠ” λ“±μ˜ 관계가 μ‘΄μž¬ν•  수 μžˆλ‹€.

μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨

  • ν”„λ‘œκ·Έλž¨μ΄ μž‘λ™ν•  λ•Œ μ–΄λ–€ λ©”μ„œλ“œκ°€ μ–΄λ–€ μˆœμ„œλ‘œ μ‹€ν–‰λ˜λŠ”μ§€ ν‘œν˜„ν•œλ‹€.
  • μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨μ€ μ‹œκ°„μ— 따라 변함이 μ‘΄μž¬ν•˜λŠ” 동적인 관계λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • 각 μΈμŠ€ν„΄μŠ€μ—μ„œ μ•„λž˜ λ°©ν–₯으둜 뻗은 라이프 라인은 μ‹œκ°„μ΄ μ•„λž˜ λ°©ν–₯으둜 흐λ₯΄λ©°, μΈμŠ€ν„΄μŠ€κ°€ μƒμ‘΄ν•˜λŠ” λ™μ•ˆλ§Œ μ‘΄μž¬ν•œλ‹€.
  • 라이프 라인 μ€‘κ°„μ˜ μ„Έλ‘œλ‘œ κΈ΄ μ§μ‚¬κ°ν˜•μ€ 객체가 ν™œλ™ μ€‘μž„μ„ ν‘œν˜„ν•œλ‹€.
  • μ‹€μ„ μœΌλ‘œ 된 검은색 ν™”μ‚΄ν‘œλŠ” λ©”μ„œλ“œ ν˜ΈμΆœμ„ λ‚˜νƒ€λ‚΄λŠ”λ°, κ°€λ Ή open 라벨이 뢙은 ν™”μ‚΄ν‘œλ₯Ό μ‚΄νŽ΄ 보면 clientκ°€ server의 open λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν–ˆμŒμ„ μ•Œ 수 μžˆλ‹€.
  • λ©”μ„œλ“œ ν˜ΈμΆœμ—μ„œ μ‹œμž‘ν•˜μ—¬ μ§μ‚¬κ°ν˜•μ˜ μ•„λž˜μ—μ„œ μ™Όμͺ½μœΌλ‘œ λ»—λŠ” μ‹€μ„ μ˜ ν™”μ‚΄ν‘œλŠ” λ©”μ†Œλ“œμ˜ λ°˜ν™˜μ„ λ‚˜νƒ€λ‚΄λŠ”λ°, λ°˜ν™˜ 값이 없을 경우 μƒλž΅ν•  수 있으며, λ°˜ν™˜λ˜λ©΄ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ˜ 생쑴은 μ’…λ£Œλœλ‹€.
  • 이처럼 라이프 라인을 따라 μœ„μ—μ„œλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ 읽어 λ‚˜κ°€κ³ , ν™”μ‚΄ν‘œλ₯Ό λ”°λΌκ°€μ„œ μΈμŠ€ν„΄μŠ€ κ°„μ˜ ν˜‘μ‘° λ™μž‘μ„ ν™•μΈν•œλ‹€.
βœ… λ‹€μ΄μ–΄κ·Έλž¨ μž‘μ„± 방법
  1. 각 μΈμŠ€ν„΄μŠ€λŠ” λ‹€μ΄μ–΄κ·Έλž¨ μœ„μͺ½μ— μ§μ‚¬κ°ν˜•μœΌλ‘œ ν‘œν˜„ν•œλ‹€.
  2. μ§μ‚¬κ°ν˜• μ•ˆμ—λŠ” 콜둠 : 뒀에 클래슀 이름을 μ“°κ³  밑쀄을 κΈ‹λŠ”λ‹€.
  3. μΈμŠ€ν„΄μŠ€μ— 이름이 ν•„μš”ν•  λ•ŒλŠ” servername:Server처럼 콜둠 μ•žμ— 이름을 μ λŠ”λ‹€.

회고

  • λ³΅μž‘ν•œ μ‹œμŠ€ν…œμ„ νŒ€μ›μ—κ²Œ μ΄ν•΄ν•˜λ„λ‘ ν•˜λŠ” 것은 μ–΄λ ΅λ‹€.
  • 핡심 κΈ°λŠ₯의 λ‘œμ§μ€ UML을 μž‘μ„±ν•˜μ—¬ μ†Œν†΅ν•˜λ©΄ 쒋을 것 κ°™λ‹€λŠ” 생각을 ν–ˆλ‹€.
This post is licensed under CC BY 4.0 by the author.