C# 인터페이스
클래스와 비슷하게 인터페이스는 메서드, 속성, 이벤트, 인덱서 등을 갖지만, 인터페이스는 이를 직접 구현하지 않고 단지 정의(prototype definition)만을 갖는다. 즉, 인터페이스는 추상 멤버(abstract member)로만 구성된 추상 Base 클래스(abstract base class)와 개념적으로 유사하다. 클래스가 인터페이스를 가지는 경우 해당 인터페이스의 모든 멤버에 대한 구현(implementation)을 제공해야 한다.
한 클래스는 하나의 Base 클래스만을 가질 수 있지만, 인터페이스는 여러 개를 가질 수 있다. 아래의 예를 보면, MyConnection 이라는 클래스는 Component 라는 하나의 Base 클래스와 IDbConnection, IDisposable이라는 2개의 인터페이스를 가지고 있음을 알 수 있다.
한 클래스는 하나의 Base 클래스만을 가질 수 있지만, 인터페이스는 여러 개를 가질 수 있다. 아래의 예를 보면, MyConnection 이라는 클래스는 Component 라는 하나의 Base 클래스와 IDbConnection, IDisposable이라는 2개의 인터페이스를 가지고 있음을 알 수 있다.
예제
public class MyConnection : Component, IDbConnection, IDisposable
{
// IDbConnection을 구현
// IDisposable을 구현
}
{
// IDbConnection을 구현
// IDisposable을 구현
}
C# 인터페이스의 정의
인터페이스는 C# 키워드 interface를 사용하여 정의한다. 인터페이스 정의 시에는 (메서드와 같은) 내부 멤버들에 대해 public과 같은 접근 제한자를 사용하지 않는다.
예를 들어, 아래 예제에서 CompareTo() 메서드 앞에 public 을 쓸 수 없다.
예를 들어, 아래 예제에서 CompareTo() 메서드 앞에 public 을 쓸 수 없다.
예제
public interface IComparable
{
// 멤버 앞에 접근제한자 사용 안함
int CompareTo(object obj);
}
{
// 멤버 앞에 접근제한자 사용 안함
int CompareTo(object obj);
}
C# 인터페이스의 구현
C# 클래스가 인터페이스를 갖는 경우 인터페이스의 모든 멤버에 대한 구현을 제공해야 한다. C# 에서는 인터페이스로부터 직접 new를 사용하여 객체를 생성할 수 없다. 아래의 클래스는 IComparable이라는 인터페이스를 갖는 경우로서 IComparable.CompareTo() 메서드를 구현한 예이다.
예제
public class MyClass : IComparable
{
private int key;
private int value;
// IComparable 의 CompareTo 메서드 구현
public int CompareTo(object obj)
{
MyClass target = (MyClass)obj;
return this.key.CompareTo(target.key);
}
}
{
private int key;
private int value;
// IComparable 의 CompareTo 메서드 구현
public int CompareTo(object obj)
{
MyClass target = (MyClass)obj;
return this.key.CompareTo(target.key);
}
}
C# 인터페이스의 사용
C# 실무에서 클래스와 인터페이스를 잘 정의하고 사용하는 것은 매우 중요하다. 비지니스를 객체지향 프로그래밍으로 디자인하고 구현하는데 가장 중요한 핵심이기 때문이다. 자연스럽게 .NET Framework도 상당히 많은 인터페이스를 구현했으며, 거의 모든 영역에서 흔히 사용되고 있다.
다음 코드는 IDbConnection이라는 인터페이스를 사용하는 예제이다. 이 코드에서 GetDbConnection() 메서드는 시스템의 구성파일로부터 DB타입과 Connection String을 받아와 해당 DB타입에 맞는 데이타베이스 Connection을 리턴한다. GetDbConnection()가 DB connection을 리턴할 때 IDbConnection을 리턴하고 있는데, 이 때문에 이 메서드를 사용하는 클라이언트에서는 어떤 DB를 사용하든지 상관없이 모든 DB 클래스에 공통적으로 구현된 IDbConnection 멤버들을(메서드, 속성등) 사용할 수 있게 된다.
다음 코드는 IDbConnection이라는 인터페이스를 사용하는 예제이다. 이 코드에서 GetDbConnection() 메서드는 시스템의 구성파일로부터 DB타입과 Connection String을 받아와 해당 DB타입에 맞는 데이타베이스 Connection을 리턴한다. GetDbConnection()가 DB connection을 리턴할 때 IDbConnection을 리턴하고 있는데, 이 때문에 이 메서드를 사용하는 클라이언트에서는 어떤 DB를 사용하든지 상관없이 모든 DB 클래스에 공통적으로 구현된 IDbConnection 멤버들을(메서드, 속성등) 사용할 수 있게 된다.
예제
public void Run()
{
// 인터페이스 사용하기 때문에
// 특정 DB Connection을 신경 쓸 필요가 없다
IDbConnection dbCon = GetDbConnection();
dbCon.Open();
if (dbCon.State == ConnectionState.Open)
{
dbCon.Close();
}
}
// IDbConnection 인터페이스를 리턴
public IDbConnection GetDbConnection()
{
IDbConnection dbConn = null;
string cn = ConfigurationManager.AppSettings["Connection"];
switch (ConfigurationManager.AppSettings["DbType"])
{
case "SQLServer":
dbConn = new SqlConnection(cn);
break;
case "Oracle":
dbConn = new OracleConnection(cn);
break;
case "OleDB":
dbConn = new OleDbConnection(cn);
break;
}
return dbConn;
}
{
// 인터페이스 사용하기 때문에
// 특정 DB Connection을 신경 쓸 필요가 없다
IDbConnection dbCon = GetDbConnection();
dbCon.Open();
if (dbCon.State == ConnectionState.Open)
{
dbCon.Close();
}
}
// IDbConnection 인터페이스를 리턴
public IDbConnection GetDbConnection()
{
IDbConnection dbConn = null;
string cn = ConfigurationManager.AppSettings["Connection"];
switch (ConfigurationManager.AppSettings["DbType"])
{
case "SQLServer":
dbConn = new SqlConnection(cn);
break;
case "Oracle":
dbConn = new OracleConnection(cn);
break;
case "OleDB":
dbConn = new OleDbConnection(cn);
break;
}
return dbConn;
}
C# 동영상 강의 : C# 인터페이스 기초 [레벨] 중급 [C# 중급] C# 인터페이스(interface)의 기초 개념을 설명하고, 예제로서 인터페이스를 정의하고, 클래스에 인터페이스를 구현하는 방법, 그리고 구현된 인터페이스를 사용하는 방법에 대해 자세히 설명합니다. |
C# 동영상 강의 : 인터페이스를 활용한 사례 [레벨] 중급 [C# 중급] 가상의 그림판(Paint) 프로그램에 3rd Party 파트너들이 Addin 을 추가해서 사용할 수 있도록 하기 위해 인터페이스를 활용하는 사례에 대해 자세히 소개합니다. |