람다와 액션

람다! 아는척 하고 있었지만…

” 람다! “

” 하면 () => 뭐 이런식으로 사용하는….”

” 아무튼 콜백이 어쩌고 …. “

솔직히 잘 모르고 지금 껏 간혹 사용하고 있었다.

( 비쥬얼 스튜디오의 힘을 믿고 , 빨간 줄이 안나올 때까지 눈치껏 고쳐본다던가 ..)

문제는 C# 에서 제공하는 ( 처음에는 Unity 에서 제공하는 건 줄 알았다 . )

Action 타입을 인자로 제공할 때에 발생했다.

// 아래와 같은 함수가 있었는데 , 
void foo( Action action)
{
  DoSomething();
  action.Invoke();
} 

// 이 함수를 저 위의 action 에 대입하려고 했다
void Act(string nameOfWhatToDo)
{
  Human.Do(nameOfWhatToDo); // 별로 좋은 구조는 아니지만 ㅎㅎ.. 
}

// 이렇게 
//( 유니티 )
void Start()
{
  string strInputForAct = "공부";

  foo( Act ) ; // 만약 Act의 인자가 없었다면 이렇게 했겠지만.. 버젓이 있었다 ! 
  
  foo ( () => Act(strInputForAct));// 이리 저리 짜맞추어 본 결과는 이렇게 했다. 

  // 참고 
  foo( delegate(string str){ Act(str);}); // 나중에 검색해보니 , 원래는 이렇게 하는 것 같다 ( 무명 딜리게이트 )
}

퇴근하고 돌아와 더 찾아보니 ,

Unity 가 아니라 C# 에서 제공하는

Func 와 Action 이 있으며,

Func는 리턴 값을 가지고

Action 은 가지지 않는 다는 것을 빼면 둘의 용법은 같다.

Func <string ,int > 이면 인자가 string 이고 int 리턴값이라는 의미이므로 주의하자.