개요
유니티를 공부한지 2년 정도가 지났는데 매번 프로젝트 할 떄 마다 느끼는 것이 있다.
바로, 작업 기간이 길면 길어질 수록 코드량이 많아짐에 따라 `이 코드는 어떤 기능이였지?` 하며 내가 구현한 코드임에도 어떤 기능이였는지 다시 파악하기 위해 디버깅을 하는 등 `의외로 상당한 시간이` 소요 되었다.
그래서 클래스 다이어그램으로 내가 작업한 것 들을 미리 메모해두면 나중에 까먹어도 uml을 보고 바로 기억 나지 않을까? 하는 생각에 클래스 다이어 그램 작성법을 인터넷 유튜브 등을 통해 공부하였고 기록하고자 한다.
참고 사이트
https://kimyc1223.github.io/blog/2024/04/19/TechPost.html
UML 다이어그램 - 클래스 다이어그램 정리
KimYC1223 개발 블로그
kimyc1223.github.io
알아볼 내용

🔷일반화 관계 (Generalization)

✅ 정의
- 상속(Inheritance) 관계야.
- 하나의 상위 클래스(부모)와 여러 하위 클래스(자식)가 있을 때 사용
- UML에서 속이 빈 삼각형 화살표(△) 로 표현하고,
삼각형이 부모 쪽을 가리켜.


🔷실체화 관계 (Realization)

✅ 정의
- 인터페이스(interface)와 이를 구현(implements)한 클래스 사이의 관계.
- UML에서 점선 + 속이 빈 삼각형 화살표로 표현함.
- 삼각형은 인터페이스 쪽을 향함.


🔷집합 관계 (Aggregation)

특징
- 외부에서 생성된 객체를 포함 (느슨한 포함)
- 외부 클래스를 포함은 하지만 생명주기는 공유하지 않는다
- 포함된 객체는 독립적으로 존재 가능.
Player와 Team의 관계는 Aggregaion 집합 관계이다.
public class Player
{
public string name;
}
public class Team
{
private List<Player> members;
public Team(List<Player> players)
{
this.members = players; // 외부에서 만들어진 Player 주입
}
}
💬 설명:
- Player는 Team 외부에서 생성되어 전달됨.
- Team이 삭제돼도 Player는 독립적으로 존재함.
- Team은 Player를 소유하지 않음, 그냥 포함만 함.
즉, 집합 관계!
💬 다른 예시
Taxi와 Driver관계 또한 Aggregation 집합 관계 이다.
taxiDriver가 생성된 시점은 Taxi instance가 알 수 없으며 taxiDriver와 Taxi instance의 Life cycle이 무관하기 때문에 이 관계는 Aggregation으로 볼 수 있다.

🔷합성/구성 관계 (Composition)

특징

public class Engine
{
public void Start() { Debug.Log("Engine starts!"); }
}
public class Car
{
private Engine engine;
public Car()
{
engine = new Engine(); // 내부에서 직접 생성
}
public void StartEngine()
{
engine.Start();
}
}
💬 설명:
- Engine 객체는 Car 내부에서 직접 생성됨.
- Car가 파괴되면 Engine도 같이 없어짐.
- Engine은 Car 없이는 의미 없음.
✅ 핵심 차이 요약
집합 (Aggregation) 합성 (Composition) 차이
| 생명주기 공유 | ❌ 안 함 | ✅ 공유함 |
| 포함 객체 생성 | 외부에서 생성되어 주입 | 내부에서 직접 생성 |
| 포함 객체 삭제 | 독립적으로 존재 가능 | 전체가 사라지면 함께 소멸 |
| UML 기호 | 빈 마름모 ◇── | 채운 마름모 ◆── |
🔷연관 관계 (Association)

특징
- 한 객체가 다른 객체를 참조하는 관계
- 그냥 "얘를 알고 있어요" 수준!
- 보통 필드(멤버 변수)로 다른 객체를 저장하고 있음
- 생명주기를 공유하지 않음
- UML 기호: 실선 화살표 →
📌 연관(Association) vs 집합(Aggregation)
✅ 연관 (Association) 예제
public class Player
{
private Weapon equippedWeapon;
public void EquipWeapon(Weapon weapon)
{
this.equippedWeapon = weapon;
}
}
🔍 해석
- Player는 Weapon을 그냥 사용하기 위해 잠깐 저장하는 거야.
- Player가 죽어도 Weapon은 다른 사람이 쓸 수도 있어.
- 그냥 "연결된 상태" → 연관!
✅ 집합 (Aggregation) 예제
public class Team
{
private List<Player> members;
public Team(List<Player> players)
{
this.members = players;
}
}
🔍 해석
- Team은 Player들을 “내 팀원”으로 포함하고 있어.
- 하지만 Player는 Team이 없어도 존재할 수 있어 (다른 팀에도 갈 수 있고, 팀 없이도 활동 가능).
- 이건 “포함하고 있지만 독립적인 관계” → 집합!
🧠 아주 쉽게 요약하자면
연관 vs 집합
| 관계 느낌 | 알고 지냄 | 포함하고 있음 |
| 예시 | Player가 무기를 장착함 | Team이 Player를 가짐 |
| 객체 생성 위치 | 대체로 메서드로 참조 | 대체로 생성자나 필드에 주입 |
| 생명주기 | 서로 영향 없음 | 전체가 죽어도 부분은 살 수 있음 |
🧠 초간단 외우기
- 📞 연관: "내가 너 번호는 알아"
- 🧑🤝🧑 집합: "넌 내 팀원이야, 그래도 독립적으로 살 수 있어"
🔷의존 관계 (Dependency)

특징
- 어떤 클래스가 다른 클래스의 기능을 잠깐 빌려 쓰는 관계
- 보통 메서드 인자, 지역 변수, 리턴값 등으로 잠깐 참조함
- 참조를 “유지하지 않음”
- UML에선 → 점선 화살표 - - >
예제: Shop 클래스가 CreditCard 를 사용해서 결제
public class CreditCard
{
public int Pay(int amount)
{
Debug.Log($"Paid {amount} with credit card");
return amount;
}
}
public class Shop
{
public int Checkout(CreditCard card)
{
return card.Pay(100); // 잠깐 사용하고 끝
}
}
✅ 설명:
- Shop 클래스는 CreditCard를 필드로 들고 있지 않아!
- Checkout() 메서드 안에서 일시적으로 인자를 받아서 사용하는 것뿐이야.
- 메서드 끝나면 card 참조는 사라짐.
- 따라서 이건 **의존 관계 (Dependency)**야.
🧠 쉽게 기억하기
개념 설명 예시
| 의존 | "잠깐 빌려 쓰고 끝" | Shop.Checkout(CreditCard) |
| 연관 | "필드로 참조함 (필요하면 오래 보관)" | Player → Inventory |
| 집합 | "포함하지만 독립적" | Team ◇→ Player |
| 합성 | "소유하고 함께 죽음" | Car ◆→ Engine |
📞 현실 비유
- 의존: 택시에 카드 주고 결제 → 끝
- 연관: 전화번호 저장해두고 필요할 때 자주 연락
- 집합: 너는 내 팀원이야 (같이 있지만 독립적)
- 합성: 심장처럼 너 없으면 나도 못 살아
'유니티 > 구현내용정리' 카테고리의 다른 글
| 유니티 방치형 프로젝트 - 트레일 렌더러 사용하여 근접 캐릭 공격 모션 주기 (0) | 2025.03.24 |
|---|---|
| 유니티 방치형 프로젝트 - 캐릭터 정보 스크립터블 오브젝트 데이터 적용 (1) | 2025.03.24 |
| 유니티 -방치형 프로젝트 (버튼 클릭 시 레벨업 적용하기) (2) | 2025.03.22 |
| 나누기 - 다음 Exp가 몇 오르는지 퍼센트 구하기 (0) | 2025.03.22 |
| 유니티 방치형 프로젝트 - 모바일 버튼 터치, 연속터치 판별 로직 작성 ( + 두트윈 사용하기) (0) | 2025.03.20 |
