c# 인터페이스(interface), 열거형(enum)

2024. 9. 22. 14:56카테고리 없음

개요

인터페이스와 열거형에 대해 알아보겠습니다.

내용 - 인터페이스

  • 인터페이스란 클래스가 구현해야 하는 멤버들을 정의하는 것입니다.
  • 인터페이스는 클래스의 일종이 아니며, 클래스에 대한 제약 조건을 명시하는 것입니다.
  • 클래스가 인터페이스를 구현할 경우, 모든 인터페이스 멤버를 구현해야 합니다.
  • 인터페이스는 다중 상속을 지원합니다.
  • 특징적인 부분들을 사용할때 인터페이스를 자주 사용한다
    ex) '사람이 걷는다' 라는 큰 특징들 보다는 '하늘을 날 수 있는 기능', '한국어를 말할 수 있는 기능' 같이 특징적인 기능에서 인터페이스가 잘 사용된다. 

인터페이스 사용 이유

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

인터페이스 사용 예시

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을 참조해서 사용한다.
    {
        item.Use();
    }
}


static void Main(string[] args)
{
    Player player = new Player();
    Item item = new Item() { Name = "Health Positon"};
    player.UseItem(item);
}

 

다중상속 구현 예시

// 인터페이스 1
public interface IItemPickable
{
    void PickUp();
}

// 인터페이스 2
public interface IDroppable
{
    void Drop();
}

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

    public void PickUp()
    {
        Console.WriteLine("아이템 {0}을 주웠습니다.", Name);
    }

    public void Drop()
    {
        Console.WriteLine("아이템 {0}을 버렸습니다.", Name);
    }
}

// 플레이어 클래스
public class Player
{
    public void InteractWithItem(IItemPickable item)
    {
        item.PickUp();
    }

    public void DropItem(IDroppable item)
    {
        item.Drop();
    }
}

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

    // 아이템 주울 수 있음
    player.InteractWithItem(item);

    // 아이템 버릴 수 있음
    player.DropItem(item);
}

 

내용 - 인터페이스 와 추상클래스 차이점

인터페이스의 특징과 장단점:

  • 인터페이스는 추상적인 동작만 정의하고, 구현을 갖지 않습니다.
  • 다중 상속이 가능하며, 여러 클래스가 동일한 인터페이스를 구현할 수 있습니다.
  • 클래스들 간의 결합도를 낮추고, 유연한 상호작용을 가능하게 합니다.
  • 코드의 재사용성과 확장성을 향상시킵니다.
  • 단점으로는 인터페이스를 구현하는 클래스가 모든 동작을 구현해야 한다는 의무를 가지기 때문에 작업량이 증가할 수 있습니다.

추상 클래스의 특징과 장단점:

  • 추상 클래스는 일부 동작의 구현을 가지며, 추상 메서드를 포함할 수 있습니다.
  • 단일 상속만 가능하며, 다른 클래스와 함께 상속 계층 구조를 형성할 수 있습니다.
  • 공통된 동작을 추상화하여 코드의 중복을 방지하고, 확장성을 제공합니다.
  • 구현된 동작을 가지고 있기 때문에, 하위 클래스에서 재정의하지 않아도 될 경우 유용합니다.
  • 단점으로는 다중 상속이 불가능하고, 상속을 통해 밀접하게 결합된 클래스들을 형성하므로 유연성이 제한될 수 있습니다.

내용 - 열거형

열거형 사용 이유

  1. 가독성: 열거형을 사용하면 일련의 연관된 상수들을 명명할 수 있습니다. 이를 통해 코드의 가독성이 향상되고, 상수를 사용할 때 실수로 잘못된 값을 할당하는 것을 방지할 수 있습니다.
  2. 자기 문서화(Self-documenting): 열거형은 의미 있는 이름을 사용하여 상수를 명명할 수 있습니다. 이를 통해 코드의 가독성이 향상되며, 상수의 의미를 명확하게 설명할 수 있습니다.
  3. 스위치 문과의 호환성: 열거형은 스위치 문과 함께 사용될 때 유용합니다. 열거형을 사용하면 스위치 문에서 다양한 상수 값에 대한 분기를 쉽게 작성할 수 있습니다.

아이템 타입을 구분할때 사용하면 남들이 볼때 쉽게 코드를 이해할 수 있다.

열거형 특징

  • 열거형은 서로 관련된 상수들의 집합을 정의할 때 사용됩니다.
  • 열거형의 각 상수는 정수 값으로 지정됩니다.

열거형 사용 예시 코드

// 월 열거형
public enum Month
{
    January = 1,
    February,
    March,
    April,
    May,
    June,
    July,
    August,
    September,
    October,
    November,
    December
}

// 처리하는 함수
static void ProcessMonth(int month)
{
    if (month >= (int)Month.January && month <= (int)Month.December)
    {
        Month selectedMonth = (Month)month;
        Console.WriteLine("선택한 월은 {0}입니다.", selectedMonth);
        // 월에 따른 처리 로직 추가
    }
    else
    {
        Console.WriteLine("올바른 월을 입력해주세요.");
    }
}

// 실행 예제
static void Main()
{
    int userInput = 7; // 사용자 입력 예시
    ProcessMonth(userInput);
}