델리게이트(Delegate)

메서드를 참조하는 타입. 메서드를 변수에 저장할 수 있다.

 

델리게이트 구현

event는 할당(=)을 사용할 수 없고 +=나 -=만 사용할 수 있으며, 클래스 외부에서 직접 이벤트를 호출할 수 없다. 이를 통해 해당 코드의 보안성을 높이고 캡슐화 한다.

// 델리게이트 선언
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);
}

 

 

람다(Lambda)

이름이 없는 익명 메서드 중 하나. 참조를 통해 컨트롤 한다.

// 델리게이트 선언
public delegate void GameEvent();

// 이벤트 매니저 클래스
public class EventManager
{
    // 게임 시작 이벤트
    public event GameEvent OnGameStart;

    // 게임 종료 이벤트
    public event GameEvent OnGameEnd;

    // 게임 실행
    public void RunGame()
    {
        // 게임 시작 이벤트 호출
        OnGameStart?.Invoke();

        // 게임 실행 로직

        // 게임 종료 이벤트 호출
        OnGameEnd?.Invoke();
    }
}

// 게임 메시지 클래스
public class GameMessage
{
    public void ShowMessage(string message)
    {
        Console.WriteLine(message);
    }
}

// 게임 실행
static void Main()
{
    // 이벤트 매니저 객체 생성
    EventManager eventManager = new EventManager();

    // 게임 메시지 객체 생성
    GameMessage gameMessage = new GameMessage();

    // 게임 시작 이벤트에 람다 식으로 메시지 출력 동작 등록
    eventManager.OnGameStart += () => gameMessage.ShowMessage("게임이 시작됩니다.");

    // 게임 종료 이벤트에 람다 식으로 메시지 출력 동작 등록
    eventManager.OnGameEnd += () => gameMessage.ShowMessage("게임이 종료됩니다.");

    // 게임 실행
    eventManager.RunGame();
}

 

 

Func과 Action

Func과 Action은 미리 정의된 제네릭 형식이다.

Func은 반환값이 있는 델리게이트이고 Action은 반환값이 없이 실행만 되는 메서드이다. Func에 int와 string을 준다면 int는 매개변수이고 뒤의 마지막으로 나오는 string은 반환값이다. Action 같은 경우에는 매개변수가 있으면 반환값이 없기 때문에 둘다 매개변수이다.

// 게임 캐릭터 클래스
class GameCharacter
{
    private Action<float> healthChangedCallback;

    private float health;

    public float Health
    {
        get { return health; }
        set
        {
            health = value;
            healthChangedCallback?.Invoke(health);
        }
    }

    public void SetHealthChangedCallback(Action<float> callback)
    {
        healthChangedCallback = callback;
    }
}

// 게임 캐릭터 생성 및 상태 변경 감지
GameCharacter character = new GameCharacter();
character.SetHealthChangedCallback(health =>
{
    if (health <= 0)
    {
        Console.WriteLine("캐릭터 사망!"); // 코드가 한 줄일 경우 중괄호 생략 가능
    }
});

// 캐릭터의 체력 변경
character.Health = 0;

델리게이트와 동일하지만 이미 정의, 구현 되어 있기 때문에 안전하고 코드가 한결 간단해진다.

 

 

LINQ(Language Intergrated Query)

.NET 프레임워크에서 제공되는 쿼리 언어 확장. 코드에서 collection이나 배열이나 데이터베이스에 쿼리를 던질 수 있다.

 

구조

var result = from 변수 in 데이터소스
             [where 조건식]
             [orderby 정렬식 [, 정렬식...]]
             [select 식];
  • var : LINQ에서 쿼리를 전달받는 형식들이 다양할 수 있기 때문에 사용한다.
  • from : 변수를 꺼내온다.
  • where절
  • orderbt 정렬
  • select 
// 데이터 소스 정의 (컬렉션)
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// 쿼리 작성 (선언적인 구문)
var evenNumbers = from num in numbers
                  where num % 2 == 0
                  select num;

// 쿼리 실행 및 결과 처리
foreach (var num in evenNumbers)
{
    Console.WriteLine(num);
}

 

 

+ Recent posts