무효 클릭 IP 추적 중...
c#

[c#] Action, Func, Predicate 개념/ 차이

꼬예 2022. 6. 16.

 

 

c# 에서는 함수를 그냥 변수에 담으려고하면 에러가 발생합니다. 

 

변수에 함수담기

 

이를 가능하게 해주는것이 델리게이트(delegate)입니다. 

(델리게이트를 모르시는 분은 해당 포스팅을 참조바랍니다.)

 

 

이 글을 읽기 전 선수 지식 포스팅

 

 

간단하게 복습을 해보자면,

 

아래 그림과 같이 델리게이트를 선언한 후, 이 델리게이트로 선언한 변수에 우리가 담고 싶은 함수를 담습니다.

 

델리게이트선언

 

그리고 최종적으로 아래 빨간 사각형 처럼 2가지 방법으로 해당 함수를 실행 시키면 끝입니다!

 

델리게이트 실행 방법

 

그런데 여기서 뭔가 불편한걸 못 느끼셨나요?

 

"아니 무슨 함수를 변수에 할당하는데 델리게이트까지 선언해야하지?" 라는 생각이 드실겁니다.

 

맞습니다. 이러한 문제를 해결하기 위해 등장한것이 오늘의 주제인 Action, Func, Predicate입니다. 

 

이들도 모두 델리게이트입니다.

하지만 위 예시처럼 명시적으로 델리게이트를 선언할 필요 없이 델리게이트의 장점을 누릴 수 있는거죠.

 

다만 각각의 특징과 역할이 조금 다른데요. 하나씩 알아보도록 하겠습니다. 

 

1. Action 

개념을 설명하기 앞서 기존 델리게이트 방식과 외적으로 어떤 차이가 있는지 보겠습니다.

 

Action 과 기존 델리게이트 비교

 

앞서 말씀 드린대로 델리게이트 선언 없이 간결한 코드 작성이 가능합니다.

 

Action 이라는 델리게이트는 리턴 값이 없을 때만 사용 가능합니다. 

우리 예시에서도 리턴값 없이 출력만 하는 함수죠?

 

간혹 Action 델리게이트는 "매개변수가 없는 형태에만 사용가능하다" 라고 착각 하시는 분들도 계신데요.

 

매개변수를 받을 수도 있습니다. 다만 Action옆  <>꺽새 안에 매개변수 타입을 적어줘야합니다.

 

아래 예시처럼 string값을 인자로 받고자한다면 <>안에 string을 적어줍니다.

 

Action 매개변수 타입 지정

 

정말 리턴값을 못받는지도 확인해볼까요?

Console.WriteLine()을 지우고 값을 리턴하는 형태로 코드를 수정해보겠습니다.

 

Action 리턴 반환시 오류

 

당연히 에러가 발생합니다. 앞서 말씀드렸듯이 Action은 리턴하는 형태의 함수를 받을 수 없습니다.

 

그렇다면 리턴을 반환하는 함수를 사용하려면 어떻게 해야할까요?

 

그때 사용하는 것이 Func입니다.

 

2. Func

 

 

Func는 특이하게 <>(꺽새)안에 두개의 값이 들어갑니다.

첫번째 위치한 값은 매개변수에 지정할 타입을 의미하고, 두번째반환하는 값의 타입입니다.

 

그럼 두개만 넣을 수 있을까요? 

3개, 4개 그 이상도 가능합니다.

 

만약 아래와같이 3개의 값을 받는다면, 앞에 두개매개변수의 타입을 의미합니다.

 

 

그리고 마지막(3번째 위치)에는 리턴 값 타입을 의미합니다.

 

 

3. Predicate

마지막으로 Predicate 델리게이트는 앞서 다룬 Func와 다르게 리턴값으로 무조건 Boolean형태를 받습니다. 

 

리턴 타입은 정해졌으니까 굳이 명시할 필요 없습니다. 즉 매개변수 타입 1개만 명시해주면 되는데요.

 

아래 예시는 int형태의 매개변수를 받고 최종 리턴값이 Boolean인 값을 Predicate 델리게이트에 담은 것입니다.

 

 

4. 매개변수에 사용 되는 예시

우리가 앞서 배웠던 델리게이트들은 사실 함수의 매개변수 형태로 사용되는 경우가 많습니다.

그러한 형태에 익숙해져 보는 시간을 갖도록 하겠습니다.

 

1)  Action 델리게이트 사용예

첫번째 인자로 Action 델리게이트를 받고, 그 델리게이트를 실행하는 형태의 함수를 정의합니다.

 

 

실행할때는 HelloFunc 함수 인자로 Lambda 함수를 넣습니다.

 

 

조금 복잡해 보이지만, 우리가 앞서 배운 아래 코드와 전혀 다를게 없습니다.

 

 

2) Func 델리게이트 사용예

이어서 Func델리게이트를 사용하는 예입니다. 

 

Func 델리게이트

 

각 사각형의 색깔을보고 매치시켜 보시면 크게 어렵지 않으실겁니다. 

 

이 함수 또한 아래 Func 델리게이트와 같지만 형태만 조금 다른 것입니다.

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글