Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 인터페이스 작동 방식 완벽 가이드: 개념부터 실전 예제까지

C# 인터페이스란 무엇일까요?

인터페이스(Interface)는 클래스(class)나 구조체(struct)가 반드시 구현해야 하는 계약(contract)을 정의하는 특별한 형식입니다. 인터페이스에는 메서드, 속성(property), 이벤트, 인덱서(indexer)를 포함할 수 있습니다.

인터페이스는 겉모습만 보면 클래스와 비슷하지만 결정적인 차이가 있습니다. 인터페이스 자체는 어떠한 데이터도 저장하지 않으며, 오직 "무엇을 할 수 있는지"만 규정합니다. 실제 동작은 해당 인터페이스를 구현하는 클래스가 담당합니다.

하나의 클래스는 하나 이상의 인터페이스를 동시에 구현할 수 있습니다. 인터페이스 멤버를 구현하려면, 클래스 안에 인터페이스 멤버와 동일한 이름과 시그니처(매개변수 목록)를 가진 public 멤버를 선언해야 합니다.

아래 예제는 Drive() 메서드라는 계약을 정의하는 IDriver 인터페이스를 Car 클래스가 구현하는 모습입니다.

public interface IDriver{
    void Drive();
}
public class Car : IDriver{
    public string Name { get; set; }

    public int Speed { get; set; }
    public void Drive(){
        Console.WriteLine($"{Name}: {Speed}");
    }
}

인터페이스 멤버의 핵심 규칙

  • 인터페이스의 모든 멤버는 암묵적으로 추상(abstract)이며, 구현 본문을 포함하지 않습니다.
  • 모든 인터페이스 멤버는 기본적으로 public입니다.
  • 인터페이스 멤버에는 접근 제한자(access modifier)를 직접 지정할 수 없습니다.
  • 인터페이스를 구현하는 클래스는 반드시 public 멤버로 해당 계약을 구현해야 합니다.

인터페이스 확장하기

인터페이스는 다른 인터페이스를 상속받아 확장할 수도 있습니다. 아래처럼 ISinger는 IPerformer의 Perform() 계약을 물려받으면서 자신만의 Sing() 계약을 추가합니다.

public interface IPerformer { void Perform(); }
public interface ISinger : IPerformer{
    void Sing();
}

다중 상속의 대안으로서의 인터페이스

C#은 C++과 달리 클래스의 다중 상속(multiple inheritance)을 허용하지 않습니다. 대신 인터페이스를 활용하면 여러 출처의 동작을 하나의 클래스에 조합할 수 있어, 사실상 다중 상속의 효과를 얻을 수 있습니다.

인터페이스의 단점

인터페이스는 API를 외부에 노출할 때 클래스보다 유연성이 떨어진다는 단점이 있습니다. 인터페이스의 계약을 변경하면 그것을 구현하는 모든 클래스가 컴파일 오류로 깨지기 때문에, 관련된 클래스들을 일괄 수정해야 합니다. 따라서 인터페이스를 설계할 때는 향후 변경 가능성까지 신중하게 고려해야 합니다.

전체 실행 예제

using System;
class Program{
    static void Main(){
        var carOne = new Car { Name = "Honda", Speed = 100 };
        var carTwo = new Car { Name = "Toyota", Speed = 70 };
        carOne.Drive();
        carTwo.Drive();
    }
}
public interface IDriver{
    void Drive();
}
public class Car : IDriver{
    public string Name { get; set; }
    public int Speed { get; set; }
    public void Drive(){
        Console.WriteLine($"{Name}: {Speed}");
    }
}

출력 결과

Honda: 100
Toyota: 70