본문 바로가기

IT

[C#] 왜 partial class를 사용하는걸까요?


안녕하세요,

러시아에서 생활하고 있는 개발자 윤진입니다.


C#에는 정말 흥미로운 기능들이 많이 있더군요.

한국에서 공수해온 C# 책에서는 기능에 대한 단편적인 설명만 있어서,

해당 기능에 대한 존재의미(레종데트르)를 고민하게끔 만들어주는데요.


이번에는 partial class에 대해 간단히 탐구해보도록 하겠습니다.

partial class는 class를 정의할때 한군데가 아닌,

복수의 장소에서 class를 정의할 수 있도록 지원하고 있습니다.



partial class Korea
{
    public int south;
}

partial class Korea
{
    protected int north;
}


- Code Generator 자동생성

윈도우 폼을 생성할 때,

Code generator는 partial class를 Form1.cs과 Form1.Designer.cs 파일에 나눠 정의됩니다.

Code generator는 클래스 내부에서 개발자가 손 댈 필요가 없는 부분을 떼어 Form1.Designer.cs에 놓고,

개발자의 손길을 거쳐야하는 부분만 Form1.cs에 놓아, 개발자가 필요한 코드에만 집중하도록 지원합니다.


- 다수 개발자의 개발

다수의 개발자가 한 클래스를 개발하는 경우를 상상해보면,

개발자들은 단위기능으로 적당히 역할분담을 할 것입니다.

이 경우 partial class를 사용하여 여러 파일에서 개발하면,

한 파일에서 작업할 때 발생할 수 있는 conflict를 막을 수 있습니다.


- partial method 사용

다수의 개발자가 한 클래스를 개발할 때,

partial class의 한 부분에서는 함수선언만 하고, 다른 부분에서는 함수정의를 할 수 있습니다.

partial class의 한 부분이 추상클래스이고, 다른 부분이 구현 클래스가 되겠네요.

만약, partial method가 정의되지 않았다면,

컴파일 이전에 선언된 method를 제외하고 컴파일을 하게 됩니다.


단, partial method는 아래의 세가지 조건을 만족해야 합니다.

1. 선언과 정의의 타입이 일치해야합니다.

이는 따로 고민할 필요도 없는 당연한 이야기입니다.


2. 메소드는 반드시 void를 리턴해야합니다.

partial은 선언과 구현을 분리하여 진행할 수 있으므로,

특정 컴파일 시점에서는 선언만 되어 있을 수 있습니다.

만약 partial method의 return 값이 void 외의 타입이라면,

해당 return 값을 특정 변수에 넣을 수 있겠죠.

그렇지만, partial method가 정의되지 않은 상태이기 때문에,

해당 변수는 제대로 초기화 혹은 정의될 수 없습니다.

이런 잠재적인 문제를 막기위해 partial은 void를 리턴하도록 하고 있습니다.


3. 접근 수준은 오직 partial로 이는 private입니다.

이는 컴파일 시점에 partial method가 구현되어 있지 않으면,

컴파일러가 컴파일 대상에서 빼버리는 것과 관련있습니다.

선언만 되어 있는 partial method를 class 외부에서 사용하고 있다면,

컴파일 시점에 해당 메소드를 참조할 수 없어 제대로 컴파일 되지 않겠죠.

이 문제를 해소하려면, 

1) partial method를 정의하거나 2) 외부에서 사용하는 부분을 제거해야 하죠.

그렇지만, 이는 일반 method의 사용양식과 별반 다를게 없죠.

partial method는 선언만 되어있는 상태라 해도 무결하게 컴파일되는 상태이니까요.


MSDN에서 예시로 든 코드를 보면, 위의 조건을 확인할 수 있습니다.


    namespace PM
    {
        partial class A
        {
            partial void OnSomethingHappened(string s);
        }

        // This part can be in a separate file.
        partial class A
        {
            // Comment out this method and the program
            // will still compile.
            partial void OnSomethingHappened(String s)
            {
                Console.WriteLine("Something happened: {0}", s);
            }
        }
    }


다른 유용한 경우도 있을 수 있습니다.

추가로 발견하면 갱신하도록 하겠습니다.


즐거운 하루 보내세요~



* Reference

https://msdn.microsoft.com/en-us/library/6b0scde8.aspx