나만의 작은 도서관

[C#] 문법 정리 #6. 인터페이스 본문

Unity/문법 및 메소드(System)

[C#] 문법 정리 #6. 인터페이스

pledge24 2024. 11. 21. 23:23

인터페이스(Interface)

인터페이스는 클래스가 반드시 구현해야하는 멤버들을 정의한 구조를 의미한다. 인터페이스는 클래스가 구현해야 할 메서드, 속성, 이벤트 등을 정의한다. 

 

인터페이스의 특징

  • 구현이 없음: 인터페이스는 정의를 할 뿐, 실제 구현은 인터페이스를 상속한 클래스에서 작성된다.
  • 구현의 강제성 부여: 인터페이스를 상속할 경우, 클래스는 반드시 인터페이스에 정의된 모든 멤버를 구현해야한다.
  • 다중 상속 지원: 클래스에 대한 다중 상속이 불가능한 것과 달리 인터페이스는 다중 상속이 가능하다.
  • 접근 제한자 없음: 인터페이스 멤버는 항상 암시적으로 public이며, 접근 제한자를 사용할 수 없다.
  • 다형성: 인터페이스를 사용하면 다양한 클래스가 동일한 방식으로 처리될 수 있다.

인터페이스를 왜 쓰는가

인터페이스를 사용하면 클래스들을 동일한 틀(Frame)로 묶어 공통적인 동작을 정의한다. 예를 들어, 이동과 관련된 인터페이스를 IMovable라 할 때 이동하는 동작이 필요한 클래스(예를 들어, 개, 고양이, 사람, 비행기 등등...)에 IMovable를 상속하여 메서드를 구현하면, 클래스들은 상속받은 인터페이스만 보고도 이동하는 동작(메서드)이 존재해야 한다는 것을 쉽게 알 수 있다.

 

반대로, 이미 구현된 클래스라면 IMovable를 상속받아 공통된 기능을 가지고 있음을 명시할 수 있다.

 

이러한 인터페이스를 활용해 기능별로 잘 쪼개서 클래스에 상속한다면, 코드의 결합도를 낮추고 유연성을 높아지는 효과를 기대할 수 있다.

 

인터페이스가 다중 상속이 허용되는 이유

C#에서 클래스에 대한 다중 상속을 막은 이유는 1) 클래스 간의 관계가 복잡해지고 2) 멤버 이름이 충돌하는 문제를 해결하기 어렵기 때문이다. 하지만 인터페이스는 이러한 문제가 발생하지 않거나 크게 문제가 되지 않는다. 왜냐하면 클래스와 달리 인터페이스는 단지 틀을 제공할 뿐, 실제 로직을 상속하지 않기 때문에 상속을 여러 개 받아 이름이 충돌해도 로직 간의 충돌은 발생하지 않는다.

 

즉, 틀만 제공하는 인터페이스는 다중 상속을 하여도 로직 선택의 모호성이 발생하지 않기 때문에 다중 상속을 허용한다.

 

선언부 예제

interface IMyInterface
{
    void Method1();
    int Method2(string str);
}

interface IMyInterface2
{
    float Method3();
}

 

상속 및 구현 예제

class MyClass : IMyInterface, IMyInterface2	// 다중 상속
{
    public void Method1()
    {
        // 구현
    }

    public int Method2(string str)
    {
        // 구현
        return 0;
    }
    
    public float Method3()
    {
        // 구현
        return 0f;   
    }
}

 

다형성 예제

인터페이스를 통해 다양한 객체를 동일한 방식으로 처리할 수 있다. 즉, 인터페이스를 하나의 타입으로 취급하여 인터페이스 타입으로 객체의 메소드를 실행시킬 수 있다.

class Player
{
    public void Process(IMyInterface example)
    {
        example.Method1();
    }

    public void Process2(IMyInterface2 example)
    {
        example.Method3();
    }
}

 

인터페이스와 추상 클래스의 차이점

  • 인터페이스는 구현을 갖고 있지 않지만, 추상 클래스는 abstract이 붙은 메소드를 제외한 다른 멤버들은 구현을 가질 수 있다. 따라서 인터페이스와 달리 추상 클래스는 로직 상속이 가능하다.
  • 인터페이스는 다중 상속이 가능하지만, 추상 클래스는 불가능하다.

결론: 동일한 틀만 공유하고 싶다면 인터페이스를, 틀 뿐만이 아닌 로직까지 공유하고 싶다면 추상 클래스를 사용하면 된다.