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

... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
1336이소정10/27/201416585filestream seek에 대해 질문있습니다. [1]
1337이소정10/28/201416894    답변글 [답변]: filestream seek에 대해 질문있습니다.파일 다운로드1
1339이소정10/28/201419851        답변글 [답변]: [답변]: filestream seek에 대해 질문있습니다. [2]파일 다운로드2
1335황지혜10/24/201420633psexec 관련 질문드립니다. [1]
1334dell10/24/201416645여기가 있는줄 모르고 방명록에 남겼네요 ㅠㅠ 방명록 한번만 봐주시면 안될지요? [1]
1333왕초보10/24/201417013Bitmap 질문 [5]
1332김동진10/16/201423734clickonce 와 smartscreen filter 기능에 대해서 [2]
1331궁굼합니다10/8/201417219loopback adapter 자동 설치가 가능 한가요? [2]
1330이현중10/8/201419853파일 다운로드 방법 문의 [2]파일 다운로드1
1329popo10/2/201417237싱글톤과 싱글톤 소멸자에 대해 궁금점이 있습니다. [1]
1328달쏭9/25/201418254WCF Service측에서 parameter 값이 null이 오는 이유를 알고 싶어요. [2]
1326궁굼합니다9/19/201417439VB의 Shell 기능과 완벽히 똑같은 기능의 함수 [4]
1325지현태9/18/201417201WPF 의존속성과 바인딩에 대한 질문입니다.. [1]파일 다운로드1
1324popo9/17/201416379wcf 질문 드립니다. [1]
1323Anon...9/17/201418757인스턴스와 객체의 차이 [1]
1322김영대9/16/201418690죄송하지만 .NET 관련 질문게시판이지만 혹시 ASP.NET MVC에 대해서 질문 드려도 됩니까 (__);; [2]
1321부탁드립...9/15/201420586윈도우 어플리케이션 개발 방법(?) 에대해(직접적인 코드라기보단 프로젝트 방향??) [14]
1320소켓서버...9/13/201420995서로다른 포트번호로 로컬 Socket 서버를 개설시 Close 문제 입니다. [2]
1319ㅇㅇ9/12/201421759134쪽 예제 오타 [3]
1318블루투쓰9/12/201417313page 184 질문드립니다. [1]
1316서동원8/21/201423389ActiveX 개체가 이 속성 또는 메서드를 지원하지 않습니다. [1]
1313양해진8/20/201415761메시지창에 대해서요 [1]
1312김영대8/18/201417981안녕하십니까 정성태님 죄송하지만 C#.NET의 FileInfo 클래스의 CopyTo 메서드 질문드립니다. [3]
1311김솔8/18/201418783nsis파일 수정중에요! [2]
1310조정용8/17/201420030WCF 프로그램에서 Task를 이용한 백그라운드 작업 시 클라이언트에 대한 병목현상. [4]파일 다운로드1
1309서동원8/12/201418106안녕하세요. embeded dll과 관련하여 질문드립니다. [4]
... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...