C# 2.0의 partial classes

닷넷 2.0의 새롭게 추가된 기능으로 partial classes 에 대해 설명해 보겠습니다.

partial class란 동일한 클래스를 여러 파일에 분리하여 개발가능하도록 구현된 기술입니다.

기존 VS 1.0 에서는 하나의 파일에는 하나 혹은 둘 이상의 클래스를 구현할 수 있습니다.

하지만 두 개의 파일에서 하나의 클래스를 구현할 수가 없었습니다.

2.0에서는 이렇게 두개 이상의 파일에 하나의 클래스를 구현해 줄수가 있습니다.

이렇게 함으로써 얻을 수 있는 이점들은 다음과 같습니다.

1. 소스세이프 사용시 기존 1.0에서 하나의 파일(클래스)을 여러명이 사용하고자 하는 경우, 옵션 설정하여 여러명이 한 파일을

체크아웃해서 수정되고 난 후 Merge 하도록 했습니다. 하지만 이럴 경우 소스가 꼬인다던지 하는 위험요소들이

발생하여 문제점으로 지적되어 왔었습니다. 여러 개의 파일에 하나의 클래스를 둠으로써 그 클래스를 사용하는

많은 개발자들이 독립적으로 작성함으로써 소스세이프 충돌 문제를 해결 할 수가 있습니다.

또한 VS Tool에서 생성하는 Code Generation과 개발자 코드의 분리를 parial class 로 선언하여 처리하였습니다.

닷넷 2.0의 특징으로 웹폼이나 윈폼에서 폼을 추가시 VS에서 생성하는 코드들을 다 분리시켜 놓음으로써

위험요소들을 방지하고 개발자 독립적인 코드를 작성할 수가 있습니다.(InitialComponent() 메소드의 컨트롤 속성

들을 함부로 바꾸고 순서를 바꿀경우 위험성이 내포되어 올바른 프로그래밍이 이루어 질 수 없습니다.

그 코드들은 개발자의 코드가 아니라 디자이너의 코드이므로 이를 분리한 것입니다. 이렇게 함으로써

코딩상의 위험요소를 많이 제거할 수 있습니다.)

그 외 VS 툴에서 생성하는 코드생성기로서 Typed DataSet , Desinger Code, Web Service Proxy Code 등도 같은 이유로

툴에서 생성하는 코드들입니다. 이것들도 역시 툴이 생성한 코드와 개발자 코드를 분리함으로써 위험요소들을 방지했습니다.

간단한 parial class를 사용한 예제를 만들어 보겠습니다.


A.cs 
public partial class ABC
{
	public string A()
	{
		return "A";
	}
}


B.cs
public partial class ABC
{
	public string B()
	{
		return "B";
	}
}


C.cs
public partial class ABC
{
	public string C()
	{
		return "C";
	}
}


Program.cs
public class Program
{
	public static void Main()
	{
		ABC abc = new ABC();
		Console.WriteLine(abc.A());
		Console.WriteLine(abc.B());
		Console.WriteLine(abc.C());
	}
}


참고로 VS에서 프로젝트를 생성하면 Program.cs라는 메인페이지를 생성하여 줍니다. 기존 윈폼에선 Form1 클래스 안에 Main() 함수가 있었지만 2.0에서 따로 분리하여 줍니다.

클래스에 키워드로 partial을 사용한 것을 익혀두기 바랍니다. 실행 결과는 예상대로 A B C 로 나오게 됩니다.


정리

partial class는 CLR 수준이 아닌 C# Compiler 수준에서 처리되므로..

많은 partial class를 만들어도 실제 컴파일시에 하나의 클래스로 수집하여 인식하므로 단일 코드로 취합합니다.

소스코드 수준에서만 허용됩니다. binary 시엔 허용되지 않습니다.

partial class를 사용함으로써 소스콘트롤의 관리가 편해집니다.

무분별한 partial class 의 사용은 더욱 복잡해질 소지가 있습니다.

여러 파일에 partial 클래스로 선언시 그 클래스의 멤버들을 보는 것은 복잡하겠지만

클래스뷰를 이용하면 partial을 모아서 한 클래스처럼 보실 수 있습니다.


//////////////////////////////////////////////////////////////////////////////////////////////


C# 2.0 부터 클래스를 여러개의 파일로 나눠서 정의 가능하다. 이 기능은 다음과 같은 경우 유용하다.

1. 한개의 클래스를 여러사람이 분할하여 구현해야 하는경우

2. 툴에 의해 자동 생성되는 코드가 있는경우(Form, DataSet 등)




다음과 같은 제약이 있다.

1. 컴파일 타임에 병합되므로, 컴파일 될때에는 모든 정의를 컴파일러가 볼수 있어야 한다.


2. class, struct, interface에만 사용가능하다.


3. 한개의 구현에 partial 키워드를 사용하였으면 나머지 모든 정의에도 partial 키워드를 사용해야 한다.


4. 접근 권한이 바뀔수 없다. 만약 public class로 정의 되었으면 public으로 정의해야 한다

(애매한것이 하나 있는데, 한쪽에 public으로 명시하고 다른쪽에 명시하지 않으면 명시하지 않은쪽도 public으로 정의한것 처럼 동작한다. 이것은 사용자가 보기에 internal 클래스인 것으로 간주하고 실수 할 수도 있으므로 명시적으로 접근권한을 일치시켜주는것이 좋을듯 하다)




다음과 같은 확장 기능이 있다.

1. 어느 한 구현에 abstract, seal 키워드를 사용하면, 나머지 구현에도 abstract, seal가 정의된 것처럼 동작한다. (정의하지 않았더라도)


2. 어느 한 구현이 Base 타입을 상속하면, 나머지 모든 구현도 해당되는 Base Type을 상속 받은것처럼 간주된다. 하지만 C#은 다중상속을 지원하지 않으므로, Base Type이 충돌하는경우 컴파일 에러를 낸다.


3. 구현마다 다른 인터페이스를 구현 가능하다. 어느 한 구현에서 인터페이스를 구현하고 있으면 다른 나머지 정의에서도 해당 인터페이스를 구현한 것처럼 동작한다.


4. 다른 파트에서 정의한 타입/멤버들을 사용할 수 있다.


5. 중첩된 타입들 (클래스 안의 클래스 등)도 partial 키워드를 사용하여 정의할 수 있다.


6. XML Document들은 컴파일되는 중에 병합된다.


7. Generic 파라미터들도 컴파일되는 중에 병합된다.

신고