"namespace와 partial"
개발을 하다보면 프로젝트가 커지면서 같은 이름의 클래스가 겹치거나,
한 파일이 너무 비대해져서 관리가 어려워지는 순간을 만나게 된다.
특히 Unity에서는 스크립트가 늘어날수록 Player, Manager, Data 같은 흔한 이름들이 여기저기 생기고,
기능도 점점 덕지덕지 붙으면서 파일 하나가 거대한 '만능 스크립트'가 되기도 한다.
이때 코드를 폴더가 아니라 ‘논리적인 영역’으로 묶어 충돌을 피하는 방법이 namespace,
하나의 클래스를 여러 파일로 쪼개서 관리하는 방법이 partial이다.
오늘은 namespace와 partial이 뭔지, 언제/왜 쓰는지 간단히 정리해볼 예정이다.
1) namespace 란?
namespace는 클래스/구조체/인터페이스 등을 이름의 공간으로 묶어주는 문법이다.
같은 이름의 타입이 존재해도 서로 다른 namespace에 있으면 충돌하지 않는다.
이름 충돌을 막는 방식
(같은 이름) Player
├─ Game.Player ← 게임 플레이어
└─ Network.Player ← 네트워크 플레이어
예시 코드
namespace Game
{
public class Player { }
}
namespace Network
{
public class Player { }
}
// 사용 시
Game.Player gamePlayer = new Game.Player();
Network.Player netPlayer = new Network.Player();
2) namespace가 필요한 이유는?
namespace가 없으면
프로젝트가 커질수록 이름 충돌, 가독성 저하, 의존성 꼬임이 빠르게 늘어난다.
반대로 namespace를 잘 잡아두면,
코드가 어디 소속인지 명확해지고, 유지보수가 편해진다.
+++
namespace의 특징
이름 충돌 방지 (동일 클래스명 공존 가능)
코드 구조화 (도메인/기능 단위로 구분)
의존성 관리에 유리 (using으로 필요한 범위만 가져오기)
읽는 사람이 빠르게 맥락 파악 (UI.*, Gameplay.*, Data.*)
Unity 프로젝트 namespace 사용 예시
MyGame
├─ MyGame.Core
├─ MyGame.Gameplay
│ ├─ MyGame.Gameplay.Combat
│ └─ MyGame.Gameplay.Movement
├─ MyGame.UI
└─ MyGame.Data
폴더 구조와 namespace를 1:1로 강제할 필요는 없지만,
어느 정도 맞춰두면 찾기/이해 속도가 좋아진다.
3) partial 이란?
partial은 하나의 클래스를 여러 파일로 나눠 작성할 수 있게 해주는 키워드다.
컴파일 시점에 조각들이 합쳐져서 '하나의 클래스'가 된다.
partial 클래스 개념도
Player.cs Player.Input.cs Player.Anim.cs
partial class partial class partial class
Player + Player + Player
└──────────────┴───────────────────────┘
컴파일 시 Player 하나로 합쳐짐
이렇게 나누면
Player라는 한 객체는 유지하면서도
입력/이동/애니메이션/전투 로직을 파일 단위로 분리할 수 있다.
+++
partial의 사용 규칙
모든 조각에 partial 키워드가 있어야 함
같은 namespace 안이어야 함
같은 어셈블리(asmdef 기준) 안이어야 함
멤버(필드/메서드) 이름이 겹치면 당연히 컴파일 에러
예시코드
using UnityEngine;
namespace MyGame.Gameplay
{
public partial class Player : MonoBehaviour
{
public int hp = 100;
private void Update()
{
HandleInput();
}
}
}
Player.cs
using UnityEngine;
namespace MyGame.Gameplay
{
public partial class Player
{
private void HandleInput()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
}
private void Jump()
{
// 점프 처리
}
}
}
Player.Input.cs
4) partial이 유용한 케이스
(a) 자동 생성 코드와 내 코드를 분리하고 싶을 때
어떤 툴/제너레이터가 만든 파일은 건드리면 다시 덮어써질 수 있다.
이럴 때 생성 파일은 partial, 내가 작성하는 확장도 partial로 두면 안전하다.
(b) Editor 전용 기능을 깔끔하게 분리 (#if UNITY_EDITOR)
#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
namespace MyGame.Gameplay
{
public partial class Player
{
[ContextMenu("Debug/Print HP")]
private void PrintHp()
{
Debug.Log($"HP: {hp}");
}
}
}
#endif
Player.Editor.cs
런타임 빌드에는 들어가면 안 되는 코드(에디터 유틸 등)를 partial로 분리해두면 관리가 편하다.
(c) “한 클래스의 책임은 유지”하면서 “파일 크기만” 쪼개고 싶을 때
클래스를 억지로 여러 클래스로 쪼개면 구조가 더 복잡해질 때가 있다.
그럴 땐 클래스는 하나로 두고 파일만 분리하는 partial이 유용하다.
5) 오늘의 한 줄 요약
『 namespace는 이름 충돌을 막는 주소 체계, partial은 하나의 클래스를 여러 파일로 나눠 관리하는 방법이다. 』
'1일 1 cs' 카테고리의 다른 글
| 23. 스크립터블 오브젝트(ScriptalbeObject) 란? (0) | 2026.02.09 |
|---|---|
| 22. 박싱(Boxing)과 언박싱(Unboxing)이란? (0) | 2026.02.08 |
| 20. 시네머신(Cinemachine)이란? (3) | 2026.02.06 |
| 19. API (Application Programming Interface) 란? (0) | 2026.02.04 |
| 18. 이진 트리 순회(Traversal)란? (0) | 2026.02.02 |