오늘은 개인과제 대신 강의를 밀기로 했다.
개념 위주로 정리해보았다.
다중상속x >> 인터페이스ooo
다중상속은 왜 안쓰는가?
1. 다이아몬드 문제(Diamond Problem)
2. 설계의 복잡성 증가
3. 이름 충돌과 충돌 해결의 어려움
4. 설계의 일관성과 단순성 유지
인터페이스는 왜 쓰는가?
1. 코드의 재사용성
2. 다중 상속 제공
** 3. 유연한 설계
인터페이스
클래스가 구현해야 하는 멤버들을 정의(클래스의 종류x) >> 클래스에 대한 제약 조건을 명시
인터페이스 예시 코드↓↓
interface IMyInterface
{
void Method1();
int Method2(string str);
}
================================
class MyClass : IMyInterface
{
public void Method1()
{
// 구현
}
public int Method2(string str)
{
// 구현
return 0;
}
}
인터페이스를 활용한 아이템 사용 구현 예시 코드↓↓
// 아이템을 사용할 수 있는 인터페이스
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);
}
열거형
서로 관련된 상수들의 집합을 정의
각 상수는 정수값으로
열거형 게임 예시 코드↓↓
// 게임 상태
enum GameState
{
MainMenu,
Playing,
Paused,
GameOver
}
// 방향
enum Direction
{
Up,
Down,
Left,
Right
}
// 아이템 등급
enum ItemRarity
{
Common,
Uncommon,
Rare,
Epic
}
예외처리
catch 우선순위 >> 위에서부터 순서대로!
상속관계면 >> 상위 예외 타입의 catch 블록 먼저
finally
예외 발생 여부와 상관없이 항상 실행
try-catch 뒤에 작성, 생략가능
예외처리 예시 코드↓↓
// 플레이어 이동
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);
// 예외에 대한 추가 처리
}