Microsoft MVP성태의 닷넷 이야기
교재 194페이지 콜백메서드 질문 있습니다! [링크 복사], [링크+제목 복사]
조회: 6222
글쓴 사람
한예지 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)
5099WPF12/12/201810139안녕하세요. WPF에서 UWP Control을 참조하려고 합니다. [3]파일 다운로드1
5097sdh12/10/201811249[c#] 라이선스 파일 만들기 질문 드립니다. [3]
5096거북이12/3/20187024프로젝트 구성을 참고할 만한 자료가 있을까요? [1]
5095한대현11/21/20187712안녕하세요 c# 설치 파일 빌드중 오류가 생겨서 문의 드려요 [1]파일 다운로드2
5094하주형11/20/20187370안녕하세요 C# using 예약어관련 질문드립니다. [1]
5093Medi...11/19/201810787안녕하세요. wpf Mediaelement 질문 있습니다. [3]
5092하주형11/17/20187354안녕하세요 c# 7.1책 스택관련 질문드립니다. [2]
5091아짱11/15/20188323UWP 개발중 질문이 있습니다. [3]
5090황윤하11/15/201812039c# Socket Server에 접근할 수 있는 client 개수 제한 [5]
5089문성운11/14/20189728uwp에서 TcpListener를 사용할 수 없나요? [5]
5088안중언11/10/20187400TCP 소켓 [1]파일 다운로드1
5084김광흠11/9/20189095사운드 파일 "filename.wav" 와 같은 특정 파일이 실행되는것을 감시하고 싶습니다. [3]
5083거북이11/4/20189446타입의 범위를 넘어서는 연산의 개념을 모르겠습니다. [4]
5082꾸엉11/1/20187499BCL 타입을 모아둔 곳이 있나요? [2]
5081꾸엉10/31/20187626C# 7.1 235p 질문입니다. [3]
5080WPF초보10/30/20189161[WPF] IsManipulationEnabled속성 설정시 Click이벤트 문의 [1]
5079jhp10/30/20188811이 소스에 API후킹 소스를 추가하고 싶은데 어떻게 해야될지 모르겠어요. [4]
5078꾸엉10/29/20187124C# 7.1 185~187p 질문입니다. [2]
5077윤현수10/29/201813537setup파일 설치 이후 실행이 안되는 현상 [11]
5074진우10/28/20187212C# 생성과 동시에 초기화 하는 코드 문의 [2]
5073돌고래10/27/20187301c# 공부 방향 질문 드립니다. [3]
5072엔벌잉10/24/20187827C# textbox, button질문입니다! [4]파일 다운로드1
5071엔벌잉10/23/20188218C#윈도우폼 질문입니다!! [2]
5070진우10/17/20188204Visual Studio 서비스팩과 업데이트 차이 문의 [2]
5069감자10/12/20188885빌드 구성을 재설정하는 방법이 있을까요? [1]파일 다운로드1
5068누오10/10/20187653ASP Core 2.0 에서 dll안에 있는 뷰 읽어들이는 방법? [1]
... [31]  32  33  34  35  36  37  38  39  40  41  42  43  44  45  ...