C#의 기초 - 15 (Delegate, 익명함수, event)

krokrai·2025년 12월 28일

Delegate, event

개요

  • Delegate, 익명함수
  • event

Delegate, 익명함수

  • Delegate는 대리자로 함수를 담을 수 있는 자료형으로, 대리자는 매개변수로 매소드자체를 넘겨주기 때문에 필요한 함수를 빠르고 간결하게 불러올 수 있습니다.
  • 객체관 상호작용에 이용되며, 특정 함수가 호출 되었을 때 연계되어, 호출 되야하는 함수가 있는 경우에 호출을 하기 위해 사용됩니다.

void Main()
{
	MyDel mydel = new MyDel();
	Triger triger = new Triger(mydel);
    Console.WriteLine(mydel.delg);
    while(true)
    {
    	if(Console.ReadKey() == ConsoleKey.W)
        	mydel.DelTest(-10);
    }
}

class MyDel
{
	public int delg {get; protected set } = 100;
    
    //접근제한자 delegate 반환형 이름(요소)
    public delegate void delgDelegate(int value);
    //대리자의 형태를 지정하였으니, 대리자를 변수 같이 선언합니다.
	public delDelegate OnChanged;
    
    public void DelTest(int value)
    {
    	delg += value;
    	OnChanged?.Invoke(delg);
    }
    
}

class Triger
{
	MyDel deleg;
    public Triger(MyDel _delg)
    {
    	deleg = _delg;
        deleg.OnChanged = Printer;
    }
    
    public Printer(int value)
    {
    	Console.WriteLine($"지정된 함수가 호출 되었습니다. {value}");
    }
}
100
지정된 함수가 호출 되었습니다. 90
지정된 함수가 호출 되었습니다. 80
  • 위와 같이 함수를 넣어줘서 필요할 때마다 호출 되게 만들 수 있습니다.
  • 다수의 함수를 호출해야 하는 경우 deleg.OnChanged += 함수명을 통해 다수의 함수를 지정할 수 있습니다.
  • 문제는 익명 함수와 함수 할당 후 해제 하지 않는 경우 입니다.
  • 익명 함수의 경우 delegate가 익명 함수가 더 이상 참조하지 않을 때까지 메모리에서 할당 해제 되지 않습니다.(메모리 누수), 할당 해제 또한 위와 같지만, 익명 함수와 다르게 직접 해제 전까지 할당 해제 되지 않습니다.

// 아래와 같이 사용하면 됩니다.
//대리자이름.대리자함수 ( = : 대입(마지막 함수만 적용되니 여러개 적용시 뒤에 껄로) / += 추가(2개 이상 사용 시 "체인" 이라고 부르며, 추가하는 방식입니다) delegate ()
deleg.OnChanged += delegate ()
{
	//호출 시 실행할 코드
}
  • 익명 함수 사용은 선택 사항이며, 편의성에 초점이 맞춰서 있고 위에 언급 하였 듯, 위험요소가 존재하기 때문에 가급적 사용하지 않는 것이 좋습니다.

event

  • event 는 대리자 함수를 지정할때 접근 제한자를 private로 선언하면 외부에서 사용하기 힘들기 때문에 접근만 가능하게 만들어야 할때 사용합니다
public delegate void delgDelegate(int value);
public event delDelegate OnChanged;
profile
게임을 좋아하고 만들고 싶은 개발자 지망생입니다.

0개의 댓글