C#

C# 인터페이스와 열거형

anvil925 2025. 3. 3. 20:57
728x90
반응형

using System;

// C# 인터페이스와 열거형

// 다중상속을 사용하지 않는 이유
// 1. 다중상속을 허용하면 어떤 부모클래스의 메서드를 호출해야할지 모호해진다.
// 2. 다중상속을 허용하면 클래스의 크기가 커지고 복잡해진다.
// 3. 다중상속을 허용하면 부모클래스의 변경이 자식클래스에 영향을 미치게 된다.

// 다이아몬드 문제
// 다중상속을 허용하면 다이아몬드 문제가 발생한다.
// 다이아몬드 문제는 다중상속을 허용하는 언어에서 발생하는 문제로, 다중상속을 허용하는 언어에서는
// 같은 부모클래스를 상속받는 두 개 이상의 클래스가 있을 때, 공통 부모클래스의 멤버를 중복으로 상속받는 문제를 말한다.

// 설계의 복잡성 증가
// 다중상속을 허용하면 클래스의 설계가 복잡해지고, 클래스 간의 관계가 복잡해진다.
// 다중상속을 허용하면 클래스 간의 관계가 복잡해지고, 클래스 간의 결합도가 높아지기 때문에 유지보수가 어려워진다.

// C#에서는 다중상속을 허용하지 않는 대신 인터페이스를 제공한다.
// 인터페이스는 클래스가 구현해야할 멤버를 정의하는 역할을 한다.
// 인터페이스는 클래스와 클래스 사이의 계약을 정의하는 것으로, 클래스가 인터페이스를 구현하면 인터페이스에서 정의한 멤버를 반드시 구현해야 한다.

// 인터페이스를 사용하는 이유
// 1. 다중상속을 허용하지 않는 C#에서 클래스가 여러 개의 인터페이스를 구현할 수 있도록 한다.
// 2. 인터페이스를 사용하면 클래스 간의 결합도를 낮출 수 있다.
// 3. 인터페이스를 사용하면 클래스 간의 관계를 명확하게 정의할 수 있다.
// 4. 인터페이스를 사용하면 클래스의 재사용성을 높일 수 있다.

// 인터페이스의 특징
// 1. 인터페이스는 클래스가 구현해야할 멤버를 정의하는 역할을 한다.
// 2. 인터페이스는 클래스와 클래스 사이의 계약을 정의하는 것으로, 클래스가 인터페이스를 구현하면 인터페이스에서 정의한 멤버를 반드시 구현해야 한다.
// 3. 인터페이스는 다중속성을 지원한다.

// 인터페이스 선언
// 인터페이스는 interface 키워드를 사용하여 선언한다.
// 인터페이스는 클래스와 마찬가지로 접근 제한자를 사용하여 접근 범위를 지정할 수 있다.
// 인터페이스는 클래스와 달리 멤버에 접근 제한자를 사용할 수 없다.
// 인터페이스는 멤버에 접근 제한자를 사용할 수 없기 때문에 인터페이스의 멤버는 자동적으로 public으로 선언된다.

// 인터페이스 구현
// 인터페이스를 구현하려면 클래스나 구조체에서 인터페이스를 상속받아야 한다.
// 클래스나 구조체에서 인터페이스를 상속받을 때는 콜론(:)을 사용하여 상속받을 인터페이스를 나열한다.
// 클래스나 구조체에서 인터페이스를 상속받으면 인터페이스에서 정의한 멤버를 반드시 구현해야 한다.

// 인터페이스의 멤버
// 인터페이스는 메서드, 속성, 인덱서, 이벤트를 정의할 수 있다.
// 인터페이스는 멤버에 접근 제한자를 사용할 수 없기 때문에 인터페이스의 멤버는 자동적으로 public으로 선언된다.

// 인터페이스의 멤버 정의하기
interface IMyInterface
{
    void Method1();
    int Method2(string str);
}

// 인터페이스 구현하기
class MyClass : IMyInterface
{
    public void Method1()
    {
        Console.WriteLine("Method1"); // 구현
    }

    public int Method2(string str)
    {
        Console.WriteLine("Method2 : " + str); // 구현
        return 0;
    }
}

// 사용 예제

// 1. 인터페이스 정의하기
interface IMovable
{
    void Move(int x, int y); // 이동 메서드 선언
}

// 2. 인터페이스 구현하는 클래스 생성하기
class Animal : IMovable
{
    public void Move(int x, int y) // 인터페이스의 메서드 구현
    {
        Console.WriteLine($"Animal : Move to ({x}, {y})"); // 동물 이동 구현
        // 출력 결과 : Animal : Move to (10, 20)
    }
}

class Person : IMovable
{
    public void Move(int x, int y) // 인터페이스의 메서드 구현
    {
        Console.WriteLine($"Person : Move to ({x}, {y})"); // 사람 이동 구현
        // 출력 결과 : Person : Move to (30, 40)
    }
}

// 3. 인터페이스를 사용하여 객체 이동하기
class InterfaceAndEnums
{
    static void MoveObject(IMovable movable, int x, int y)
    {
        movable.Move(x, y);
    }

    static void Main()
    {
        Animal animal = new Animal();
        Person person = new Person();

        MoveObject(animal, 10, 20); // 동물 이동
        MoveObject(person, 30, 40); // 사람 이동
    }
}

// 아이템 사용 구현 예제

// 1. 아이템 사용 인터페이스 정의하기
interface IUsable
{
    void Use();
}

// 2. 아이템 사용 인터페이스를 구현하는 클래스 생성하기
class Sword : IUsable
{
    public void Use() // 인터페이스의 메서드 구현
    {
        Console.WriteLine("Sword : Use"); // 검 사용 구현
    }
}

class Gun : IUsable
{
    public void Use() // 인터페이스의 메서드 구현
    {
        Console.WriteLine("Gun : Use"); // 총 사용 구현
    }
}

// 3. 플레이어 클래스 생성하기
class Player
{
    public void UseItem(IUsable usable)
    {
        usable.Use();
        // 출력 결과 : Sword : Use
        // 출력 결과 : Gun : Use
    }
}

// 4. 게임 실행하기

    // static void Main()
    // {
    //     Player player = new Player();
    //     Sword sword = new Sword();
    //     Gun gun = new Gun();

    //     player.UseItem(sword); // 검 사용
    //     player.UseItem(gun); // 총 사용
    // }

// 다중인터페이스 구현 예제

// 1. 다중인터페이스 정의하기
interface IRunnable
{
    void Run();
}

interface IFlyable
{
    void Fly(); 
}

// 2. 다중인터페이스를 구현하는 클래스 생성하기
class FlyingCar : IRunnable, IFlyable
{
    public void Run() // IRunnable 인터페이스의 메서드 구현
    {
        Console.WriteLine("FlyingCar : Run"); // 차량 이동 구현
        // 출력 결과 : FlyingCar : Run
    }

    public void Fly() // IFlyable 인터페이스의 메서드 구현
    {
        Console.WriteLine("FlyingCar : Fly"); // 차량 비행 구현
        // 출력 결과 : FlyingCar : Run
        // 출력 결과 : FlyingCar : Fly
    }
}

// 3. 게임 실행하기

    // static void Main()
    // {
    //     FlyingCar flyingCar = new FlyingCar();
    //     flyingCar.Run(); // 차량 이동
    //     flyingCar.Fly(); // 차량 비행
    // }


// 열거형(Enum)
// 열거형은 상수를 정의할 때 사용하는 데이터 형식으로, 상수를 정의할 때 사용하면 코드를 읽고 이해하기 쉽게 만들어준다. (가독성 향상)
// 열거형은 열거형을 정의할 때 사용하는 enum 키워드를 사용하여 정의한다.
// 자기문서화(Self-Documenting) : 코드를 읽고 이해하기 쉽게 만드는 것
// 스위치문(Switch Statement) : 열거형을 사용하면 스위치문을 사용할 때 코드를 읽고 이해하기 쉽게 만들어준다.

// 열거형 구현

// 1. 열거형 정의하기
enum Day
{
    Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
}

// 2. 열거형 사용하기
class EnumExample
{
    static void Main()
    {
        Day today = Day.Sunday; // 열거형 변수 선언
        Console.WriteLine(today); // 열거형 값 출력
        // 출력 결과 : Sunday
    }
}

// 3. 열거형 상수 값 지정
enum Day2
{
    Sunday = 0, Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4, Friday = 5, Saturday = 6
}

// 4. 열거형 형 변환
class EnumExample2
{
    static void Main()
    {
        Day2 today = Day2.Sunday; // 열거형 변수 선언
        int day = (int)today; // 열거형을 정수로 변환
        Console.WriteLine(day); // 정수 값 출력
        // 출력 결과 : 0
    }
}

// 5. 스위치문과의 사용
    // switch(enumDays)
    // {
    //     case Day.Sunday:
    //         Console.WriteLine("Sunday");
    //         break;
    //     case Day.Monday:
    //         Console.WriteLine("Monday");
    //         break;
    //     case Day.Tuesday:
    //         Console.WriteLine("Tuesday");
    //         break;
    //     case Day.Wednesday:
    //         Console.WriteLine("Wednesday");
    //         break;
    //     case Day.Thursday:
    //         Console.WriteLine("Thursday");
    //         break;
    //     case Day.Friday:
    //         Console.WriteLine("Friday");
    //         break;
    //     case Day.Saturday:
    //         Console.WriteLine("Saturday");
    //         break;
    // }
728x90
반응형

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

C# 델리게이트  (0) 2025.03.06
C# 예외 처리, 값형과 참조형식  (0) 2025.03.04
C# 고급 문법과 기능  (0) 2025.02.20
C# 클래스와 객체  (0) 2025.02.13
C# 메서드(Method)와 구조체(Structures)  (0) 2025.02.11