.
목 차
확인 문제
using System;
class Program
{
// 델리게이트 정의
public delegate int MyCallback(int a, int b);
// 덧셈 메서드
static int Add(int a, int b)
{
return a + b;
}
// 곱셈 메서드
static int Multiply(int a, int b)
{
return a * b;
}
static void Main(string[] args)
{
MyCallback MathOperation;
MathOperation = Add;
Console.WriteLine(MathOperation(3, 4));
MathOperation = Multiply;
Console.WriteLine(MathOperation(7, 5));
}
}
1. 위 코드의 출력 결과는 무엇인가요? 그 이유는 무엇인가요?
7\n35\n
MathOperation이라는 콜백을 만든 후, Add 메서드를 참조했다.
그 뒤, 콜백함수를 불렀으므로 처음에는 7이 출력된다.
다음 라인에서 +=으로 이벤트를 추가해준 것이 아니라 Multiply 함수를 새로 참조했다.
그러므로 Add함수는 작동하지 않고 Multiply만 동작해서 35를 출력한다.
2. 위 코드의 Main 함수를 아래처럼 바꿔도 같은 방식으로 동작할까요? 그 이유는 무엇인가요?
static void Main(string[] args)
{
Func<int, int, int> MathOperation;
MathOperation = Add;
Console.WriteLine(MathOperation(3, 4));
MathOperation = Multiply;
Console.WriteLine(MathOperation(7, 5));
}
동작할 것이다.
Func 델리게이트는 <> 안의 마지막 타입을 반환자로 하는 메서드를 참조한다.
만약 타입이 여러 개라면, 마지막을 제외한 것들이 참조할 메서드의 인자가 된다.
위의 코드를 보면 Add와 Multiply 함수는 각각 인자 2개와 반환자 1개를 가지므로 이 스크립트는 정상작동하게 된다.
3. 델리게이트를 사용하여 메서드를 매개변수로 전달하는 장점은 무엇인가요?
우선 코드 유연성이 증가한다. 메서드를 런타임에 동적으로 변경하여 다양한 상황에 맞는 구현을 할 수 있다.
또한 재사용성이 높아져서 여러 클래스에서 공통적으로 사용할 로직을 한 번만 구현할 수 있도록 해준다.
이벤트 기반 프로그래밍도 가능해진다. A클래스에서 발생한 사건에 대해 B클래스의 메서드를 호출함으로써 이벤트 처리 로직을 분리하고 코드의 가독성과 관리용이성을 높일 수 있다.
설명 문제
1. 콜백이란 무엇인가요? 콜백을 사용해본 경험이 있을까요?
콜백이란 특정 이벤트 발생 시 호출되는 메서드 등을 말한다.
주로 비동기 작업을 처리하거나 이벤트 기반 프로그래밍에서 사용된다.
가장 많이 사용한 콜백은 Unity의 MonoBehaviour 콜백 함수들이다.
Update(), Start(), OnCollisionEnter() 등의 함수들은 Unity 엔진이 특정 타이밍이나 이벤트에 따라 자동으로 호출하는 콜백 함수들입니다.
또한, 게임을 만들 때 플레이어의 사망 이벤트를 GameManager(시간 멈추거나 뒤로 돌리는 용), CustomSceneManager(씬 전환용) 등에게 알릴 때 사용한 경험이 있다.
2. 델리게이트(delegate; 대리자)란 무엇인가요?
일종의 함수 포인터이다.
특정 인자/반환자를 가지는 메서드를 참조하고 있다가 델리게이트를 호출했을 때 참조하고 있던 함수들을 함께 호출하는 역할을 한다.
따라서 콜백 메서드를 구현하고 이벤트 핸들링을 할 때 주로 사용된다.
3. C#의 event란 무엇인가요?
특정 클래스에서 발생하는 사건을 알리는 메커니즘으로, 델리게이트와 주로 함께 사용된다.
4. Unity에서 사용하는 델리게이트 혹은 이벤트에는 어떤 것이 있나요?
Action, Func 델리게이트, UnityEvent 등이 있다.
실습 문제
namespace _03.콜백__delegate__event_실습
{
// 이벤트 데이터를 담는 EventArgs 파생 클래스
public class PlayerDamagedEventArgs : EventArgs
{
public int Damage { get; set; }
}
// 플레이어 클래스
public class Player
{
public int HP { get; private set; } = 100;
// 플레이어가 데미지를 받을 때 발생하는 이벤트를 정의하세요.
public event EventHandler<PlayerDamagedEventArgs> PlayerDamaged;
// 플레이어가 데미지를 받는 메서드
public void TakeDamage(int damage)
{
HP -= damage;
PlayerDamagedEventArgs e = new PlayerDamagedEventArgs { Damage = damage };
// TODO: 이벤트가 등록되어 있는지 확인하고 이벤트를 발생
PlayerDamaged?.Invoke(this, e);
}
}
public class DisplayAndSound
{
public DisplayAndSound(Player player)
{
// TODO : 각각의 이벤트 핸들러를 등록하세요.
player.PlayerDamaged += DisplayStatus;
player.PlayerDamaged += DisplayHitEffect;
player.PlayerDamaged += PlayHitSound;
}
// 데미지 상태를 출력하는 메서드
void DisplayStatus(object sender, PlayerDamagedEventArgs e)
{
Player player = sender as Player;
Console.WriteLine($"Player took {e.Damage} damage!");
Console.WriteLine($"Remaining HP: {player.HP}");
}
// 피격 이펙트를 표시하는 메서드
void DisplayHitEffect(object sender, PlayerDamagedEventArgs e)
{
Console.WriteLine("Displaying hit effect...");
}
// 피격 사운드를 재생하는 메서드
void PlayHitSound(object sender, PlayerDamagedEventArgs e)
{
Console.WriteLine("Playing hit sound...");
}
}
class Program
{
static void Main(string[] args)
{
Player player = new Player();
DisplayAndSound displayAndSound = new DisplayAndSound(player);
// 플레이어가 데미지를 받아 이벤트를 발생
player.TakeDamage(20);
Console.WriteLine($"Player HP: {player.HP}");
}
}
}
.
'내일배움캠프 > 꾸준CS과제' 카테고리의 다른 글
[TIL 24.07.09] 07. C# 심화 문법 (0) | 2024.07.09 |
---|---|
[TIL 24.07.08] 06. Garbage Collector (0) | 2024.07.08 |
[TIL 24.07.05] 05. 상속과 인터페이스 (0) | 2024.07.05 |
[TIL 24.07.02] 02. 객체지향 프로그래밍 (0) | 2024.07.02 |
[TIL 24.07.01] 01. 객체와 한정자 (0) | 2024.07.01 |