인터페이스
인터페이스는 클래스와 동일하게 메서드, 속성, 이벤트, 프로퍼티 등을 갖지만, 인터페이스는 이를 직접 구현하지 않고 정의만을 갖는다.
인터페이스를 사용하는 이유
1. 다중 상속이 가능
- C#에서 단일 클래스 상속만 가능하기 때문에 여러 클래스로 부터 상속이 필요한 경우 인터페이스를 사용할 수 있다.
2. 코드 재사용
- 인터페이스를 사용하면 클래스 간에 공통된 동작을 정의할 수 있어 코드를 재상요할 수 있다.
3. 계약 정의
- 인터페이스는 클래스가 특정한 메서드나 프로퍼티를 구현하도록 강제할 수 있다.
C#에서 제공하는 자주 사용되는 인터페이스
1. IEnumerable : 지정된 형식의 컬랙션에서 반복을 지원하는 메서드를 정의함
2. IEnumerator : 제너릭 컬랙션을 단순하게 반복할 수 있는 메서드를 정의함
3. IComparable : 개체를 다른 개체와 비교하는 메서드를 정의
4. IComparer : 두 개체를 비교하는데 사용되는 메서드를 정의
5. IDisposable : 관리되지 않는 리소스를 해제하는 메서드를 정의
예제 코드
IEnumerable, IEnumerator 예제
class program
{
static void Main()
{
MyCollection myCollection = new MyCollection();
foreach(var item in myCollection)
{
Console.WriteLine(item);
}
}
}
public class MyCollection : IEnumerable
{
private int[] data = { 1, 2, 3, 4, 5 };
public IEnumerator GetEnumerator()
{
return data.GetEnumerator();
}
}
IComparable, IComparer 예제
public class Person : IComparable<Person>
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(Person other)
{
return this.Age.CompareTo(other.Age);
}
}
class Program
{
static void Main()
{
List<Person> people = new List<Person>
{
new Person {Name = "Alice", Age = 30 },
new Person {Name = "Bob", Age = 25 },
new Person {Name = "Charlie", Age = 35 }
};
}
}
IDisposable 예제
public class MyDisposableResource : IDisposable
{
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if(!disposed)
{
if(disposing)
{
Console.WriteLine("리소스를 여기서 해제");
}
Console.WriteLine("관리되지 않는 리소스를 여기서 해제");
disposed = true;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MyDisposableResource() { Dispose(false); }
public void DoSomething()
{
if(disposed)
throw new ObjectDisposedException(nameof(MyDisposableResource));
Console.WriteLine("클래스 동작 수행");
}
}
class Program
{
static void Main()
{
using(MyDisposableResource resource = new MyDisposableResource())
{
resource.DoSomething();
}
MyDisposableResource manualResource = new MyDisposableResource();
try
{
manualResource.DoSomething();
}
finally
{ manualResource.Dispose(); }
}
}