본문 바로가기
🌐 유니티 (Unity)

Day 15 - C# (인터페이스, Enums 열거형, 예외 처리 try-catch)

by shin0707 2024. 4. 30.
728x90
반응형

  • 주제

1. 인터페이스

2. Enums (열거형)

3. 예외 처리(try-catch & finally)


  • 공부내용

1. 인터페이스란?

클래스가 구현해야 하는 기능이나 속성을 정의해 놓은 것이다.

클래스에서 해당 인터페이스를 구현하면, 인터페이스 내의 기능을 가져다 쓸 수 있다.

다중 상속을 지원하여, 클래스가 여러 인터페이스를 구현함으로써 여러 개의 기능을 조합하여 사용이 가능하다.

 

1-1. 인터페이스 구현(정의 -> 구현할 클래스 생성 -> 사용)

클래스가 인터페이스를 구현할 경우, 모든 인터페이스 멤버(메서드, 프로퍼티, 이벤트[event])를 구현해야 한다.

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

//인터페이스를 구현하는 클래스 생성
public class Player : IMovable
{
    public void Move(int x, int y)
    {
        // 플레이어의 이동 구현
    }
}

//인터페이스를 구현하는 클래스 생성
public class Enemy : IMovable
{
    public void Move(int x, int y)
    {
        // 적의 이동 구현
    }
}

//인터페이스를 사용하여 객체 이동
IMovable movableObject1 = new Player();
IMovable movableObject2 = new Enemy();

movableObject1.Move(5, 0); // 플레이어 이동
movableObject2.Move(1, 9); // 적 이동

 

1-2. 다중 상속 구현

클래스가 더 다양한 동작을 수행할 수 있게 해준다.

// 인터페이스 1
public interface IItemPickable
{
    void PickUp(); //1.아이템을 줍는 기능
}

// 인터페이스 2
public interface IDroppable
{
    void Drop();  //2.아이템을 버리는 기능
}

// 두개의 인터페이스를 구현하는 아이템 클래스
public class Item : IItemPickable, IDroppable
{
    public string Name { get; set; }  //자동프로퍼티로 Name 필드 생성

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

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

// 플레이어 클래스
public class Player
{                                                     //인터페이스를 참조하여 사용
    public void InteractWithItem(IItemPickable item)  //Item item이 아니라 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);
}

 


 

2. Enums(열거형)이란?

서로 관련된 상수(정수 값으로 지정 됨)들의 집합을 정의할 때 사용된다.

열거형을 사용하면 가독성이 향상되고,

의미 있는 이름을 사용하여 상수를 정할 수 있다.

스위치 문과 함께 사용될 때 가장 효과적이다.

 

사용 사례) 게임 상태(메인, 플레이, 정지, 종료), 방향(위, 아래, 좌, 우), 아이템 등급(노말, 레어, 에픽)

 

2-1. 열거형 구현

//열거형 정의
enum DaysOfWeek
{
    Sunday,   ---> 0이 이미 지정되어 있다.
    Monday,   ---> 1 (1씩 상승)
    Tuesday,  ---> 2
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

//열거형 사용
class Program
{
    static void Main(string[] args)
    {
        DaysOfWeek day = DaysOfWeek.Monday;  ----> 사용
        Console.WriteLine("Today is " + day);
    }
}

 

//상수값 지정
public enum Month
{
    January = 1,   ---> 1로 정수값 지정
    February,      ---> 2 (이전 항목의 정수값을 지정하면, 자동으로 이전 정수값 +1)
    March,         ---> 3
    April,
    May,
    June,
    July,
    August,
    September,
    October,
    November,
    December
}

//형변환 개념
int intvalue = (int)Month.January   // 열거형 값 -> 정수로 변환
Month enumvalue = (Month)January;  //    정수  -> 열거형으로 변환

//실행
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("올바른 월을 입력해주세요.");
    }
}

//열거형 & 스위치문 사용
switch(enumValue)
{
    case Month.January:
        // January에 대한 처리
        break;
    case Month.February:
        // February에 대한 처리
        break;
    case Month.March:
        // March에 대한 처리
        break;
    default:
        // 기본 처리
        break;
}

3. 예외 처리 (try-catch & finally)

예외 처리를 통해 오류 상황을 처리하고, 프로그램의 계속 실행할 수 있다.

3-1. 예외 처리 구현

try
{
    // 예외가 발생할 수 있는 코드
}
catch (ExceptionType1 ex)
{
    // ExceptionType1에 해당하는 예외 처리
}
catch (ExceptionType2 ex)
{
    // ExceptionType2에 해당하는 예외 처리
}
finally  --> 생략가능
{
    // 예외 발생 여부와 상관없이 항상 실행되는 코드(정리 작업 또는 리소스 해제)
}

 

 

3-1. 사용자 정의 예외 처리

catch 블록에서 사용자 정의 예외 타입을 명시하여 예외를 처리하고,

예외에 대한 적절한 처리 로직 작성이 가능하다.

Tip. 가능한 구체적인 예외 클래스를 사용

// 플레이어 이동
try
{
    // 플레이어 이동 코드
    if (IsPlayerCollidingWithWall())
    {
        throw new CollisionException("플레이어가 벽에 충돌했습니다!");
    }
}
catch (CollisionException ex)
{
    // 충돌 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}


// 리소스 로딩
try
{
    // 리소스 로딩 코드
    LoadResource("image.png");
}
catch (ResourceNotFoundException ex)
{
    // 리소스가 없는 경우 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}
catch (ResourceLoadException ex)
{
    // 리소스 로딩 중 오류가 발생한 경우 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}


// 게임 상태 전이
try
{
    // 상태 전이 코드
    if (currentGameState != GameState.Playing)
    {
        throw new InvalidStateException("게임이 실행 중이 아닙니다!");
    }
    // 게임 상태 전이 실행
}
catch (InvalidStateException ex)
{
    // 상태 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}
728x90
반응형

loading