매개변수1 Articles

  1. 2007/01/04 Delegate를 함수의 매개변수로 넘기기

Thread thread2 = new Thread(ts2);
 



스레드클래스를 생성 시킬때 생성자에 ts2 라는 놈은 델리게이트이다. 그렇다면 매개변수로 델리게이트를 넘겨 받아 쓸수 있다는 소리 인데 한번 해보기로 했다.

소스


using System;
delegate void TestDelegate();
public class Temp
{
public void Test()
{
Console.WriteLine("테스트 함수");
}
public void ReceiveDele(TestDelegate ts)
{
Console.WriteLine("델리게이트 매개변수 받기");
}
}
public class TempApp
{
public static void Main()
{
Temp t = new Temp();
TestDelegate tdele = new TestDelegate(t.Test);
tdele();
t.ReceiveDele(tdele);
}
}
 


위와 같은 소스를 작성 하고 컴파일을 해보았다. 그런데 결과는??

Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

TestDele2.cs(11,14): error CS0051: 일관성 없는 액세스 가능성: 'TestDelegate' 매개 변수 형식이 'Temp.ReceiveDele(TestDelegate)' 메서드보다 액세스하기 어렵습니다.
TestDele2.cs(3,15): (이전 오류와 관련된 기호 위치)


위와 같았다. 이게 뭔소리여? 어째던 에러 보통의 방법으로는 안된다는 얘기이다. 음.. 그렇다면 단순한 나의 생각으로는 evet로 만들어서 넘겨 줘야 하나?? 다음과 같이 수정하였다.


public void ReceiveDele(event TestDelegate ts)
{
Console.WriteLine("델리게이트 매개변수 받기");
}
 


다음과 같이 수정을 하고 이번에 컴파일을 해봤다.

Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.42
for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

TestDele2.cs(11,26): error CS1031: 형식이 필요합니다.
TestDele2.cs(11,47): error CS1002: ;이 필요합니다.
TestDele2.cs(13,20): error CS1519: 클래스, 구조체 또는 인터페이스 멤버 선언에
       잘못된 '(' 토큰이 있습니다.
TestDele2.cs(15,1): error CS1022: 형식이나 네임스페이스 정의 또는 파일 끝(EOF)이
       필요합니다.


역시 이번에도 에러가 났다. 흠... 과연 할수 없는 것인가? 안쓰던 머리를 굴리기 시작 했다. 과연 어떤 방법으로 넘겨 줄 것인가? 분명 스레드 객체를 생성 할때 분명히 델리게이트 자체를 넘기는 것은 확실했다. 분명히 방법은 있다. 그렇지만 내가 못하는것 뿐. 그래서 한번 System.Threading 에 관한것을 MSDN에서 찾아 보았다. 그런데 그부분에 관해서는 나와 있지 않았다.

그런데 갑자기 불현듯 스쳐간 생각이 떠올랐다. 모든 변수나 객체들은 object형을 상속 받는다는 생각. 그렇다면 object형으로 넘겨 받으면 가능할지도 모른다는 생각 그래서 다음과 같이 소스를 수정하였다.


using System;
delegate void TestDelegate();
public class Temp
{
public void Test()
{
Console.WriteLine("테스트 함수");
}
public void ReceiveDele(object ts)
{
TestDelegate Receive = (TestDelegate) ts;
Console.WriteLine("델리게이트 매개변수 받기");
Receive();
}
}
public class TempApp
{
public static void Main()
{
Temp t = new Temp();
TestDelegate tdele = new TestDelegate(t.Test);
tdele();
t.ReceiveDele(tdele);
}
}
 


결과는

테스트 함수
델리게이트 매개변수 받기
테스트 함수


성공이였다. 처음으로 객체지향적으로 생각을 해보았다. ^^ 앞으로 머리 많이 굴려야 될거 같다.


div>