Partial 클래스 및 메서드(C# 프로그래밍 가이드)Partial Classes and Methods (C# Programming Guide)

클래스, 구조체, 인터페이스 또는 메서드의 정의를 둘 이상의 소스 파일에 분할할 수 있습니다.It is possible to split the definition of a class, a struct, an interface or a method over two or more source files. 각 소스 파일에는 형식 또는 메서드 정의 섹션이 있으며 모든 부분은 애플리케이션이 컴파일될 때 결합됩니다.Each source file contains a section of the type or method definition, and all parts are combined when the application is compiled.

partial 클래스Partial Classes

클래스 정의를 분할하는 것이 바람직한 몇 가지 상황이 있습니다.There are several situations when splitting a class definition is desirable:

  • 대규모 프로젝트에서 작업하는 경우 클래스를 개별 파일에 분산하면 여러 프로그래머가 동시에 클래스에 대해 작업할 수 있습니다.When working on large projects, spreading a class over separate files enables multiple programmers to work on it at the same time.

  • 자동으로 생성된 소스로 작업하는 경우 소스 파일을 다시 만들지 않고도 클래스에 코드를 추가할 수 있습니다.When working with automatically generated source, code can be added to the class without having to recreate the source file. Visual Studio에서는 Windows Forms, 웹 서비스 래퍼 코드 등에 만들 때 이 방식을 사용합니다.Visual Studio uses this approach when it creates Windows Forms, Web service wrapper code, and so on. Visual Studio에서 만든 파일을 수정하지 않고도 이러한 클래스를 사용하는 코드를 만들 수 있습니다.You can create code that uses these classes without having to modify the file created by Visual Studio.

  • 클래스 정의를 분할하려면 다음과 같이 partial 키워드 한정자를 사용합니다.To split a class definition, use the partial keyword modifier, as shown here:

    public partial class Employee
    {
        public void DoWork()
        {
        }
    }
    
    public partial class Employee
    {
        public void GoToLunch()
        {
        }
    }
    

partial 키워드는 클래스, 구조체 또는 인터페이스의 다른 부분을 네임스페이스에서 정의할 수 있음을 나타냅니다.The partial keyword indicates that other parts of the class, struct, or interface can be defined in the namespace. 모든 부분은 partial 키워드를 사용해야 합니다.All the parts must use the partial keyword. 최종 형식을 생성하려면 컴파일 시간에 모든 부분을 사용할 수 있어야 합니다.All the parts must be available at compile time to form the final type. 모든 부분에 public, private 등의 동일한 액세스 가능성이 있어야 합니다.All the parts must have the same accessibility, such as public, private, and so on.

부분이 abstract로 선언된 경우 전체 형식이 abstract로 간주됩니다.If any part is declared abstract, then the whole type is considered abstract. 부분이 sealed로 선언된 경우 전체 형식이 sealed로 간주됩니다.If any part is declared sealed, then the whole type is considered sealed. 부분이 기본 형식을 선언하는 경우 전체 형식이 해당 클래스를 상속합니다.If any part declares a base type, then the whole type inherits that class.

기본 클래스를 지정하는 부분은 모두 일치해야 하지만 기본 클래스를 생략하는 부분도 여전히 기본 형식을 상속합니다.All the parts that specify a base class must agree, but parts that omit a base class still inherit the base type. 부분에서 다른 기본 인터페이스를 지정할 수 있으며, 최종 형식은 모든 partial 선언에 나열된 모든 인터페이스를 구현합니다.Parts can specify different base interfaces, and the final type implements all the interfaces listed by all the partial declarations. 부분 정의에 선언된 클래스, 구조체 또는 인터페이스 멤버는 다른 모든 부분에서 사용할 수 있습니다.Any class, struct, or interface members declared in a partial definition are available to all the other parts. 최종 형식은 컴파일 시간의 모든 부분 조합입니다.The final type is the combination of all the parts at compile time.

참고

대리자 또는 열거형 선언에서는 partial 한정자를 사용할 수 없습니다.The partial modifier is not available on delegate or enumeration declarations.

다음 예제에서는 중첩된 대상 형식 자체는 부분이 아니어도 중첩된 형식이 부분일 수 있음을 보여 줍니다.The following example shows that nested types can be partial, even if the type they are nested within is not partial itself.

class Container
{
    partial class Nested
    {
        void Test() { }
    }

    partial class Nested
    {
        void Test2() { }
    }
}

컴파일 시간에 부분 형식(Partial Type) 정의의 특성이 병합됩니다.At compile time, attributes of partial-type definitions are merged. 예를 들어 다음 선언을 살펴보세요.For example, consider the following declarations:

[SerializableAttribute]
partial class Moon { }

[ObsoleteAttribute]
partial class Moon { }

이러한 선언은 다음 선언과 동일합니다.They are equivalent to the following declarations:

[SerializableAttribute]
[ObsoleteAttribute]
class Moon { }

다음은 모든 부분 형식(Partial Type) 정의에서 병합됩니다.The following are merged from all the partial-type definitions:

  • XML 주석XML comments

  • 인터페이스interfaces

  • 제네릭 형식 매개 변수 특성generic-type parameter attributes

  • 클래스 특성class attributes

  • 멤버members

예를 들어 다음 선언을 살펴보세요.For example, consider the following declarations:

partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

이러한 선언은 다음 선언과 동일합니다.They are equivalent to the following declarations:

class Earth : Planet, IRotate, IRevolve { }

제한Restrictions

partial 클래스 정의로 작업할 때 따라야 할 몇 가지 규칙이 있습니다.There are several rules to follow when you are working with partial class definitions:

  • 동일한 형식의 일부로 작성된 모든 부분 형식(Partial Type) 정의를 partial로 수정해야 합니다.All partial-type definitions meant to be parts of the same type must be modified with partial. 예를 들어 다음 클래스 선언은 오류를 생성합니다.For example, the following class declarations generate an error:

    public partial class A { }
    //public class A { }  // Error, must also be marked partial
    
  • partial 한정자는 class, struct 또는 interface 키워드 바로 앞에만 올 수 있습니다.The partial modifier can only appear immediately before the keywords class, struct, or interface.

  • 다음 예제와 같이 부분 형식(Partial Type) 정의에 중첩된 부분 형식(Partial Type)을 사용할 수 있습니다.Nested partial types are allowed in partial-type definitions as illustrated in the following example:

    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
  • 동일한 형식의 일부로 작성된 모든 부분 형식(Partial Type) 정의는 동일한 어셈블리와 동일한 모듈(.exe 또는 .dll 파일)에서 정의해야 합니다.All partial-type definitions meant to be parts of the same type must be defined in the same assembly and the same module (.exe or .dll file). 부분 정의는 여러 모듈에 걸쳐 있을 수 없습니다.Partial definitions cannot span multiple modules.

  • 모든 부분 형식(Partial Type) 정의에서 클래스 이름 및 제네릭 형식 매개 변수가 일치해야 합니다.The class name and generic-type parameters must match on all partial-type definitions. 제네릭 형식은 부분일 수 있습니다.Generic types can be partial. 각 부분 선언에서 동일한 매개 변수 이름을 동일한 순서로 사용해야 합니다.Each partial declaration must use the same parameter names in the same order.

  • 부분 형식(Partial Type) 정의에서 다음 키워드는 선택 사항이지만, 부분 형식(Partial Type) 정의에 있는 경우 동일한 형식의 다른 부분 정의에서 지정된 키워드와 충돌할 수 없습니다.The following keywords on a partial-type definition are optional, but if present on one partial-type definition, cannot conflict with the keywords specified on another partial definition for the same type:

자세한 내용은 형식 매개 변수에 대한 제약 조건을 참조하세요.For more information, see Constraints on Type Parameters.

예제 1Example 1

설명Description

다음 예제에서는 Coords 클래스의 생성자 및 필드가 하나의 partial 클래스 정의에서 선언되고 PrintCoords 멤버가 다른 partial 클래스 정의에서 선언됩니다.In the following example, the fields and the constructor of the class, Coords, are declared in one partial class definition, and the member, PrintCoords, is declared in another partial class definition.

코드Code

public partial class Coords
{
    private int x;
    private int y;

    public Coords(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

public partial class Coords
{
    public void PrintCoords()
    {
        Console.WriteLine("Coords: {0},{1}", x, y);
    }
}

class TestCoords
{
    static void Main()
    {
        Coords myCoords = new Coords(10, 15);
        myCoords.PrintCoords();

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output: Coords: 10,15

예제 2Example 2

설명Description

다음 예제에서는 partial 구조체와 인터페이스도 개발할 수 있음을 보여 줍니다.The following example shows that you can also develop partial structs and interfaces.

코드Code

partial interface ITest
{
    void Interface_Test();
}

partial interface ITest
{
    void Interface_Test2();
}

partial struct S1
{
    void Struct_Test() { }
}

partial struct S1
{
    void Struct_Test2() { }
}

부분 메서드Partial Methods

partial 클래스 또는 구조체에는 부분 메서드(Partial Method)가 포함될 수 있습니다.A partial class or struct may contain a partial method. 클래스의 한 부분에는 메서드의 시그니처가 포함되어 있습니다.One part of the class contains the signature of the method. 구현은 동일한 부분 또는 다른 부분에서 정의될 수 있습니다.An implementation can be defined in the same part or another part. 구현을 제공하지 않으면 메서드와 모든 메서드 호출이 컴파일 시간에 제거됩니다.If the implementation is not supplied, then the method and all calls to the method are removed at compile time. 메서드 시그니처에 따라 구현이 필요할 수 있습니다.Implementation may be required depending on method signature.

부분 메서드(Partial Method)를 사용하면 클래스 중 한 부분의 구현자가 이벤트와 비슷하게 메서드를 정의할 수 있습니다.Partial methods enable the implementer of one part of a class to define a method, similar to an event. 클래스 중 다른 부분의 구현자는 메서드를 구현할지 여부를 결정할 수 있습니다.The implementer of the other part of the class can decide whether to implement the method or not. 메서드가 구현되지 않은 경우 컴파일러는 메서드 시그니처 및 모든 메서드 호출을 제거합니다.If the method is not implemented, then the compiler removes the method signature and all calls to the method. 호출의 인수 평가에서 발생하는 모든 결과를 포함하여 메서드 호출은 런타임에 영향을 주지 않습니다.The calls to the method, including any results that would occur from evaluation of arguments in the calls, have no effect at run time. 따라서 partial 클래스의 코드는 구현이 제공되지 않은 경우에도 부분 메서드(Partial Method)를 자유롭게 사용할 수 있습니다.Therefore, any code in the partial class can freely use a partial method, even if the implementation is not supplied. 메서드가 호출되었지만 구현되지 않은 경우 컴파일 시간 또는 런타임 오류가 발생하지 않습니다.No compile-time or run-time errors will result if the method is called but not implemented.

부분 메서드(Partial Method)는 생성된 코드를 사용자 지정하는 방법으로 특히 유용합니다.Partial methods are especially useful as a way to customize generated code. 생성된 코드가 메서드를 호출할 수 있지만 개발자가 메서드를 구현할지 여부를 결정할 수 있도록 메서드 이름과 시그니처를 예약할 수 있습니다.They allow for a method name and signature to be reserved, so that generated code can call the method but the developer can decide whether to implement the method. partial 클래스와 마찬가지로, 부분 메서드(Partial Method)는 코드 생성기에 의해 생성된 코드와 개발자가 직접 만든 코드가 런타임 비용 없이 함께 작동할 수 있도록 합니다.Much like partial classes, partial methods enable code created by a code generator and code created by a human developer to work together without run-time costs.

부분 메서드(Partial Method) 선언은 정의와 구현, 두 부분으로 이루어집니다.A partial method declaration consists of two parts: the definition, and the implementation. partial 클래스의 개별 부분이나 동일한 부분에 있을 수 있습니다.These may be in separate parts of a partial class, or in the same part. 구현 선언이 없는 경우 컴파일러는 정의하는 선언과 모든 메서드 호출을 최적화합니다.If there is no implementation declaration, then the compiler optimizes away both the defining declaration and all calls to the method.

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

// Implementation in file2.cs
partial void OnNameChanged()
{
  // method body
}
  • 부분 메서드 선언은 상황별 키워드 partial로 시작해야 합니다.Partial method declarations must begin with the contextual keyword partial.

  • 부분 형식(Partial Type)의 두 부분에 있는 부분 메서드 시그니처가 일치해야 합니다.Partial method signatures in both parts of the partial type must match.

  • 부분 메서드(Partial Method)는 staticunsafe 한정자를 사용할 수 없습니다.Partial methods can have static and unsafe modifiers.

  • 부분 메서드(Partial Method)는 제네릭일 수 있습니다.Partial methods can be generic. 제약 조건은 정의하는 부분 메서드(Partial Method) 선언에 배치되며 필요에 따라 구현하는 선언에서 반복될 수 있습니다.Constraints are put on the defining partial method declaration, and may optionally be repeated on the implementing one. 매개 변수 및 형식 매개 변수 이름이 정의하는 선언과 구현하는 선언에서 동일할 필요는 없습니다.Parameter and type parameter names do not have to be the same in the implementing declaration as in the defining one.

  • 정의 및 구현된 부분 메서드(Partial Method)에 대한 대리자는 만들 수 있지만 정의만 된 부분 메서드(Partial Method)에 대한 대리자는 만들 수 없습니다.You can make a delegate to a partial method that has been defined and implemented, but not to a partial method that has only been defined.

부분 메서드는 다음 경우에 구현을 포함할 필요가 없습니다.A partial method isn't required to have an implementation in the following cases:

해당 일부 제한 사항을 따르지 않는 모든 메서드(public virtual partial void 메서드)는 구현을 제공해야 합니다.Any method that doesn't conform to all those restrictions (for example, public virtual partial void method), must provide an implementation.

C# 언어 사양C# Language Specification

자세한 내용은 C# 언어 사양부분 형식을 참조하세요.For more information, see Partial types in the C# Language Specification. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.The language specification is the definitive source for C# syntax and usage.

참고 항목See also