Func과 Action
Func, Action?
Func
와 Action
은 델리게이트를 대체하는 미리 정의된 제네릭 형식.
Func
는 값을 반환하는 메서드를 나타내는 델리게이트. 마지막 제네릭 형식 매개변수는 반환 타입을 나타낸다.
ex) Func<int, string>
은 int를 입력으로 받아 string을 반환한다.
Action
은 값을 반환하지 않는 메서드를 나타내는 델리게이트. Action
은 매개변수를 받아들이지만, 반환타입이 없다.
ex) Action<int, string>
은 int와 string을 입력으로 받고, 아무런 값을 리턴하지 않는다.
Func
와 Action
은 제네릭 형식으로 미리 정의되어 있어 매개변수와 반환 타입을 간결하게 표현할 수 있다.
Func 예제
// Func를 사용하여 두 개의 정수를 더하는 메서드
int Add(int x, int y)
{
return x + y;
}
// Func를 이용한 메서드 호출
Func<int, int, int> addFunc = Add;
int result = addFunc(3, 5);
Console.WriteLine("결과: " + result);
Action 예제
// Action을 사용하여 문자열을 출력하는 메서드
void PrintMessage(string message)
{
Console.WriteLine(message);
}
// Action을 이용한 메서드 호출
Action<string> printAction = PrintMessage;
printAction("Hello, World!");
사용 예제)
// 게임 캐릭터 클래스
class GameCharacter
{
// float를 매개변수로 받는 Action
private Action<float> healthChangedCallback;
// health를 private으로 선언
private float health;
// health를 private으로 선언했기 때문에 프로퍼티를 통해 접근
public float Health
{
get { return health; }
// health의 값이 변경될 때(set),
set
{
health = value;
healthChangedCallback?.Invoke(health); // healthChangedCallback 실행
}
}
// 위에 선언한 Action 연결해주기
public void SetHealthChangedCallback(Action<float> callback)
{
healthChangedCallback = callback;
}
}
// 게임 캐릭터 생성 및 상태 변경 감지
GameCharacter character = new GameCharacter();
// 람다식을 활용하여 체력이 0보다 작거나 같게 되면 "캐릭터 사망!" 출력
character.SetHealthChangedCallback(health =>
{
if (health <= 0)
{
Console.WriteLine("캐릭터 사망!");
}
});
// 캐릭터의 체력 변경
character.Health = 0;
해당 코드를 쓰는 이유???
- 해당 코드에서는 health 값이 변경될 때마다 무조건 healthChangedCallback이 실행된다(set으로 선언해놨기 때문)
- healthChangedCallback Action에 HP와 관련된 기능들을 걸어놓으면 health가 변할 때마다 자동으로 실행되도록 코드를 작성할 수 있다.