c# 인터페이스 정의 및 구현

2024. 9. 18. 18:08c#

C#에서의 인터페이스 정의 및 구현

인터페이스(Interface)는 객체지향 프로그래밍(OOP)에서 중요한 개념으로, 클래스나 구조체에서 구현해야 하는 메서드와 속성을 미리 정의하는 역할을 합니다. 인터페이스는 설계의 유연성을 높이고, 여러 클래스가 공통으로 구현해야 할 기능을 정의하는 데 유용합니다. 이 포스팅에서는 C#에서 인터페이스를 정의하고 구현하는 방법을 설명하겠습니다.


1. 인터페이스란 무엇인가?

인터페이스의 정의

인터페이스는 클래스나 구조체가 구현해야 하는 메서드, 속성, 이벤트 등을 정의한 계약(contract)입니다. 인터페이스 자체에는 실제 구현이 포함되지 않으며, 이를 구현하는 클래스나 구조체가 해당 인터페이스에 정의된 멤버를 구체적으로 구현합니다.

  • 인터페이스는 상속과 달리 다중 구현이 가능합니다.
  • 인터페이스를 사용하면 여러 클래스가 공통된 기능을 일관되게 구현할 수 있습니다.

인터페이스의 특징

  • 구현되지 않은 메서드: 인터페이스는 메서드의 선언만 포함하며, 구체적인 구현은 하지 않습니다.
  • 다중 상속: 클래스는 여러 개의 인터페이스를 동시에 구현할 수 있습니다.
  • 다형성 지원: 인터페이스를 통해 런타임 다형성을 지원합니다.

2. 인터페이스 정의

인터페이스는 interface 키워드를 사용하여 정의하며, 내부에 메서드, 속성, 이벤트 등을 선언할 수 있습니다.
이러한 멤버들은 암묵적으로 public이며, 접근 제한자를 따로 지정하지 않습니다.

인터페이스 정의 예제

public interface IMovable
{
    void Move();
    int Speed { get; set; }
}

위 예제에서 IMovable 인터페이스는 Move라는 메서드와 Speed라는 속성을 선언하고 있습니다.
하지만 메서드와 속성에 대한 구체적인 구현은 제공되지 않으며, 이를 구현하는 클래스가 직접 구현해야 합니다.


3. 인터페이스 구현

클래스나 구조체에서 인터페이스를 구현할 때는 interface에서 정의된 모든 멤버를 구현해야 합니다. 구현하려는 클래스는 인터페이스 이름을 상속받는 것처럼 나열하여 구현을 명시합니다.

인터페이스 구현 예제

public class Car : IMovable
{
    public int Speed { get; set; }

    public void Move()
    {
        Console.WriteLine($"자동차가 {Speed}km/h의 속도로 움직입니다.");
    }
}

위 예제에서 Car 클래스는 IMovable 인터페이스를 구현하며, 인터페이스에서 정의된 Move 메서드와 Speed 속성을 구체적으로 구현합니다.


4. 인터페이스와 다중 구현

인터페이스는 다중 상속이 가능하다는 특징을 가지고 있습니다.
즉, 하나의 클래스가 여러 인터페이스를 동시에 구현할 수 있으며, 이를 통해 클래스는 다양한 기능을 구현할 수 있습니다.

다중 인터페이스 구현 예제

public interface IFlyable
{
    void Fly();
}

public class FlyingCar : IMovable, IFlyable
{
    public int Speed { get; set; }

    public void Move()
    {
        Console.WriteLine($"플라잉카가 {Speed}km/h의 속도로 달립니다.");
    }

    public void Fly()
    {
        Console.WriteLine("플라잉카가 하늘을 납니다.");
    }
}

위 예제에서 FlyingCar 클래스는 IMovable과 IFlyable 인터페이스를 동시에 구현하여, 자동차가 도로를 달리는 기능과 하늘을 나는 기능을 모두 제공할 수 있습니다.


5. 인터페이스와 다형성

인터페이스는 다형성(Polymorphism)을 지원하는 데 매우 유용합니다. 인터페이스를 통해 다양한 클래스가 동일한 메서드나 속성을 구현할 수 있으므로, 객체의 실제 타입에 상관없이 인터페이스 타입으로 처리할 수 있습니다.

다형성 예제

public class Bicycle : IMovable
{
    public int Speed { get; set; }

    public void Move()
    {
        Console.WriteLine($"자전거가 {Speed}km/h의 속도로 움직입니다.");
    }
}

public class MainClass
{
    public static void Start(IMovable vehicle)
    {
        vehicle.Move();
    }

    public static void Main()
    {
        Car car = new Car { Speed = 100 };
        Bicycle bicycle = new Bicycle { Speed = 20 };

        Start(car);      // 자동차가 100km/h의 속도로 움직입니다.
        Start(bicycle);  // 자전거가 20km/h의 속도로 움직입니다.
    }
}

위 예제에서 Start 메서드는 IMovable 인터페이스 타입의 매개변수를 받습니다. Car와 Bicycle 객체 모두 IMovable을 구현했기 때문에, 동일한 메서드로 처리할 수 있습니다. 이는 인터페이스가 다형성을 지원하는 좋은 예시입니다.


6. 인터페이스의 장점

  • 1. 유연한 설계 : 인터페이스를 사용하면 다양한 클래스가 동일한 인터페이스를 구현하므로, 시스템의 설계가 유연해지고 확장성이 높아집니다.
  • 2. 다중 상속 : 클래스 상속은 단일 상속만 가능하지만, 인터페이스는 여러 개를 동시에 구현할 수 있으므로 다중 상속의 효과를 얻을 수 있습니다.
  • 3. 다형성 지원 : 인터페이스를 통해 객체가 어떤 클래스에 속해 있는지와 상관없이 일관된 방법으로 처리할 수 있습니다. 이는 유지보수와 확장에 큰 도움이 됩니다.
  •  

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

인터페이스와 추상 클래스는 모두 추상적인 멤버를 정의하여 하위 클래스에서 이를 구현하도록 강제하지만, 몇 가지 차이점이 있습니다.

비교 항목 인터페이스 추상 클래스
다중 상속 가능 불가능
구현 멤버 포함 여부 불가능 (구현 없음) 가능 (일부 구현 포함 가능)
멤버의 접근 제한자 암묵적으로 public (다른 접근 제한자 불가) public, private, protected 등 사용 가능
목적 계약을 정의하고, 다양한 클래스에 적용 공통 기능을 제공하고, 하위 클래스에 기본 동작 제공

 


 

인터페이스는 C#에서 객체지향 프로그래밍의 핵심 요소로, 클래스들이 공통된 동작을 정의하고 다양한 객체에 일관된 방식으로 접근할 수 있게 해 줍니다. 인터페이스를 사용하면 유연하고 유지보수하기 쉬운 코드를 작성할 수 있으며, 시스템의 확장성을 크게 높일 수 있습니다. 이를 통해 코드 설계를 더 구조적으로 하고, 재사용성을 극대화할 수 있습니다.