1-02) 내일배움캠프 TIL .

최보훈·2024년 1월 2일
0

TIL

목록 보기
4/28
post-thumbnail

TIL

다중상속

사용의 문제

  • 다이아몬드 문제

    • 한 클래스가 두 개 이상의 보무 클래스로부터 동일한 맴버를 상속받는 경우.

      클래스 D는 B 와 C를 상속받고 있는데 B,C가 A동일하게 상속하는 경우,
  • 설계의 복잡성 증가

    • 클래스간의 관계가 복잡해진다.
  • 이름 충돌과 충돌 해결의 어려움

    • 부모 클래스로부터 상속받은 맴버들이 이름이 충돌할 수 있다.

인터페이스

  • 코드의 재사용성 증가
  • 다중 상속 제공
  • 유연한 설계 가능
코드 예제
// 아이템을 사용할 수 있는 인터페이스
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);
}

아이템 클래스는 IUsable 인터페이스를 상속받는다.
이렇게 할 경우 플레이어는 UseItem이라는 메서드의 활용성이 높아지게 된다.

사용자 정의 예외처리

  • 사용자 정의 예외처리는 Exception 클래스를 상송받아 작성한다.
  • ex)
public class NegativeNumberException : Exception
{
    public NegativeNumberException(string message) : base(message)
    {
    }
}

try
{
    int number = -10;
    if (number < 0)
    {
        throw new NegativeNumberException("음수는 처리할 수 없습니다.");
    }
}
catch (NegativeNumberException ex)
{
    Console.WriteLine(ex.Message);
}
catch (Exception ex)
{
    Console.WriteLine("예외가 발생했습니다: " + ex.Message);
}

Boxing, Unboxing

Boxing : 값형을 참조형으로 변환하는 과정
Unboxing : 박싱된 객첼르 다시 값형으로 변환하는 과정

리스트에서의 활용
int intValue =10;
myList.Add(intValue); // int를 object로 박싱하는 과정

int value1 = (int)myList[0]; // object를 int로 언박싱하는 과정

Deligate

  • 메서드를 참조하는 타입
  • 메서드를 매개변수로 전달하거나 변수에 할당할 수 있다.
  • Ex)
// 델리게이트 선언
public delegate void EnemyAttackHandler(float damage);

// 적 클래스
public class Enemy
{
    // 공격 이벤트
    public event EnemyAttackHandler OnAttack;

    // 적의 공격 메서드
    public void Attack(float damage)
    {
        // 이벤트 호출
        OnAttack?.Invoke(damage);
				// null 조건부 연산자
				// null 참조가 아닌 경우에만 멤버에 접근하거나 메서드를 호출
    }
}

// 플레이어 클래스
public class Player
{
    // 플레이어가 받은 데미지 처리 메서드
    public void HandleDamage(float damage)
    {
        // 플레이어의 체력 감소 등의 처리 로직
        Console.WriteLine("플레이어가 {0}의 데미지를 입었습니다.", damage);
    }
}

// 게임 실행
static void Main()
{
    // 적 객체 생성
    Enemy enemy = new Enemy();

    // 플레이어 객체 생성
    Player player = new Player();

    // 플레이어의 데미지 처리 메서드를 적의 공격 이벤트에 추가
    enemy.OnAttack += player.HandleDamage;

    // 적의 공격
    enemy.Attack(10.0f);
}

0개의 댓글