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

... 31  32  33  34  35  36  37  38  39  40  [41]  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
4829윤현수4/26/201714779System.Text.Encoding 질문 [1]
4828jaem...4/20/201711050시스템 종료시 block 함수 xp 지원가능한 방법 질문 [2]
4827ds4/13/201713004매서드 정의로 이동시 [메타데이터에서]에서 라고 나오는 것은 뭔가요? [1]
4826김솔지4/11/201710261CxImage 문자 출력 [1]
4825플메4/10/201710665덱스트 업로드 하는데 구성요소 서비스에 엑셀이 안뜨네요..ㅜㅜ [1]파일 다운로드1
4824김상경4/9/201710029win7에서 vb6.0을 이용해서 프로그램을 만들었습니다.(제가 만든건 아니고 옆 동료가 만들었습니다.) [1]파일 다운로드1
4823조상현3/28/201711039windows event log 에 대한 정보는 어디서 얻을 수 있을까요? [1]
4822부우3/24/201712695글수정이 안되어 다시올려드립니다ㅠ [12]파일 다운로드2
4821부우3/22/201726332파일이나 어셈블리 중 하나를 로드에러 좀 봐주세요 [9]파일 다운로드1
4820듀이3/20/201711073오차 없이 동시에 명령을 보내게 가능한가요? [2]파일 다운로드1
4819popo3/20/201712368C# sslstream 사용시 Cipher List 설정 [3]
4818부우3/16/201721291DllImport 사용시 진입점을 찾을수 없습니다 [2]
4817yun3/15/201710592서피스프로4의 HYPER-V로 윈도우7을 깔았는데... [1]
4816부우3/15/201713317C++ DLL함수 사용 질문드립니다 [10]
4815김지용3/14/20179381.net core linux 오류 [2]
4814김솔지3/13/201710456인쇄 시 , 출력화면을 이미지 파일로 저장하고 싶습니다. [1]파일 다운로드1
4813spow...3/8/201712005멀티 스레드 환경에서 처리하여야 할 목록을 효율적으로 사용하는 기법 질문 드립니다 [2]
4812popo2/23/201712078.NET Window ClassName 변경 질문 드립니다. [1]
4809힘찬도약2/15/201715145C# 가상 시리얼 [4]
4808이길용2/9/201713857WCF 외부 접속 관련해서 질문드립니다ㅠ [1]
4807헬조선식...2/8/201720492WPF의 속도에 대해서 궁금합니다. [3]
4803헬조선식...2/7/201713886WPF로 메신져 메세지 박스 구현 문의 [2]
4802spow...2/6/201710935특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은? [7]
4804spow...2/7/201710798    답변글 [답변]: 특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은?
4805spow...2/7/201710487    답변글 [답변]: 특정 범위의 값을 다른 값으로 치환하는 메소드를 만들어야 할 때 가장 빠른 방법은? (글삭제가 안돼 재첨부합니다)파일 다운로드1
4801spow...2/3/201710359C#의 참조 동작관련하여 아이디어 문의 드립니다 [4]
... 31  32  33  34  35  36  37  38  39  40  [41]  42  43  44  45  ...