인터페이스를 정의하는 이유와 그 실례 [개정판]

여름방학때 반짝 나타났다가 잠적했었습니다. 그 사이에 카페 디자인도 많이 바뀌었군요. ㅎㅎ


그간에는 인터페이스라는 것의 활용법에 대해서 아주 깊게 심취하고 있었습니다. 제가 좋아하는 Reflection을 다루는 데에 있어서 없으면 안되는 중요한 개체이기 때문이기도 합니다.


인터페이스는 얼른 생각하면 COM이나 DCOM에서만 쓰일것 같다는 인상을 주기 쉽습니다. 실제로도 COM과 DCOM의 Interop을 위해서 인터페이스를 정의할 수도 있겠습니다. 하지만 인터페이스는 Reflection을 활용하는 데에 더 많이 쓰일 수 있다고 생각합니다.


1. 인터페이스는 어떻게 동작하는가?


인터페이스는 자신을 구현하는 하위 클래스에 대한 일종의 필터 역할을 합니다. 즉, 모든 멤버들을 다 보여주는 것이 아니라 사용자가 원하는 기능을 정의하는 인터페이스의 멤버만을 추려낸다는 뜻입니다. 그래서 다음과 같은 코드는 유효합니다.


IMyInterface sample = new MyInterfaceSuccessor();


MyInterfaceSuccessor 클래스는 IMyInterface가 아닌 System.Object의 추상 메서드들도 구현할 수 있습니다. 그러나 여기에서는 MyInterfaceSuccessor 클래스의 모든 멤버들을 사용하는 것이 아니라 IMyInterface가 정의하는 메서드들만을 호출한다는 뜻이 됩니다.


sample.About();


2. 인터페이스를 정의할 때 주의할 점들


인터페이스를 정의할 때 조심해야 할 것들이 몇 가지 있습니다.


Case A. sbyte, ushort, uint, ulong 같은 비표준 타입을 요구하거나 반환하는 메서드는 사용하지 않도록 한다: 위와 같은 타입을 생각하지 못하는 언어들을 배려해야 합니다.


Case B. 생성자와 소멸자를 정의할 수 없다: 인터페이스를 선언하면서는 기본 생성자와 소멸자를 정의할 수 없습니다. 하지만 프록시 메서드를 배치하여 임의로 생성자와 소멸자를 재정의하는 방법이 있습니다.


Case C. 정해진 인터페이스는 가급적 바꾸지 않도록 하라: 인터페이스는 대충 설계하고 마는 것이 아닙니다. 어떤 면에 있어서는 오히려 클래스를 정의하는 일보다 더 신중해야 합니다. 이미 여러차례 구현된 인터페이스에 조금이라도 변화가 생기면 그 인터페이스를 구현하는 클래스들과 상속 관계에 있는 하위 인터페이스들에게도 한꺼번에 영향을 줍니다.


Case D. 정적 프로퍼티와 메서드는 인터페이스에서 정의할 수 없다: 인터페이스에 생성자를 정의할 수 없으므로 당연히 정적 생성자는 정의할 수 없습니다. 그에 따라서, 정적 프로퍼티와 메서드도 당연히 사용할 수 없습니다.


Case E. COM, DCOM, CORBA, JAVA 등의 플랫폼과의 연동을 고려하고 있다면 인터페이스에 제네릭을 포함하면 안된다: 제네릭은 .NET Framework 스펙 2.0에만 해당되는 사항이며 C++의 템플릿과는 구분됩니다. 또한 아직까지 형식 다형성에 관하여 정의를 내린 플랫폼은 없기 때문에 당연히 제네릭은 호환되지 않습니다.


3. 인터페이스와 포함 기법의 결합


인터페이스를 하나 이상 구현하는 객체가 있을 경우, 보통 이를 형식 변환을 통하여 원하는 인터페이스를 가져오곤 합니다. 하지만 이런 방법보다 더 직관적이고 접근하기 쉽게 만드는 방법이 하나 있는데, 인터페이스 구현을 암시적 구현이 아닌 명시적 구현으로 하여 this 참조를 다른 인터페이스 형식으로 변환하여 참조를 반환하는 프로퍼티를 만드는 것입니다. 예를 들면 다음과 같은 활용법을 말합니다.


// 이 클래스가 ICloneable과 IDisposable을 동시에 구현한다고 가정하면…


public ICloneable CloneableServices { get { return (ICloneable)this; } }
public IDisposable DisposableServices { get { return (IDisposable)this; } }


얼마전에 제 도메인으로 제 블로그를 개통하였습니다. 이곳에도 강좌를 자주 올리고자 하니 많은 방문 부탁드립니다.


http://7d5.32b.myftpupload.com

댓글 남기기