유니티 - 클래스 다이어 그램 (UML 다이어그램) 정리

반응형

개요

유니티를 공부한지 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

📞 현실 비유

  • 의존: 택시에 카드 주고 결제 → 끝
  • 연관: 전화번호 저장해두고 필요할 때 자주 연락
  • 집합: 너는 내 팀원이야 (같이 있지만 독립적)
  • 합성: 심장처럼 너 없으면 나도 못 살아

 

반응형