본문 바로가기
Programing/C#

C# Delegate ≒ C 함수 포인터 ?!?

by june._.note 2017. 2. 1.

Delegate라는 개념은 C#을 하면서 처음 들어 봄.

 

C언어의 함수 포인터를 C#에서 구현한것이라고 생각하면 된다라는 설명을 들었음(정확한 설명인지는 잘 모르겠음),

 

C언어에서 배운 함수 포인터에 대해서 기억을 하지도 못하고 있었고, 사용 방법에 대해서도 기억을 못했기에

 

단박에 이해 할 수 없었지만 함수 포인터와 Delegate를 검색해보니 비슷한 개념인 것 같은 느낌이 든다.

 

 

- C 함수 포인터

 

C를 배울때 머릴 아프게 했던 포인터에 대한 개념을 알고 있어야 함(사실 지금도 안다고 자신할 수 없음...)

 

포인터는 특정 변수에 메모리주소를 담는것인데, 함수 포인터는 특정 함수에 대한 메모리 주소를 담는 것.

 

함수 포인터를 쓰는 이유는 아래 참조 사이트에 들어가면 더 자세한 설명이 있음(정리가 정말 잘 되어 있음).

 

우린 Delegate와 비교를 할거니까 함수포인터의 사용방법을 Delegate와 비교해서 이해해보려 함.

 

함수 포인터 선언 : int (*FuncPtr) (int, int)

 

위와 같은 형태의 함수 포인터가 선언이 되었다면 담을수 있는 함수는 반환형과 인자가 선언과 같은 int 형태인 함수만 담을 수 있음.

typedef를 이용하여 모양을 단순화시키는 작업을 하여 사용 할 수 있음

 

typedef int (*FuncPtr) (int, int)

 

FuncPtr testFP = add;

testFP(5, 10);

 

 

 

- C# Delegate

 

Delegate를 검색하면 항상 나오는 말이 'Delegate는 대리자입니다.'임. 대리자라는 설명도 대신 해준다는 의미는 알겠지만,

 

언제 왜 사용하는지에 대해서는 이해하지 못했는데 내가 들은 Delegate에 대한 설명이 (내가 정확히 이해하고 있는 내용이 아니라

 

올바른 설명인지 모르겠지만) 가장 이해가 쉬웠던것 같음.

 

"교실이 하나 있는데 교실에는 학생들이랑 학생들의 점수를 매기는 선생님이 있음. 학생의 점수는 선생님밖에 매길 수 없고,

독립된 공간임. 그런데 외부에서 어떤 사람이 A라는 학생의 점수를 100점으로 만들고 싶음.

점수를 주는 사람은 선생님이니까 외부의 사람은 마음대로 A라는 학생에게 100점으로 줄수도 없고

교실은 독립된 공간이기 때문에 선생님을 만날 방법도 없음. 그런데 선생님이 자신한테 연락 할 수 있는 방법을 공개함.

연락 방법은 전화 통화일수도, 편지 일수도, E-Mail일수도, 게시판 등등등... 다양한 방법으로 선생님이 공개함.

A라는 학생의 점수를 100점으로 만들고 싶은 사람은 선생님이 공개한 방법을 통해 선생님한테 A학생의 점수를 100점으로

올려달라고 요청하고, 선생님은 그 연락을 받고 A학생의 점수를 외부 사람이 요청한 대로 점수를 줌."

 

뜬근없이 A가 100점이 되는 점은 부조리한 것이지만, 위의 내용에서 선생님이 '자신한테 연락 할 수 있는 방법을 공개하는 것'이

 

Delegate 선언임. Delegate 선언시 설정하는 반환 형 및 매개변수는 연락할 수 있는 여러가지 방법(편지, 전화 등..)을 정하는 것.

 

솔직히 이해가 될 것 같으면서도 안되고, 위의 설명이 전체적인 역할에 대한 설명보단 접근할 수 없는 메소드를

 

Delegate를 이용해서 해결 할 수 있다라는 부분적인 내용일지도 모르지만, 일단 이렇게 조금씩 이해하는걸로...

 

 

Delegate의 선언과 사용을 보자면 아래와 같은데 위에 C의 함수 포인터의 사용과 매우 흡사하다는 것을 확인 할 수 있다.

 

Delegate 선언 : Delegate int delegateMethod (int a, int b);

 

   delegateMethod testDM = add;

   testDM(5, 10);

 

 ** Delegate와 C함수 포인터에 대한 아래 참조 사이트에서 예제 코드가 비슷한 내용이라서 두개를 비교하면서 이해하기 좋은것 같음.

 ** 계속 공부하면서 수정차고 채워나가야할 내용.

 

참조 :    http://mrw0119.tistory.com/19 (Delegate)

http://blog.eairship.kr/151 (C# Delegate와 이벤트)

      http://norux.me/8 (C 함수 포인터)

 

 

 

'Programing > C#' 카테고리의 다른 글

[MERGE INTO]데이터가 없으면 INSERT, 있으면 UPDATE  (0) 2017.02.06
C#의 XML 파일 생성, 사용  (0) 2017.02.03
DataGridView에 Filter 생성하기  (0) 2017.01.31
get{}set{} 사용  (0) 2017.01.24
AS를 이용한 안전한 캐스팅  (0) 2017.01.20