delegate int Calculate(int x, int y);
// 델리게이트로 선언한 형식과 동일해야한다.
static int Add(int x, int y){
retrun x + y;
}
void Main(){
// 일반 변수 선언하듯 델리게이트 선언하고 함수 할당
Calculate calc = Add;
// 사용
int result = calc(2, 2);
}
실제로는 메서드에 접근하기 쉽지 않은 환경일 때, 메서드를 연결하여 바로 사용하기 위함.
여러 메서드 등록하기
delegate void MyDelegate(string msg);
static void Method1(string message){
Console.WriteLine("Method1 : " + message);
}
static void Method2(string message){
Console.WriteLine("Method2 : " + message);
}
void Main(){
// 델리게이트 인스턴스 생성 및 메서드 등록
MyDelegate myDelegate = Method1;
myDelegate += Method2;
// 델리게이트 호출
myDelegate("Hello!");
// 결과
// "Method1 : Hello"
// "Method2 : Hello"
}
public delegate void EnemyAttackHandler(float damage);
public class Enemy
{
// 공격 이벤트
public event EnemyAttackHandler OnAttack;
// attack이 발생할 때 해주어야할 메서드들을 모두 예약을 걸어주었다고 생각하면 편함
// 적의 공격 메서드
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);
}
* 실제에선 델리게이트보다 좀 더 다른 것들과 함께 많이 씀.
익명 메서드
참조만으로 컨트롤
형태
(parameter_list) => expression(코드)
// Calculate은 델리게이트
// 여러줄 구현
Calculate calc = (x, y) =>
{
return x + y;
};
// 한줄
Calculate calc = (x, y) => x + y;
using System;
// 델리게이트 선언
delegate void MyDelegate(string message);
class Program
{
static void Main()
{
// 델리게이트 인스턴스 생성 및 람다식 할당
MyDelegate myDelegate = (message) =>
{
Console.WriteLine("람다식을 통해 전달된 메시지: " + message);
};
// 델리게이트 호출
myDelegate("안녕하세요!");
Console.ReadKey();
}
}
// 델리게이트 선언
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<int, string>
int : 매개변수
string : 반환값
string ~~~(int num){} 메서드를 연결할 수 있음.
Action<int, string>
int : 매개변수1
string : 매개변수2
void ~~~(int, string){} 형태의 메서드를 연결할 수 있음.
static int Add(int x, int y){
return x + y;
}
void Main(){
Func<int, int, int> addFunc = Add;
int result = addFunc(3, 5); // 8
}
static void PrintMessage(string message)
{
Console.WriteLine(message);
}
void Main(){
Action<string> printAction = PrintMessage;
printAction("Hello, World.");
}
// 게임 캐릭터 클래스
class GameCharacter
{
private Action<float> healthChangedCallback;
private float health;
public float Health
{
get { return health; }
set
{
health = value;
healthChangedCallback?.Invoke(health);
// health 변경 때마다 무조건 실행.
// health 변경에 대한 콜백을 구성한 것.
}
}
public void SetHealthChangedCallback(Action<float> callback)
{
healthChangedCallback = callback;
}
}
// 게임 캐릭터 생성 및 상태 변경 감지
GameCharacter character = new GameCharacter();
//액션에 람다 할당
character.SetHealthChangedCallback(health =>
{
if (health <= 0)
{
Console.WriteLine("캐릭터 사망!");
}
});
// 캐릭터의 체력 변경
character.Health = 0;
var result = from 변수 in 데이터소스
[where 조건식]
[orderby 정렬식 [, 정렬식...]]
[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);
}
// 선언
int? nullableInt = null; // Nullable<int> 형식
// 할당 및 접근
nullableInt = 10; // 일반적으로 사용하듯이 접근
int intVal = nullableInt.value; // 또는 .value로 접근
// null 검사
if (nullableInt.HasValue){
}
// null 병합 연산자 사용 (자주 쓰진 않지만 알아두면 좋음)
// nullableInt ?? 0과 같이 사용되며, nullableInt가 null이면 0을 반환합니다.
int nonNullableInt = nullableInt ?? 0;
Console.WriteLine("nonNullableInt 값: " + nonNullableInt);
StringBuilder sb = new StringBuilder();
// 문자열 추가
sb.Append("Hello");
sb.Append(" ");
sb.Append("World");
// 문자열 삽입
sb.Insert(5, ", ");
// 문자열 치환
sb.Replace("World", "C#");
// 문자열 삭제
sb.Remove(5, 2);
// 완성된 문자열 출력
string result = sb.ToString();
Console.WriteLine(result);
C#에서 제공한다고 해서 Unity C#에서도 지원하는 것은 아님
지금까지 내용은 대체로 유니티에서도 지원하지만 최신기능은 그렇지 않을 수도 있으니 유의