Microsoft MVP성태의 닷넷 이야기
교재 194페이지 콜백메서드 질문 있습니다! [링크 복사], [링크+제목 복사],
조회: 13648
글쓴 사람
한예지 donator
홈페이지
첨부 파일
 

선생님 안녕하세요!
교재 194 페이지에 다음과 같은 문장이 있습니다.
"타입 자체를 전달해서 실수를 유발할 여지를 남기기보다는 메서드에 대한 델리게이트만 전달해서
이 문제를 해결할 수 있다."

타입 자체를 전달해서 실수를 유발한다는 것이 어떤 경우인지 이해가 되지 않습니다..

그림 4.12와 예제 4.21을 비교해도
target.Do(this) ← 그림 4.12
target.Do(new GetResultDelegate(this.GetResult)) ← 예제 4.21

인수로 넘기는 코드량도 그렇고 전체 코드 길이도 예제 4.21이 더 복잡해보입니다.
타입 자체가 Target 클래스의 Do 함수에 Source만 적으면 되는데
이것이 실수를 유발할 일이 있나요??...
예제 4.21를 통해 델리게이트를 사용해야 될 장점을 잘 모르겠습니다...








[최초 등록일: ]
[최종 수정일: 1/16/2021]


비밀번호

댓글 작성자
 



2021-01-16 11시44분
콜백을 호출하기 위해 필요한 것은 메서드에 대한 정보일 뿐인데, 타입의 인스턴스를 전달하면 지정된 메서드 이외의 접근도 할 수 있습니다. 따라서 콜백보다는 부수 효과가 발생할 여지가 있습니다. 게다가 타입 정보를 전달해야 하면, target.Do 메서드를 라이브러리화하는 것도 쉽지 않습니다.

일단, 타이핑의 복잡성 문제는 전에 질문했던 https://www.sysnet.pe.kr/3/0/5450 글에 따라 다음과 같이 줄이는 것도 가능합니다.

target.Do(this.GetResult);

하지만, 개발자 본인이 원한다면 그냥 타입을 넘기도록 target.Do 메서드를 작성해도 무방합니다.
정성태
2021-01-16 03시58분
[예지] 답변 감사드립니다! 즐거운 주말 되세요~!!
[guest]
2021-07-01 10시54분
[한예지] 선생님 안녕하세요!
예전에 답변해 주신 것들 중에 몇 개는 완전히 이해할 수 있는 실력이 되지 않아서 넘어갔는데
지금은 소화할 수 있을 것 같아서 다시 되돌아보고 있습니다.

[상황 1] 말씀하신 대로 델리게이트를 매개변수로 넘기면 쉽게 dll 파일을 만들 수 있습니다.
namespace Sample
{
    public delegate int GetResultDelegate();
    public class Target
    {
        public void Do(GetResultDelegate getResult)
        {
            Console.WriteLine(getResult());
        }
    }
}

[상황 2] 타입 정보를 전달해야 하면 ★★★ 부분에 있는 Source에 빨간 밑줄이 뜹니다.
namespace Example
{
    class Target
    {
        public void Do(Source obj) // ★★★
        {
            Console.WriteLine(obj.GetResult());
        }
    }
}

[질문 1]
그렇다면 타입 정보(Source)를 매개변수로 넘기면 Target 클래스 안에
또 Source 클래스를 정의해야 되는 문제가 발생하기 떄문에
target.Do 메서드를 라이브러리화하는 것이 쉽지 않다고 말씀하신 것이 맞나요?

[질문 2]
타입 정보를 매개변수로 넘기는 경우에 Target 클래스 안에 Source 클래스를 정의하지 않고
target.Do 메서드를 dll 파일로 만드는 방법이 있을까요?
쉽지 않다고 말씀하신 것을 통해 유추해보면 선생님은 다른 방법이 있을 것 같아서 질문드립니다.
[guest]
2021-07-01 11시15분
답변1) 넵, 맞습니다. Target을 정의한 라이브러리(DLL)에서 "Source"라는 타입을 정의해 버리면 반드시 그 타입만 갖는 인스턴스만 매개변수로 받아야 하기 때문에 여타 인스턴스를 넘길 수 없는 문제가 발생합니다. 즉, 공통 처리를 하는 코드 라이브러리를 개발하는 것이 현실적으로 막히는 것입니다.

가령 비슷한 예로, Array.Sort의 경우,

Sort(Array, IComparer)
; https://docs.microsoft.com/en-us/dotnet/api/system.array.sort?view=net-5.0#System_Array_Sort_System_Array_System_Collections_IComparer_

(델리게이트는 아니지만) 비교 코드를 IComparer 인터페이스로 받고 있는데요, 그 때문에 라이브러리화가 가능한 것입니다. 만약 저 비교 코드를 UserInfo라는 타입으로 받았다면 Sort 메서드는 재사용할 수 있는 코드가 될 수 없었을 것입니다.

답변2) 억지로라면 object 타입으로 받아 리플렉션 호출을 하거나 dynamic의 힘을 빌어 동적 호출을 할 수는 있을 것입니다. 하지만, 이런 유의 방식보다는 위에서 든 Array.Sort처럼 보통은 interface를 이용하는 것이 가장 정석입니다.
정성태
2021-07-01 12시01분
[한예지] 쉬운 설명 감사드립니다~
[guest]

... 76  77  78  79  80  81  82  83  84  85  86  [87]  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
297정성태1/4/200611856    답변글 [답변]: 스마트클라이언트에서 COM+를 이용한 데이터 가져 오기.. [2]
295이경호12/22/200510192스마트 클라이언트 관련 고견을 듣고자 합니다. [1]
294김성국12/21/200512074^^ 오늘 첨 방문했습니다. [2]
292궁금해요12/16/200511174c#으로 개발된 ie 임베디드 smart client를 php페이지에서 사용이 가능한가요?
293정성태12/21/200511823    답변글 [답변]: c#으로 개발된 ie 임베디드 smart client를 php페이지에서 사용이 가능한가요?
290이종은12/16/200518664개체가 이 속성 또는 메서드를 지원하지 않습니다. [3]
289이진우12/14/200512449스마트 클라이언트 개념.. [1]
288박찬용12/13/200511516질문 한개만 할께요.. 아시면 꼭 답변 부탁드려요 [1]
287꼬마마법...12/13/200512181안녕하세요..죄송합니다. 다시 한번 봐주시면.. 감사 드리겠습니다. [2]
286정준명12/12/200511962윈폼 관리(?)에 대한 고민. [1]
285꼬마마법사12/10/200510527안녕하세요.. [1]
284코디12/8/200510821[질문] 스마트클라이언트 다운로드중에...... [1]
283foot...12/7/200510300스마트 클라이언트 질문 입니다. ㅜㅜ [2]
279박상규12/6/200511067스마트 클라이언트에 관해 질문좀 드릴께요..
280정성태12/6/200510908    답변글 [답변]: 스마트 클라이언트에 관해 질문좀 드릴께요..
281박상규12/7/200512130        답변글 [답변]: [답변]: 스마트 클라이언트에 관해 질문좀 드릴께요.. [2]
282정성태12/7/200510731            답변글 [답변]: [답변]: [답변]: 스마트 클라이언트에 관해 질문좀 드릴께요..
276하수12/2/200510496스마트 클라이언트 프로그램을 만들려면.. [1]
271정준명11/20/200512547스마트클라이언트 구현에 대해서 조언을 듣고자 합니다. [5]
269상수11/18/200510822vs2005를 사용하고 있습니다. [1]
270상수11/18/200510250    답변글 [답변]: vs2005를 사용하고 있습니다. [1]파일 다운로드1
272상수11/21/20059741        답변글 [답변]: [답변]: ㅈㅅ여.. 인터넷이 사용이 안돼서리..dll을 치면 나타나는 현상 [1]
268상수11/17/20059936vs2005를 사용하고 있는데.. [1]
26711/16/200511352COM+ 의 활성화 상태... [1]
273정성태11/24/200510380    답변글 [답변]: COM+ 의 활성화 상태...
27411/25/200510321        답변글 답변 감사드립니다.
... 76  77  78  79  80  81  82  83  84  85  86  [87]  88  89  90  ...