Humility

아무리 노력해도 최고가 되지 못할 수 있다⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀그럼에도 노력하는자가 가장 겸손한 것 아닌가

공부하는 블로그

유니티/문법

[Unity] 유니티 C#) 네임스페이스 ( namespace )

새벽_글쓴이 2024. 12. 26. 23:47
반응형

네임스페이스( namespace )

코드를 논리적으로 구성하고 이름 충돌을 방지하는 핵심 기능

 

주요특징

  • 관련된 클래스, 인터페이스 등을 그룹화
  • 전체 이름(Fully Qualified Name) 사용으로 이름 충돌 방지
  • using 키워드로 다른 네임스페이스 참조 가능

 

네임스페이스 사용법

기본 사용법

namespace GameSystem 
{
    public class Player 
    {
        // 클래스 내용
    }
}

 

예시

using System.Collections.Generic;

namespace Collections
{
    public class DataStructures
    {
        // List, Dictionary, HashSet 등 바로 사용 가능
        private List<int> numbers = new List<int>();
        private Dictionary<string, int> scores = new Dictionary<string, int>();
        private HashSet<string> uniqueNames = new HashSet<string>();
    }
}

 

다른 네임스페이스 참조

using UnityEngine;
using System.Collections;

namespace MyGame 
{
    public class GameManager : MonoBehaviour 
    {
        // MonoBehaviour는 UnityEngine 네임스페이스에서 참조
    }
}

 

예시

 

UnityEngine 네임스페이스

using UnityEngine; // Transform, GameObject, Vector3 등 수백 개의 클래스 사용 가능

public class PlayerController : MonoBehaviour 
{
    private Vector3 position;
    private GameObject player;
    private Transform transform;
    
    // 이처럼 UnityEngine 내의 다양한 클래스들을 직접 사용 가능
}

 

using 없이 사용한다면

public class PlayerController : UnityEngine.MonoBehaviour 
{
    private UnityEngine.Vector3 position;
    private UnityEngine.GameObject player;
    // 매번 전체 경로를 적어야 함
}

 

중첩 네임스페이스

namespace MyGame.Characters.Enemy 
{
    public class Boss 
    {
        // 보스 캐릭터 관련 코드
    }
}

 

예시

// 무기 시스템 네임스페이스
namespace RPG.Combat.Weapons
{
    public abstract class Weapon
    {
        public float damage;
        public float durability;
        public abstract void Attack();
    }

    public class Sword : Weapon
    {
        public override void Attack()
        {
            // 근접 공격 구현
        }
    }

    public class Bow : Weapon
    {
        public float arrowSpeed;
        public override void Attack()
        {
            // 원거리 공격 구현
        }
    }
}

// 마법 시스템 네임스페이스
namespace RPG.Combat.Magic
{
    public abstract class Spell
    {
        public float manaCost;
        public float castTime;
        public abstract void Cast();
    }

    public class Fireball : Spell
    {
        public float burnDamage;
        public override void Cast()
        {
            // 화염구 발사 구현
        }
    }
}

// 실제 플레이어 클래스에서 사용
using RPG.Combat.Weapons;
using RPG.Combat.Magic;

public class Player : MonoBehaviour
{
    private Sword playerSword;
    private Bow playerBow;
    private Fireball fireballSpell;

    void Attack()
    {
        playerSword.Attack();
        // 또는
        fireballSpell.Cast();
    }
}

 

점(.)을 사용한 네임스페이스 계층 구조

이는 상속개념이 아닌 단순히 코드를 조직화 하는 계층 구조이다
namespace Game        // 최상위
{
    // Game 관련 코드
}

namespace Game.UI    // Game의 하위
{
    // UI 관련 코드
}

// 두 가지 작성 방식 모두 동일한 결과
namespace Game.UI.Inventory  // 점(.) 사용
{
}

namespace Game
{
    namespace UI 
    {
        namespace Inventory
        {
        }
    }
}

 

주의

점(.)으로 작성하는 것은 단순히 축약된 문법이기에 상위 네임스페이스들이
실제로 존재하지 않아도 이 네임스페이스를 사용하는 데에는 문제가 없다
// 이렇게만 작성해도 됨
namespace Game.UI.Inventory 
{
    public class InventorySystem { }
}

// 다른 파일에서 사용할 때
using Game.UI.Inventory;

 

네임스페이스를 사용하는 주요 이유

1. 이름 충돌 방지

서로 다른 기능을 하는 동일한 이름의 클래스가 있을 때 구분 가능

예시
Game.UI.Window // UI용 Window 클래스
Game.Core.Window // 게임 로직용 Window 클래스

 

2. 코드 구조화

대규모 프로젝트에서 수백개의 클래스를 논리적으로 정리
팀원들이 코드 구조를 쉽게 파악 가능

 

3. 모듈화와 재사용

관련 기능을 패키지로 묶어서 다른 프로젝트에서 재사용 가능
특정 기능만 분리해서 업데이트나 수정 가능

 

네임스페이스는 대규모 게임 프로젝트에서 코드를
체계적으로 관리할 수 있게 해주는 역할이 가장 큰 부분인 것 같다
그렇기에 혼자 게임을 개발하거나, 공부하면 네임스페이스 부분은
언제 어떻게 써야할지가 가장 애매하고 어려운 부분인 것 같다.

그래서 나 나름대로 내린 결론은 아래와 같다

 

예를 들어, 인벤토리 제작시에는...

해당 기능에 정말 필수적인 요소만 넣을 때는 클래스 관리

public class Inventory
public class InventorySlot
public class InventoryUI

 

실제 게임 개발처럼 다양하고 복잡하고 사소한 디테일 하나 까지 챙기게 된다면 네임스페이스 관리

// 여러종류의 인벤토리 시스템
// 다양한 UI 구성요소
// 데이터 저장/로드 시스템
// 아이템 관리 시스템 등등

namespace Game.Inventory.Core  // 핵심 시스템
namespace Game.Inventory.UI    // UI 관련
namespace Game.Inventory.Data  // 데이터 처리

 

즉, 기능이 확장되고 복잡도가 증가할때, 고려하면 된다라고 생각이 들었다

반응형