처음 배울때 델리게이트 이벤트 개념 진짜 헷갈리는데
이건 근본 원리를 몰라서 그런것임.
(너 무식하다고 욕하려는 게 아니라, 고급 언어들일수록 근본원리를 몰라도 쓸 수는 있게 해두었음.
그래서 문법만 보면 이게 무슨 흑마법이냐?? 하면서 어리둥절하면서 쓰게 되는 것. 나도 몇달 동안 못 썼음.)
"델리게이트는 함수(메서드) 포인터 다."
이걸 이해하려면 프로그램에서 메서드가 어디에 있는지 알아야 함.
'몬스터' 클래스가 있고, 이걸로 몬스터 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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
C#추 - 관악구 서원동 거주 한솔근
ㅈㄴ 어렵누. 내가 모르는 함수가 요청이 오면 딜리게이트로 지정된 놈한테 떠넘기기 =딜리게이트
근데 delegate가 왜 델리게이트냐 knife는 크나이프냐?
겁나 쉽게 이해시키네 ㄷ
델리게이트 이제 안쓰고 Action(리턴 없는거)랑 Func(리턴하는거) 씀 - dc App
수정하려니 개념글가서 못 고치네. 박제됨 ㅅㅂ
이해하기 쉬웠음. 간만에 프갤에서 끝까지 읽은 정보글이다 - dc App
너무 쉽고 당연한 내용인데 이게 어려울 수도 있나보군
해당 댓글은 삭제되었습니다.
나처럼 c#이나 잡아로 독학으로 시작한 땔감들은 메모리 구조 모르고 들이대서 잘 모름. 이 글은 플갤 적으려고 쓴게 아니라 인디개발갤 (프로그래밍 독학으로 유니티부터 들이대는 인붕이들이 많음) 보라고 적은건데 땡겨온거
시발 이해했다 - dc App
낳다에서 걸렀다
c#이 낳냐 잡아가 낳냐?
걍 클로저 배열이자너
c로 입문시켜야
더 낳다 낫다로 수정좀.. 문과감수성 터지잖아 - dc App
박제되서 모탐
윈폼 하나 만들어 보는게 더 쉽게 이해되지 않냐
걸러야겠네. 객체지행에 캡슐레이션이랑 막 겹쳐서 해놨는데 디테일하게 지적하면 틀린내용. Private의 경우도 권한이 없음에도 불구하고 리플렉션을 이용해서 외부에서 콜이 가능. 델리게이트는 설명은 완벽한데, 이건 타 언어에서도 동일하게 적용되고 콜백과는 조금 다른 레이어임. Js에선 프로토타입이라 칭함.
중간에 괄호넣고 개소리 쓰는거, 타쿠오
ㄴㄷㅆ
학부 1학년때 이미 다 조질 수 있는 내용아니냐
귀여워 ㅋㅋㅋ
ㅇㅇ 걍 메서드 포인터 자작 이벤트 만들때 씀
디테일이 조금 생략됐네. 그냥 단순히 메써드 포인터가 아님. 클로저를 언급해야하는데 메쏘드 포인터 뿐만아니라 메써드가 정의될 당시의 environment 정보가 함께 저장되어야 함. 그래야지 외부 method의 변수에 접근하거나 외부 객체의 메쏘드를 호출하지
클로저 설명까지 들어가면 이해하기 어려워져서 살짝 돌려쳤음. 은 구라고 내 클로저를 잘 모름 ㅋ
플갤에 정보글 싸니까 내가 모르는 부분 싹 꺼내서 알려줘서 공부가 되네.
http://www.csharpstudy.com/DevNote/Article/26