처음 배울때 델리게이트 이벤트 개념 진짜 헷갈리는데


이건 근본 원리를 몰라서 그런것임.

(너 무식하다고 욕하려는 게 아니라, 고급 언어들일수록 근본원리를 몰라도 쓸 수는 있게 해두었음.

그래서 문법만 보면 이게 무슨 흑마법이냐?? 하면서 어리둥절하면서 쓰게 되는 것. 나도 몇달 동안 못 썼음.)


"델리게이트는 함수(메서드) 포인터 다."


이걸 이해하려면 프로그램에서 메서드가 어디에 있는지 알아야 함.


'몬스터' 클래스가 있고, 이걸로 몬스터 2마리를 뽑아냈다고 하자.

이때 메모리에는 몬스터를 위한 메모리 2개가 할당된다.


monster 오크 = new Monster("orc");

monster 고블린 = new Monster("orc");


그런데 Monster 클래스에는 Attack() 메서드가 있음.


그래서 우리는 오크.Attack() 고블린.Attack() 을 할 수가 있는거지.


그렇다면, Attack 메서드는 메모리에 몇개나 있을까?


몬스터가 2마리니까 2개 있겠지?





보통 이렇게 생각할거야.






근데 저러면 health는 몬스터 마다 다른 값이 필요하니 별도의 메모리를 할당해주는게 맞지만


Attack()은 몬스터마다 Attack 내부가 똑같은데 왜 굳이 메모리를 낭비해야 하지?


그래서 객체지향에서 클래스의 메서드 타입 원형 객체 (type object) 에 1개만 존재한다.






그래서 오크가 공격하든, 고블린이 공격하든, 실제로는 같은 메모리에 있는 메서드 1개를 그때그때 불러서 쓰게 되는 것이다.

(메서드 고생한다...)


그렇다면 이 메서드를 오크나 고블린이 아니라도 불러 쓸 수 있지 않아? 어차피 1개만 존재한다며? 라는 의문이 생길텐데,


그걸 지시해주는게 static 임.


static 을 써줘서 메서드가 1개만 존재하게 되는게 아니라,


애초에 메서드는 1개 뿐이고, 그걸 '아무나' 불러 쓸 수 있게 하겠다고 명시하는 문법이 static 인 것임.


원래 메서드는 주소위치만 알면 그 누구나 (심지어 해당 프로그램 밖에서도) 불러 쓸 수 있는데,


이걸 해킹이라고 함.




(잠깐 잡설)


C처럼 메모리를 대놓고 갈구는 언어를 쓰면 아무놈의 아무 메소드나 마구 호출해서 쓸 수 있음.


근데 이렇게 하니 개발자들이 맨날 버그를 낸단 말야? 권한도 없는데 편하다고 마구 불러서 메소드 쓰니까


디버깅 시간이 엄청나고 출시해도 버그때문에 회사가 망할 위기에 처함.


그래서 똑똑한 개발자 들이 아 시발 앞으로는 권한을 줄테니 그 권한 안에 것만 쓰세요 좀!


이라고 해서 생긴게 '객체지향' 이다. 객체지향은(는) 더 낳다! 가 절대 아님.


객체지향은 원숭이 지능의 개발자놈들 (글쓴이도 포함됨)


에게 '밥먹을때 숟가락은 자기 걸 씁시다 제발!' 라는 식의 규칙들일 뿐이야.


그런 규칙을 '강제' 하는 것들이 객체지향 언어고


그 중 말이 존나 많은 잔소리꾼 아지매가 자바고


자바보다는 섹시하지만 여전히 독설을 내뱉는 여비서 (우흥) 가 c#이라고 보면 됨.


(잠깐 내가 지금 성차별적 단어를 썼나? 그럼 섹시한 남비서 라고 하지 뭐! 그것도 싫으면 섹시한 외계인쨩을 드리겠슴미다)





자 여기까지 이해 되었으면 델리게이트는 매우 쉽다.


메서드는 결국 메모리에 어딘가에 주소로 1개만 존재한다고 했으니


델리게이트는 그 주소를 적어놓은 포인터객체일 뿐임.


"델리게이트는 함수 포인터 다"


그래서 델리게이트를 (함수를 불러 쓸 수 있는 포인터) 를 다른 객체 (예를 들어 MosnterManager) 에게 줄 수 있겠지? (주소값만 알려주면 되잖아!)


그럼 그 객체가 해당 메서드를 '대신 실행시키는 것' 이 델리게이트의 활용이다. 이걸 '콜백함수' 라고도 함.


'내가 가진 메소드의 주소를 넘겨줄테니, 여차할때 니가 실행해. 실행 권한을 줄게!'


이게 델리게이트 이다. 끗!




Event, Action 은 델리게이트를 쓸때 매번 델리게이트 타입 선언해서 쓰기 귀찮으니까 C#이 지원해주는


이미 만들어져 있는 제네릭 델리게이트 임.




더 알고 싶으면 CLR Via C#을 보세오.


이런거 이해하려면 결국 메모리랑 cpu를 이해해야 하는데, 결국 C -> 어셈블리 로 공부해야 함.


ㅅㅂ 겜 만들기도 죽겠구먼 언제 공부혀?


http://www.yes24.com/Product/goods/15169403







- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -