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)에 정의해야 함
- 아래 키워드를 다르게 설정할 경우 충돌
- public, private, protected, internal
- abstarct, sealead
- new 한정자
- 제너릭 제약 조건
| 부분 메서드
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 |