본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티42_C#_27_더 편리한 델리게이트를 위한 기능들

지금까지 델리게이트 선언과 사용법에 대해 알아보았다.

여기서는 델리게이트를 더 편리하게 사용하기 위해 여러 가지 유용한 기능들을 배워보자.

 

그 기능들은 다음과 같은 것들이 있다.

 

  • Anonymous method (익명 메서드 또는 이름없는 메서드)
  • Lambda expression (람다 표현 또는 람다식)
  • Action 과 Func

Anomymous method (익명 메서드)

 

익명메서드는 이름이 없고 메서드의 body(몸체, 내용)만 있는 메서드를 말한다.

이 익명 메서드를 델리게이트에 사용할 수 있다

 

익명 메서드를 사용하는 것은 델리게이트에 미리 정의된 메서드를 저장하는 것이 아니라 '이름없는'메서드를 만들어서 전달하는 것이다.

 

메서드명 대신 다음과 같이 delegate 키워드와 함께 익명 메서드의 형태를 넣으면 된다.

 

미리 정의된 메서드를 전달하는 델리게이트의 예는 다음과 같다.

 

10번 줄에서 반환값을 출력하기 위해 Debug.Log( )에 인수를 전달한 test델리게이트를 넣었다.

 

이것을 익명메서드를 사용하여 표현하면 다음과 같다.

 

 

위와 같이 메서드를 따로 정의하지 않고 delegate키워드를 사용해서 매개변수와 매서드 내용을 적어주면 된다.

이 형태는 delegate; 로 델리게이트 선언을 바로 하고 그 안에 익명 메서드를 적어준 것이다.

 

Lambda expression (람다식)

 

익명 메서드 표현도 귀찮다면 더 간단한 람다식으로 표현하면 된다.

람다식은 익명메서드를 더 간단하게 나타내려고 만든 방법이다.

람다식으로 이름 붙인 이유는 여기에 사용하는 특수 기호(=>)가 람다 대수에서 사용하는 것과 비슷해서 붙여졌다.

참고로 코틀린 언어에서는 람다 기호를 -> 로 나타냈었다.

 

람다식으로 표현하면 다음과 같다.

 

람다식으로 표현하면 delegate키워드, 매개변수 타입을 생략한다.

이렇게 생략 가능한 이유는 컴파일러(compiler ; 코드 번역기)가 타입을 자동으로 추론하기 때문이다.

 

본문에 해당하는 중괄호{ }는 람다 연산자(=>)로 대체한다.

 

또한 delegate; 선언과 값을 반환하는 반환문이 하나만 있을 경우는 return도 생략할 수 있다.

남는 것은 매개변수명과 실제 내용(식) 뿐이다.

 

참고로 매개변수가 1개라면 괄호도 생략할 수 있다.

 

Action 과 Func

Action과 Func는 델리게이트에 메서드를 담아서 전달하는 또 다른 간단한 방법이다.

 

익명메서드와 람다식은 메서드를 정의하는 과정을 생략했다.

이제 남은 것은 델리게이트 정의하는 것을 없애는 것이다.

이것을 위해 Action 델리게이트와 Func 델리게이트를 만들었다.

 

Action과 Func는 미리 정의된 델리게이트 타입이다.

그러므로 델리게이트를 정의하지 않고 바로 델리게이트 변수를 만들 수 있다.

이 델리게이트들은 네임스페이스 System 안에 정의되어 있다.

 

반환값이 없는 델리게이트에 사용하기 위해 Action을 만들었다.

예를 들면 delegate void testDelegate( )

 

반환값이 있는 델리게이트에 사용하기 위해서는 Func을 만들어 두었다.

예를 들면 delegate int testDelegate( )

 

 

Action 델리게이트

델리게이트에서 작성했던 반환값이 없는 메서드를 Action델리게이트로 표현해보자.

 

위 코드는 반환값이 없는 void 타입의 메서드이므로 Action델리게이트로 표현할 수 있다.

 

2번 줄에 Action델리게이트를 사용하기 위해서 네임스페이스 System을 사용해야 한다.

반환값 없는 메서드에 대하여 Action델리게이트를 미리 정의해 두었기 때문에 6번 줄 코드는 필요없어서 주석으로 처리했다.

10번 줄에서 Action과 액션의 이름(testAction)만 적으면 델리게이트 변수가 만들어진다.

 

반환값 없는 메서드인데 인수를 전달해야 하는 즉, 매개변수를 가진 메서드는 다음과 같이 매개변수 타입을 제네릭(generic)에 넣어서 표시하면 된다.

 

Func 델리게이트

 

익명 메서드에서 작성했던 반환값이 있는 메서드를 Func 델리게이트로 표현해보자.

 

위 코드는 반환문(return)이 있고 반환 타입은 string 타입의 메서드이므로 Func델리게이트로 표현할 수 있다.

15번 줄에서 $"결과값 : {x + y}"는 다음과 같이 표현해도 된다.

 

위 코드를 Func델리게이트를 이용하여 표현해보자.

 

 

Func의 경우 인수 타입과 반환 타입 모두 제네릭으로 표시해야 하기 때문에 순서에 맞게 적는 것이 중요하다.

<인수 타입1, 인수 타입2, 반환타입> 처럼 마지막에 반환타입을 적어야 한다. 

 

 

람다식으로 표현하기

 

위에서 작성한 Action, Func 델리게이트 예제는 람다식으로 표현하면 더 간단하게 표현할 수 있다.

 

7, 12번 줄처럼 Action, Func 모두 딱 1줄 코드로 구현하게 되었다.

 

참고로 Func에서 return 문 내용을 위와 같이 표현하지 않고 "결과값 : " + (x + y); 로 적었다면 x+y 값이 int 타입이므로 아래와 같이 string으로 캐스팅해줘야 한다.

 

 

끝.

Wraven...