TIL13. 5/1 인터페이스

김진영·2024년 5월 1일

스파르타코딩

목록 보기
12/39
post-thumbnail

c#에서 클래스는 다중 상속을 사용하지 않는다. 이유는

  1. 다이아몬드 문제(Diamond Problem):
    다중 상속을 허용하면 한 클래스가 두 개 이상의 부모 클래스로부터 동일한 멤버를 상속받을 수 있습니다. 이 경우, 같은 이름의 멤버를 가지고 있을 때 어떤 부모 클래스의 멤버를 사용해야 하는지 모호해집니다. 이런 모호성을 해결하기 위한 규칙이 필요하게 되는데, 이로 인해 코드가 복잡해지고 가독성이 저하될 수 있습니다.
  2. 설계의 복잡성 증가:
    다중 상속을 허용하면 클래스 간의 관계가 복잡해집니다. 클래스가 다중 상속을 받을 경우, 어떤 클래스로부터 어떤 멤버를 상속받을지 결정해야 합니다. 이로 인해 클래스 간의 상속 관계를 파악하기 어려워지고 코드의 유지 보수성이 저하될 수 있습니다.
  3. 이름 충돌과 충돌 해결의 어려움:
    다중 상속을 허용하면 여러 부모 클래스로부터 상속받은 멤버들이 이름이 충돌할 수 있습니다. 이러한 충돌을 해결하기 위해 충돌하는 멤버를 재정의해야 하거나 명시적으로 부모 클래스를 지정해야 할 수 있습니다. 이는 코드의 복잡성을 증가시키고 오류 발생 가능성을 높입니다.
  4. 설계의 일관성과 단순성 유지:
    C#은 단일 상속을 통해 설계의 일관성과 단순성을 유지하고자 합니다. 단일 상속을 통해 클래스 간의 관계를 명확하게 만들고 코드의 가독성과 이해도를 높일 수 있습니다. 또한 인터페이스를 사용하여 다중 상속이 필요한 경우에도 유사한 기능을 구현할 수 있습니다.

인터페이스

위의 이유로 클래스는 다중 상속을 사용하지 않는다. 그래서 인터페이스를 사용하는데 그거말고도 사용하는 이유를 더 보자면

  1. 코드의 재사용성:
    인터페이스를 사용하면 다른 클래스에서 해당 인터페이스를 구현하여 동일한 기능을 공유할 수 있습니다. 인터페이스를 통해 다양한 클래스가 동일한 동작을 수행할 수 있으므로 코드의 재사용성이 향상됩니다.
  2. 다중 상속 제공:
    C#에서는 클래스는 단일 상속만을 지원하지만, 인터페이스는 다중 상속을 지원합니다. 클래스가 여러 인터페이스를 구현함으로써 여러 개의 기능을 조합할 수 있습니다. 다중 상속을 통해 클래스는 더 다양한 동작을 수행할 수 있습니다.
  3. 유연한 설계:
    인터페이스를 사용하면 클래스와 인터페이스 간에 느슨한 결합을 형성할 수 있습니다. 클래스는 인터페이스를 구현하기만 하면 되므로, 클래스의 내부 구현에 대한 변경 없이 인터페이스의 동작을 변경하거나 새로운 인터페이스를 추가할 수 있습니다. 이는 유연하고 확장 가능한 소프트웨어 설계를 가능하게 합니다.

이 처럼 인터페이스는 다중 상속을 사용하지않는 클래스를 더 잘 활용하기 위해서 쓴다고 볼 수 있다.

  • 1) 인터페이스 특징
    • 인터페이스란 클래스가 구현해야 하는 멤버들을 정의하는 것입니다.
    • 인터페이스는 클래스의 일종이 아니며, 클래스에 대한 제약 조건을 명시하는 것입니다.
    • 클래스가 인터페이스를 구현할 경우, 모든 인터페이스 멤버를 구현해야 합니다.
    • 인터페이스는 다중 상속을 지원합니다.

다음은 인터페이스 사용 예시이다.

// 아이템을 사용할 수 있는 인터페이스
public interface IUsable
{
    void Use();
}

// 아이템 클래스
public class Item : IUsable
{
    public string Name { get; set; }

    public void Use()
    {
        Console.WriteLine("아이템 {0}을 사용했습니다.", Name);
    }
}

// 플레이어 클래스
public class Player
{
    public void UseItem(IUsable item)
    {
        item.Use();
    }
}

// 게임 실행
static void Main()
{
    Player player = new Player();
    Item item = new Item { Name = "Health Potion" };
    player.UseItem(item);
}

인터페이스는 선언할때 앞에 I를 붙힌다. 이코드에서는 Usable에 앞에 I를 붙힌걸 볼 수 있을 것이다. 이렇게 인터페이스 선언을 하고 아이템 클래스에 IUsable 인터페이스를 상속시켰다. 그러고나서 인터페이스에 선언해두었더너 void use()를 활용해서 아이템을 사용했다는 텍스트를 작성하고 플레이어 클래스에 이것을 매개변수로 받아서 item.use()메서드를 넣어주었다. 그래서 게임 실행했을 때 아이템의 이름을 Health Potion으로 정의하고 출력해주면 "아이템 Health Potion"을 사용했습니다." 라고 출력될 것이다.

0개의 댓글