2013. 7. 4. 18:03ㆍJava
A. Delegate : 대리, 위임, 할당 이라는 뜻을 가지고 있는 명사
A. 메서드의 실행을 대행하는 역할
B. 위임 객체 : 클래스와 마찬가지로 선언 후 객체 생성을 통해 사용
C. 위임의 형식은 호출할 메서드의 형식과 동일하게 선언
D. 객체 메서드 or 정적 메서드 모두 가능
E. C언어의 함수 포인터와 비슷
B. 위임 선언
A. Public delegate 반환형 위임명(인자 리스트);
B. 위의 위임 객체는 동일한 형식의 메서드를 대신 호출 한다.
C. public delegate void SampleDelegate(int a);
i. public static void M1(int a); // 해당 메서드는 호출 가능
ii. public void M2(int a); // 해당 메서드도 호출 가능
iii. public int M3(int a); // 불가 반환타입이 다름.
iv. Public void M4(int a, int b); //불가 인자 개수 다름
v. Public void M5(string a); //불가 인자 타입 다름.
C. 예제
public delegate void Sample(int a); //델리게이트 선언
class TestDelegate
{
static void Main(string[] args)
{
Test t = new Test(10);
// +5 plus() 객체 메서드 호출
t.plus(5);
Console.WriteLine(t.N); //value = 15
//델리게이트 객체 생성, 메서드 이름을 인자 값으로 넣는다.
Sample s = new Sample(t.plus);
// 델리 게이트 호출(대리 실행
s(5);
Console.WriteLine(t.N); //value = 20
Sample s2 = new Sample(t.minus);
s2(10);
Console.WriteLine(t.N); //value = 10
Test.hello(100);
Sample s3 = new Sample(Test.hello);
s3(200);
}
// Part 2 (위임 연산 (delete + delete)
static void Main(string[] args)
{
Test t = new Test(10);
Sample s = new Sample(t.plus);
s(10); // 10 à 20;
//위임 연산(delete + delete);
Sample s2 = new Sample(t.Minus);
s2(5); //20 à 15
Sample s3 = s + s2;
s3(10); // 15 à 15
// 1. 기존에 위임객체에 메서드를 추가하려면,
s3 += new Sample(Test.Hello);
s3(10); //가지고 있는 메서드들이 차례대로 진행됨.
s3 -= new Sample(t.plus);
s3(10); // minus 하고 test.Hello 만 호출됨.
}
}
//일반 메서드는 객체 메서드로 들어감
// 정적 메서드는 클래스로
class Test
{
private int n;
public int N
{
get{ return this.n; }
}
public Test(int n)
{
this.n = n;
}
public void plus(int n)
{
this.n += n;
}
public void minus(int n)
{
this.n -= n;
}
public static void hello(int n)
{
Console.WriteLine(n);
// static method 에서는 this 를 사용할 수 없다.
}
}
D. Event( 객체에서 일어날 수 있는 사건) 과 이벤트 구조
A. 동작을 수행하는 방식
B. Publisher (출판자) : 이벤트를 발생하여 특정 구독자에게 이벤트 발생을 알려준다.
C. Subscriber(구독자) : 특정 이벤트 발생 통보를 받고, 출판자로부터 호출되어질 메서드를 미리 등록한 객체.
D. Event Handler(이벤트 핸들러) : 호출 되어지는 메서드
E. 클래스의 멤버로 들어감.
F. 사건이 발생하면 à 준비된 코드 실행(메서드 호출)à Delegate 위임 호출 à 메서드를 대리호출
i. 예제
class Example
{
static void Main(stirng [] args)
{
MyButton btn1 = new MyButton(“버튼1”);
// click 발생 -> 호출될 메서드
// click – delegate – method 연결 작업
// btn객체에 click 이벤트를 등록완료
btn1.Click += new ClickEvent(ButtonClick);
}
public static void ButtonClick(object sender, MyEventArgs args)
{
MyButton btn = (MyButton)sender;
Console.WriteLine(btn.Text);
}
}
//위임 선언
public delegate void ClickEvent(object sender, MyEventArgs args);
//EventArgs : 사건이 터졌을 때 사건과 관련된 정보를 가지는 클래스
public class MyEvenetArgs : EventArgs
{
private int clickCount;
public MyEventArgs(int count)
{
this.clickCount = count;
}
public int ClickCount
{
get { return this.clickCount ; }
}
}
public class MyButton
{
private string text; // 버튼의 라벨
// public event 델리게이트 click;
pubilc event ClickEvent click;
public MyButton() : this(“”) { } // 생성자 초기리스트.
public MyButton(string text)
{
this.text = text;
}
public string Text
{
get { return text; }
set { text = value; }
}
}
ii. 람다 : “=>” 요 표시가 들어가면 람다라고 한다.
1. 예제 1
A. Public delegate int Alpha(int GIVEN);
B. Alpha a = x => x*x ; //간단하게 x 라는 인수를 x*x 로 리턴한다라는 의미
C. Console.WriteLine(a(10)); // 요러면 100이 나옴.
D. Alpha a = x => { return x*x; }; //위와 동일한 결과, return을 써도 되고..
E. Alpha a = x => {console.WriteLine(“TEST”); return x*x; }; // 더 추가해도 되고, Alpha a = (x,y) => x*y; // 요건 파라미터가 2개 이상일 때
'Java' 카테고리의 다른 글
Apache Daemon 에 대해서 (3) | 2015.12.08 |
---|---|
Runtime.addShutdownHook() (0) | 2015.09.30 |
Top 10 Useful, Yet paranoid Java Programming Techniques (0) | 2015.09.15 |
Exception (0) | 2013.08.04 |
Regular Expressions in Java (0) | 2013.07.30 |
Struts2 도 해보자 시작1 (0) | 2013.06.30 |
JDBC에 대해서 다시한번 보라구.. (0) | 2011.05.11 |
[기초]GUI , AWT 와 JFC ,사용하는 Event 그리고 Applet (0) | 2010.01.31 |
[기초]byte,text,file,object 입출력 과 자바 네트워크(TCP,UDP,Muticast,RMI) (0) | 2010.01.31 |
[기초]클래스,예외처리,Collection,Assertion (0) | 2010.01.31 |