partial 한정자는 클래스, 구조체, 인터페이스 등을 둘 이상의 분할된 형태로 정의할 수 있는 키워드다. (부분 클래스, 부분 메서드 등으로 불림) (C# 2.0) 분할된 파일들은 컴파일될 때 결합된다.

 

다음은 partial이 권장되는 몇 가지 상황이다.

 

  • 대규모 프로젝트에서 한 클래스에 대해 여러 프로그래머가 동시에 작업할 경우
  • 스크립트 일부를 자동 생성하는 경우 (예) Windows Forms)

 

| partial 키워드 사용방법

 

// Foo.cs
public partial class Foo
{
    public void DoWork()
    {
    }
}

// Foo.Generated.cs
public partial class Foo
{
    public void Bar()
    {
    }
}
 

class, struct, interface앞에 partial 한정자를 기입하면 된다.

단, public, private 등과 같은 액세스 한정자로 지정해야한다. (class, struct, interface, 멤버 등 모든 경우)

 

| 병합 범위

 

class, struct 등의 부분이 absract, sealed로 선언되면 전체 형식이 absract, sealed로 간주된다.

 

이외에도 병합되는 것들

  • XML 주석 (예) summary, returns)
  • 인터페이스
  • 제너릭 형식 매개 변수 Attrbute
  • 클래스 Attribute
  • 멤버
[SerializableAttribute]
partial class Moon { }

[ObsoleteAttribute]
partial class Moon { }

>> 

[SerializableAttribute]
[ObsoleteAttribute]
class Moon { }
 
  • Attribute 병합 예
partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

>>

class Earth : Planet, IRotate, IRevolve { }
 
  • 인터페이스 병합 예

 

| 제한사항

 

  • partial로 정의된 형식의 모든 부분이 partial로 정의되어야 함
public partial class A { }
//public class A { }  // Error, must also be marked partial
 
  • 동일한 어셈블리에 동일한 모듈(exe 혹은 dll)에 정의해야 함
  • 아래 키워드를 다르게 설정할 경우 충돌

 

  1. public, private, protected, internal
  2. abstarct, sealead
  3. new 한정자
  4. 제너릭 제약 조건

 

| 부분 메서드

 

C# 3.0 사양에 추가된 내용으로 메서드 또한 부분 형식으로 정의가 가능하다.

partial 키워드 자체가 우선순위 없이 병합되는 형식이기 때문에

부분 메서드의 경우엔 정의 부분과 구현 부분으로 나뉜다.

// Definition in file1.cs
partial void OnNameChanged();

// Implementation in file2.cs
partial void OnNameChanged()
{
  // method body
}
 

하나 특이한 점은 구현되지 않는 부분 메서드의 경우(정의 부분만 있는) 컴파일러가 메서드 정의, 호출 코드를 삭제한다.

 

한정자나 제한 상황에 따라 구현을 포함해야하는 지 여부가 갈린다.

아래 제한 사항을 따른다면 구현을 포함하지 않아도 된다.

 

  • 액세스 한정자가 없는 경우 (디폴트: private)
  • void를 반환
  • out 매개 변수 없는 경우
  • 한정자 virtual, override, sealed, new, extern가 없는 경우

 

위 제한 사항을 따르지 않는 경우엔 (예) public virtual partial void) 구현을 제공해야만 한다.

 

| 부분 메서드 제한사항

 

  • unsafe, static 한정자를 사용할 수 없다.

 

| 참고

 

 

반응형

'Workspace > C#' 카테고리의 다른 글

[C# 7.0] 출력(out) 변수 선언  (0) 2023.04.17
[C# 7.0] 로컬 함수  (0) 2023.04.17
[C#] new 한정자  (0) 2023.04.06
[C# 7] Tuple  (0) 2023.04.06
[C#] .NET Framework에 대응되는 버전  (0) 2023.04.06

+ Recent posts