반응형
■ 목적
- 함수의 대리자 (사전적인 의미: Delegate '대리자')
- method 동일한 Type의 delagate를 선언
- 선언한 delegate 변수 생성
- 생성한 delegate에 사용할 method를 참조 시킴
- CallBack method 구현 : method의 인자로 delegate를 사용하여 다른 함수에서 delegate 함수를 호출해서 사용하도록 함
- 델리게이트의 일반화 (delegate<T>): 일반화 Type으로 선언 할 경우 어떤 Type의 method 든지 사용할 수 있음
- 델리게이트 체인(delegate chain) : - +=, -=로 함수를 연결하거나 해제해서 순서대로 호출할 수 있음
> UI 만들고 naming 하기
- listbox 만드는 이유는 delegate 순서를 알기 위해
함수 작성해서 "주문하기" 버튼 기능 추가하기
public partial class Form1 : Form
{
int _iTotalPrice = 0;
public Form1()
{
InitializeComponent();
}
private void btnOrder_Click(object sender, EventArgs e)
{
if (rdoDow1.Checked)
{
fDov(1);
}
else if (rdoDow2.Checked)
{
fDov(2);
}
#region Function
//0:선택 안함 1:오리지널, 2:씬
private int fDov(int iOder)
{
string strOrder = string.Empty;
int iPrice = 0;
if (iOder == 1)//로그 남길 것 여기다 코드 적을 것
{
iPrice = 10000;
strOrder = string.Format("도우는 오리지널을 선택하셨습니다.({0}원)", iPrice.ToString());
}
else if (iOder == 2)
{
iPrice = 11000;
strOrder = string.Format("도우는 씬을 선택하셨습니다.({0}원)", iPrice.ToString());
}
else
{
strOrder = "도우를 선택하지 않았습니다. ";
}
lboxOrder.Items.Add(strOrder);
return _iTotalPrice = _iTotalPrice * iPrice;
}
#endregion
}
}
이렇게 로그를 찍어도 되지만 이제 Delegate기능을 활용해서 만들어 보자.
> delegate 선언하기
반환 형, 인자 값 타입 형 같아야함 여기서는 int
> 버튼을 클릭했을 때 이벤트에 delegate 활용하기
변수명은 delDow, new라는 키워드를 사용하는데 인자값을 (int(int)target)으로 받아야 한다고 알려준다. 이미 만들어 놓은 fDow로 타겟으로 잡아두자.
public partial class Form1 : Form
{
public delegate int delFuncDow_Edge(int i);
//delegate 선언, 형이랑 반환형태, 인자 값(int) 모두 같게 해주자.
int _iTotalPrice = 0;
public Form1()
{
InitializeComponent();
}
private void btnOrder_Click(object sender, EventArgs e)
{
delFuncDow_Edge delDow = new delFuncDow_Edge(fDow);
delFuncDow_Edge delEdge = new delFuncDow_Edge(fEdge);
int iDowOrder = 0;
int iEdgeOrder = 0;
//Dow 호출
if (rdoDow1.Checked)
{
iDowOrder = 1;
}
else if (rdoDow2.Checked)
{
iDowOrder = 2;
}
delDow(iDowOrder);
//Edge를 선택
if (rdoEdge1.Checked)
{
iEdgeOrder = 1;
}
else if (rdoEdge2.Checked)
{
iEdgeOrder = 2;
}
delEdge(iEdgeOrder);
}
private int fEdge(int iOder)
{
string strOrder = string.Empty;
int iPrice = 0;
if (iOder == 1)//로그 남길 것 여기다 코드 적을 것
{
iPrice = 1000;
strOrder = string.Format("엣지는 리치골드을 선택하셨습니다.({0}원)", iPrice.ToString());
}
else if (iOder == 2)
{
iPrice = 2000;
strOrder = string.Format("엣지는 치즈크러스트을 선택하셨습니다.({0}원)", iPrice.ToString());
}
else
{
strOrder = "엣지를 선택하지 않았습니다. ";
}
lboxOrder.Items.Add(strOrder);
return _iTotalPrice = _iTotalPrice + iPrice;
}
private int fDow(int iOder)
{
string strOrder = string.Empty;
int iPrice = 0;
if (iOder == 1)//로그 남길 것 여기다 코드 적을 것
{
iPrice = 10000;
strOrder = string.Format("도우는 오리지널을 선택하셨습니다.({0}원)", iPrice.ToString());
}
else if (iOder == 2)
{
iPrice = 11000;
strOrder = string.Format("도우는 씬을 선택하셨습니다.({0}원)", iPrice.ToString());
}
else
{
strOrder = "도우를 선택하지 않았습니다. ";
}
lboxOrder.Items.Add(strOrder);
return _iTotalPrice = _iTotalPrice + iPrice;
}
}
"주문하기" 버튼을 누르면
delegate로 넘어가고 함수가 불러진다.
반응형
'컴퓨터 공학 > C, C++' 카테고리의 다른 글
[ C ] 메모리 이해하기1_메모리의 종류(스택, 힙, 레지스터?) (404) | 2020.07.12 |
---|---|
[ C 언어 ] 함수 포인터란? (397) | 2020.07.07 |
맥 Xcode에서 C/C++/Object-C언어 실습 환경 갖추기 (389) | 2020.07.06 |
[C# 실습 예제] 비주얼 스튜디오 2019 _사용자 정의 컨트롤 (0) | 2019.11.12 |
[C# 실습 예제] 비주얼 스튜디오 2019_동적 레이아웃 구성하기 (0) | 2019.11.08 |
댓글