포스트

[C#] partial

[C#] partial

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 methodpartial 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 classpartial method
정의클래스 정의 분할메서드 선언/구현 분할
사용 위치class, struct, interfacepartial class/struct 내부
반환 타입제한 없음void만 허용
접근자 사용가능불가 (private 고정)
컴파일 제거없음구현 없으면 자동 제거
주 사용처대형 클래스 분할, 코드 생성자동 생성 코드 확장, 성능 최적화
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.