인터페이스

Lee Hyeuk Jin·2024년 1월 4일

개념공부 및 실습

목록 보기
8/12

인터페이스

인터페이스는 클래스와 동일하게 메서드, 속성, 이벤트, 프로퍼티 등을 갖지만, 인터페이스는 이를 직접 구현하지 않고 정의만을 갖는다.

인터페이스를 사용하는 이유

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(); }
    }
}
profile
유니티 C# 학습자

0개의 댓글