C#의 partial 키워드
partial은 C#에서 클래스, 구조체, 인터페이스, 메서드의 정의를 여러 부분으로 나눌 수 있게 해주는 키워드입니다.
특히 코드 생성기와 사용자 정의 코드의 분리, 확장성, 유지보수성 향상에 매우 유용하게 쓰입니다.
1. partial class
정의
partial class는 하나의 클래스 정의를 여러 파일이나 코드 블록에 나누어 작성할 수 있도록 해주는 기능입니다.
사용 목적
| 목적 | 설명 |
|---|
| 자동 생성 코드 분리 | 디자이너/툴이 생성한 코드와 사용자가 작성한 코드를 분리 |
| 큰 클래스 분할 | 기능별로 나누어 유지보수 용이성 향상 |
| 협업 관리 | 여러 사람이 같은 클래스의 서로 다른 기능을 개발할 수 있도록 분할 가능 |
| 가독성 향상 | 한 파일에 너무 많은 코드가 있는 것을 방지 |
예시
1
2
3
4
5
6
7
8
9
10
11
| // File: MyClass.Part1.cs
public partial class MyClass
{
public void MethodA() { }
}
// File: MyClass.Part2.cs
public partial class MyClass
{
public void MethodB() { }
}
|
두 파일은 컴파일 시 하나의 MyClass로 통합됩니다.
Unity에서의 활용 예시
1
2
3
4
5
6
7
8
9
10
11
| // PlayerController.Movement.cs
public partial class PlayerController : MonoBehaviour
{
void Move() { }
}
// PlayerController.Animation.cs
public partial class PlayerController : MonoBehaviour
{
void PlayAnimation() { }
}
|
제약 조건
- 같은 네임스페이스, 접근 제한자, 클래스 이름이어야 함
- generic 타입, static 여부도 동일해야 함
2. partial method
정의
partial method는 partial class 또는 partial struct 내부에서 선언할 수 있는 메서드입니다.
선언만 존재할 수도 있고, 필요하면 구현도 제공할 수 있습니다.
구현이 없으면 호출도 컴파일 시 제거되어 성능 오버헤드가 없음
문법 예시
1
2
3
4
5
6
7
8
| // 선언부 (.Designer.cs 같은 자동 생성 파일에 있을 수 있음)
partial void OnInitialized();
// 구현부 (사용자 코드)
partial void OnInitialized()
{
Console.WriteLine("초기화됨");
}
|
주요 특징
| 항목 | 설명 |
|---|
| 선언만 가능 | 구현이 없으면 컴파일 시 제거됨 |
| 반환 타입 | void만 가능 |
| 접근 제한자 | 사용 불가능 (항상 private) |
| 매개변수 | 사용 가능 |
| 사용 범위 | partial class/struct 내부에서만 사용 가능 |
사용 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| // Monster.Designer.cs
public partial class Monster
{
public void Init()
{
OnInit(); // 사용자 구현이 없으면 이 호출도 사라짐
}
partial void OnInit();
}
// Monster.cs
public partial class Monster
{
partial void OnInit()
{
Debug.Log("몬스터 초기화 완료");
}
}
|
사용 목적
| 목적 | 설명 |
|---|
| 자동 생성 코드 확장 | 사용자 정의 후킹 포인트 제공 |
| 성능 최적화 | 필요하지 않으면 호출 자체 제거됨 |
| 유연한 확장 | 선언만 제공하고, 구현 여부는 사용자에게 위임 |
3. partial 키워드 요약 비교
| 항목 | partial class | partial method |
|---|
| 정의 | 클래스 정의 분할 | 메서드 선언/구현 분할 |
| 사용 위치 | class, struct, interface | partial class/struct 내부 |
| 반환 타입 | 제한 없음 | void만 허용 |
| 접근자 사용 | 가능 | 불가 (private 고정) |
| 컴파일 제거 | 없음 | 구현 없으면 자동 제거 |
| 주 사용처 | 대형 클래스 분할, 코드 생성 | 자동 생성 코드 확장, 성능 최적화 |