시스템 정의 인터페이스를 사용하는 방법 알아보기

완료됨

시스템 정의 인터페이스를 C# 애플리케이션에 통합하는 것은 많은 실제 코딩 시나리오에서 유용합니다. C#의 시스템 정의 인터페이스를 사용하면 미리 정의된 기능을 적용하여 애플리케이션을 일관되고 안정적으로 만들 수 있습니다.

메서드에 사용되는 공통 인터페이스

.NET Framework 내의 C# 메서드에는 몇 가지 일반적인 인터페이스가 자주 사용됩니다. 이러한 인터페이스는 다양한 클래스에서 구현되는 표준 기능을 제공합니다.

  • IComparable: 개체를 비교하는 데 사용됩니다.
  • IEnumerable: 컬렉션을 반복하는 데 사용됩니다.
  • IDisposable: 관리되지 않는 리소스를 해제하는 데 사용됩니다.
  • IEquatable: 같음 비교를 정의하는 데 사용됩니다.

시스템 정의 인터페이스 구현

시스템 정의 인터페이스 멤버를 구현하려면 구현 클래스의 해당 멤버가 공용이 아니 static고 인터페이스 멤버와 이름과 서명이 같아야 합니다. 인터페이스를 구현하는 클래스 또는 구조체는 인터페이스에서 제공하는 기본 구현 없이 선언된 모든 멤버에 대한 구현을 제공해야 합니다.

.NET의 시스템 정의 인터페이스는 대개 자리 표시자를 T 사용하여 모든 형식을 나타냅니다. 예를 들어 IEquatable 인터페이스는 다음과 같이 .NET Framework에 정의됩니다.

public interface IEquatable
{
    bool Equals(T other);
}

클래스에서 이 인터페이스를 구현할 때 클래스의 형식으로 바꿉니다 T .

예를 들어 다음 Car 클래스는 인터페이스를 IEquatable 구현합니다.

public class Car : IEquatable
{
    public string Make { get; set; }
    public string Model { get; set; }

    public bool Equals(Car other)
    {
        if (other == null) return false;
        return this.Make == other.Make && this.Model == other.Model;
    }
}

이 예제 Car 에서는 대체하여 TIEquatable만듭니 IEquatable다. 클래스는 Car 현재 Car 개체의 속성과 Model 개체의 Equals 속성이 같은지 Make 확인하는 메서드의 고유한 구현을 otherCar 제공합니다.

클래스의 속성 및 인덱서는 인터페이스에 정의된 속성 또는 인덱서에 대한 추가 접근자를 정의할 수 있습니다. 예를 들어 인터페이스는 접근자가 있는 속성을 선언할 get 수 있습니다. 인터페이스를 구현하는 클래스는 a와 set 접근자를 모두 사용하여 동일한 속성을 선언할 get 수 있습니다. 예제는 다음과 같습니다.

public interface IExampleInterface
{
    string Name { get; }
}

public class ExampleClass : IExampleInterface
{
    public string Name { get; set; }
}

이 예제에서는 IExampleInterface 접근자를 사용하여 속성을 Nameget 선언합니다. ExampleClass는 인터페이스를 구현하고 a와 set 접근자를 모두 get 사용하여 동일한 속성을 선언합니다.

일반적인 시스템 정의 인터페이스 사용

와 같은 IEnumerableIDisposable일반적인 시스템 정의 인터페이스는 IComparable .NET 애플리케이션에서 자주 사용됩니다. 이러한 인터페이스는 다양한 형식에서 일관된 동작을 보장하기 위해 구현할 수 있는 표준 메서드를 제공합니다.

IEnumerable

인터페이스는 IEnumerable 열거할 수 있는 컬렉션을 정의하는 데 사용됩니다. 컬렉션을 반복하는 열거자를 반환하는 단일 메서드 GetEnumerator를 포함합니다.

public class MyCollection : IEnumerable
{
    private int[] _items = { 1, 2, 3, 4, 5 };

    public IEnumerator GetEnumerator()
    {
        for (int i = 0; i < _items.Length; i++)
        {
            yield return _items[i];
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

IDisposable

인터페이스 IDisposable 는 관리되지 않는 리소스를 해제하는 데 사용됩니다. 관리되지 않는 리소스는 파일 핸들, 네트워크 연결 등 .NET 런타임으로 처리되지 않는 리소스입니다. 메모리 누수 및 기타 문제를 방지하기 위해 사용 후 이러한 리소스를 해제하는 것이 중요합니다. 리소스를 해제하기 위해 호출되는 단일 메서드 Dispose를 포함합니다.

public class ResourceHolder : IDisposable
{
    private bool _disposed = false;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this); // Prevents the garbage collector from calling the finalizer if Dispose has already been called.
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                // Free managed resources
            }
            // Free unmanaged resources
            _disposed = true;
        }
    }

    ~ResourceHolder()
    {
        Dispose(false);
    }
}

IComparable

IComparable 인터페이스는 클래스의 인스턴스를 비교하는 메서드를 정의하는 데 사용됩니다. 현재 인스턴스와 동일한 형식의 다른 개체를 비교하는 단일 메서드 CompareTo가 포함되어 있습니다.

public class Person : IComparable
{
    public string Name { get; set; }
    public int Age { get; set; }

    public int CompareTo(Person other)
    {
        if (other == null) return 1; // If 'other' is null, this instance is considered greater
        return this.Age.CompareTo(other.Age); // Returns negative value if  precedes 'other', 0 if same position, or postive value if follows 'other'.
    }
}

이 예제에서 null인 경우 other 현재 인스턴스가 null 참조보다 큰 것으로 간주됨을 나타내는 1을 반환합니다.

C#의 시스템 정의 인터페이스는 효율적이고 안정적이며 일관된 애플리케이션을 만드는 데 중요한 역할을 합니다. 다양한 형식에서 구현할 수 있는 표준 메서드를 제공하여 동작의 균일성과 예측 가능성을 보장합니다. 이러한 인터페이스를 이해하고 효과적으로 구현하면 미리 정의된 기능을 사용하고 반복 코드의 양을 줄여 애플리케이션을 보다 유지 관리하고 강력하게 만들 수 있습니다.