C#

C# 인터페이스와 열거형

bugmin 2024. 4. 26. 23:40

클래스서 다중 상속을 사용하지 않는 이유가 있다.

 

A 클래스로 부터 B, C가 상속을 받고 D가 B, C를 상속받으면 다이아몬드 구조가 되어

B, C가 동일한 A 클래스로부터 상속을 받았기에 둘이 같은 멤버, 메서드 중 뭔 골라야 할지 모호해지는 문제점이 존재한다.

 

또한 당연히 다중 상속을 하면 클래스 간의 계층 구조가 복잡해지며 일관성을 유지하기 위해 C#에서는 다중 상속은 지원하지 않는다.

 

인터페이스

 

클래스는 다중 상속이 안되지만 다중 상속을 지원하는 인터페이스가 있다.

인터페이스는 클래스에게 "이렇게 구현을 해!" 라고 제시를 해주는 설계도일 뿐이고 실제 구현은 클래스에서 이루어진다.

 

// 인터페이스 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);
}

 

구현 방법을 보면 위와 같다.

 

인터페이스를 구현시에 인터페이스 이름은 첫글자가 대문자 I 로 시작하는 관습을 볼 수가 있다.

 

인터페이스를 선언한 후엔 클래스에서 이를 부모 클래스를 상속받아 쓰는 거처럼 사용을 하면 된다.

 

그리고 사용시엔 마치 부모 클래스로 참조타입을 선언하고 실형태인 자식 클래스를 참조하는 것처럼 ( ex: Animal cat = new Cat(); )

인터페이스로 선언하고 실형태는 클래스로 선언하면 된다.

 

메서드는 그냥 클래스에서 메서드 쓰듯이 사용을 하면된다.

 

다중 상속은 쉼표를 통해 구현하면 된다.

아이템은 줏을 수도 떨어뜨릴 수도 있으니 다중으로 인터페이스를 상속받는 모습니다.

 

추가적으로 스파르타 코딩클럽의 튜터님의 조언에 따르면 이전 글서 부모 클래스로 참조타입을 선언하고 실형태인 자식 클래스를 참조하는 것보다는 인터페이스를 사용하는 것이 좋다고 하셨다.

 

추상클래스와 비교

 

인터페이스는 동작만 정의하는 거지 구현을 가지지는 않고 다중상속이 가능한 반면 추상클래스는 일반 메서드를 통해 동작의 구현을 할 수 있고 추상메서드를 통해 자식 클래스에서 구현을 무조건 하도록 하는 C++의 순수 가상 함수와 비슷한 역을 수행한다 했다. 

 

상속의 경우 인터페이스는 다중 상속도 가능하지만 추상 클래스는 단일 상속만 가능하다.

 

열거형(Enum)

 

연관된 상수들을 명명하여 코드의 카독성을 높이고 실수를 줄일 수 있게 도움을 주며 스위치 문과 궁합이 좋다.

 

//정의
enum MyEnum
{
    Value1, //상수 값은 0이다. 
    Value2,
    Value3
}

//사용법
MyEnum myEnum = MyEnum.Value1;

 

정의시엔 우리가 만든 자료형이니 열거형 명이나 명칭들을 전부 첫글자를 대문자로 하자 

 

사용 시에는 자료형으로써 쓰는 거 처럼 쓰면 된다.

 

딱히 값을 지정안해주면 첫번 째 상수값은 0이 된다.

 

enum MyEnum
{
    Value1 = 10,
    Value2,
    Value3 = 20
}

 

만일 값을 지정해주면 뒤의 상수값은 앞의 상수값에 1이 증가된 값으로 해당 코드에서 Value2는 11의 값을 가진다.

 

형변환

int intValue = (int)MyEnum.Value1;  // 열거형 값을 정수로 변환
MyEnum enumValue = (MyEnum)intValue;  // 정수를 열거형으로 변환

 

그냥 상수와 열거형 값을 정수값과 비교하면 에러가 나고 형변환을 시켜서 비교를 해야한다.

 

아래는 사례 코드이다.

// 월 열거형
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);
}

 

userInput을 7로 설정했다면 July가 출력될 것이다.

int 값을 매개변수로 받았기에 Month 값은 형변환을 시켜 비교를 한다.

// 게임 상태
enum GameState
{
    MainMenu,
    Playing,
    Paused,
    GameOver
}

// 방향
enum Direction
{
    Up,
    Down,
    Left,
    Right
}

// 아이템 등급
enum ItemRarity
{
    Common,
    Uncommon,
    Rare,
    Epic
}

 

이 외에도 위와 같이 게임 상태, 방향, 아이템 등급을 표시할 때 열거형 값이 이용될 수 있다.

 

열거형은 스파르타코딩클럽의 튜터님도 자주 사용된다 말씀해주셨기에 알아두면 좋다.

'C#' 카테고리의 다른 글

C# - Clamp 함수와 사용 예제  (1) 2024.05.27
5/1 TIL - Delegate, Func, Action, 람다  (2) 2024.05.01
C# 고급 문법 및 기능  (0) 2024.04.25
C# OOP와 클래스  (0) 2024.04.24
C# 연산자와 문자열 처리  (0) 2024.04.23