Microsoft MVP성태의 닷넷 이야기
교재 194페이지 콜백메서드 질문 있습니다! [링크 복사], [링크+제목 복사],
조회: 13645
글쓴 사람
한예지 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]

... 61  62  63  64  65  66  67  68  [69]  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
852임동찬1/6/201015408base.OnStart(agrs) [1]
851한귀순1/6/201020882oracle & transaction 질문 [5]
850박한주12/31/200917979COM과 C#간 권한 문제에 관해 여쭤봅니다. [5]
848날쌘돌이12/22/200918926C#으로 개발하는 ActiveX 디버깅 문제 [5]
847최승문12/16/200917779winform에서 웹서비스를 이용할때, 객체가 전송안되는 문제... [2]
846이강구12/14/200916734ATL COM 제작 문의 [3]
845김재영12/9/200919588ClickOnce에서 WinForm을 배포시 변동되는 Args값을 넘길 수 있나요? [3]파일 다운로드1
843김재영12/2/200917116Hyper-V 사용에 대해여 질문이 있습니다. [2]
842한귀순12/1/200919937Attempted to read or write protected memory [2]
841장근배11/30/200921540첨부 파일 Download시 한글 Name [2]
844장근배12/3/200916105    답변글 [답변]: 첨부 파일 Download시 한글 Name파일 다운로드1
840박영민11/20/200915866웹 애플리케이션 질문입니다. [1]
837left...10/21/200916770아래 게시글 관련하여 추가 질문 [3]
836left...10/19/200917802ActiveX 상에서 암시적 dll 로드 [1]
832김우진10/15/200914478C# 에서 swa + security 구현 방법이 없을까요?
833정성태10/15/200918544    답변글 [답변]: C#에서 swa + security 구현 방법이 없을까요? [1]
834김우진10/15/200914583        답변글 예제 메시지 올려드릴께요. [2]파일 다운로드1
838이영우10/30/200914507            답변글 국세청 전자세금계선서에 관하여 문의드립니다.
831채승수10/13/200916792스마트 클라이언트 GAC 등록 문제 여쭤봅니다... [2]
829박찬용10/9/200929282WebBrowser 컨트롤 사용시 새창을 띄울시 세션/쿠키 공유가 왜 안될까요?? [1]파일 다운로드1
827송창훈9/24/200914322[질문]CAS 설정
828정성태9/28/200917666    답변글 [답변]: [질문]CAS 설정 [1]
825김재영9/18/200915190프레임워크별 비트 지원에 대해서 문의를 드립니다. [2]
821채승수8/27/200914649클릭원스를 비스타에서 실행시 [1]
822채승수8/28/200919520    답변글 [답변]: 클릭원스를 비스타에서 실행시 [2]
818개발돌이8/14/200917197ActiveX개발한 dll을 임베디드 할때 UI에 대한 질문 [1]파일 다운로드1
... 61  62  63  64  65  66  67  68  [69]  70  71  72  73  74  75  ...