티스토리 뷰

======================================================

안녕하세요 Doridori 입니다.


드디어 장기 해외 출장을 마치고 돌아오게 되었습니다.~!!! (혼자 빠밤!!!!!)


원래 8~9월 정도로 생각 하고 있었는데 연장되어 어찌어찌하다보니 11월이 되었네요.


거의 반년을 업데이트를 못한 상황인데도 기다려주신 분들이 있으셔서 매우 힘을 얻었습니다. 


국내들어와서도 개인사정으로 일이 어떻게 될지 혼란스러운 상황이기는 한데 (한 가정의 가장이라 일을 해야 해서 ^^;;;;)


최대한 짬짬히 이어나가도록 하겠습니다. 


해외에서 댓글 보면서 매우매우 힘을 얻었습니다. 다시한번 감사 드립니다. !! m(_._)m


각설하고 이번강의는 재귀 함수에 대한 강의 입니다. 


요는 함수가 자기 자신을 다시 호출한다는 점입니다. 


처음 봤을때 매우 신선하다고 느꼈는데 다들 비슷한 느낌을 받으셨으면 좋겠습니다. ^^;;;


다시 한번!! 다들 화이팅 입니다.!!!

======================================================


37. 재귀 함수

 

 

Source UI) Study_37_RecursionFunction (UI).zip

Soruce 전체) Study_37_RecursionFunction.zip

교재) 37. 재귀 함수 (Recursion Function).pdf





재귀 함수는 간단하게 자기 자신을 호출하는 함수 입니다. 


for 문과 비슷한 느낌이라고 볼 수 있지만 조건들을 다양하게 사용 할 수 있기 때문에 잘 사용 한다면 매우 강력한 기능이 될 수 있습니다. 


하지만 코드의 흐름을 놓친 상태에서 사용하게 된다면 자원이 비효율적으로 관리된다던지 디버깅이 어렵다던지 무한루프에 빠질 수 있다던지 하는 단점이 있기 때문에 흐름을 잘 따라가면서 사용해야 할 것 같습니다. 


 


(UI)


기존에는 테마를 잡고 UI를 만들었는데 이번에는 뭔가 간만에 진행 하는거기도 하고 외국 다녀와서 아직 정신이 없어서 그런지 예제가 딱 떠오르는 것이 없어서 기능에 충실한 녀석을 만들었습니다. ~(_._)~


UI가 복잡해 보이지만 단순 Control들의 나열이기 때문에 복사복사 해서 만드시면 금방 만들 수 있습니다. ^^;;



강의)


오랜만에 하다보니 새로 시작하는 느낌이네요 어색어색 합니다. ^^;;


빨리 적응해서 돌아오도록 하겠습니다. ^^;;





Source)


원래 코드 따던 웹페이지가 크롬을 지원 안하게 됬네요 =0=;;


배경색상이랑 줄번호가 날라갔습니다. ^^;;


다시 확인해서 알아보도록 하겠습니다. (간만에 하니 모든게 새롭군요~! 짜릿해!!)


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace RecursionFunction
{
public partial class Form1 : Form
{
/// <summary>
/// Control에 Type에 대한 Enum
/// </summary>
enum enControlType
{
Unknown,
Label,
Textbox,
Button,
}
/// <summary>
/// 진입점
/// </summary>
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 실행 Button Event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnExe_Click(object sender, EventArgs e)
{
// Control Level, Control Type, Control Text
int iLevel = (int)numLevel.Value;
enControlType eControlType = enControlType.Unknown;
if (rdoLabel.Checked) eControlType = enControlType.Label;
else if (rdoTextBox.Checked) eControlType = enControlType.Textbox;
else if (rdoButton.Checked) eControlType = enControlType.Button;
string strChangText = tboxChangeText.Text;
// 위의 조건에 대한 Control을 찾기 위한 함수 호출
ControlSearch(gboxCheckList, iLevel, eControlType, strChangText);
}
/// <summary>
/// Control 검색을 위한 함수
/// </summary>
/// <param name="CheckList"></param>
/// <param name="iLevel"></param>
/// <param name="eType"></param>
/// <param name="strChangeText"></param>
private void ControlSearch(GroupBox CheckList, int iLevel, enControlType eType, string strChangeText)
{
// 지정한 Group Box 내에 있는 Control을 하나 씩 가져와서 체크 하기 위함 foreach
foreach (var item in CheckList.Controls)
{
// 검색 하려고 하는 Control이 있는 GroupBox의 이름이 "Level + 'Level 번호'" 가 맞을 경우 내부에 있는 Control의 Type을 찾아서 맞을 경우 Text를 변경 함
if (CheckList.Text.Equals("Level " + iLevel))
{
switch (eType)
{
case enControlType.Label:
if (item is Label)
{
((Label)item).Text = strChangeText;
lboxResult.Items.Add(string.Format("현재 GroupBox : {0}, Label Text : {1} 로 변경", CheckList.Text, strChangeText));
}
break;
case enControlType.Textbox:
if (item is TextBox)
{
((TextBox)item).Text = strChangeText;
lboxResult.Items.Add(string.Format("현재 GroupBox : {0}, Textbox Text : {1} 로 변경", CheckList.Text, strChangeText));
}
break;
case enControlType.Button:
if (item is Button)
{
((Button)item).Text = strChangeText;
lboxResult.Items.Add(string.Format("현재 GroupBox : {0}, Button Text : {1} 로 변경", CheckList.Text, strChangeText));
}
break;
}
}
// GroupBox 내에 있는 Control 중에 GroupBox가 또 존재 할 경우 그 GroupBox 안에 있는 Control에 대해서 Search 하기 위해 현재 돌고 있는 함수를 다시 호출 함!!
if (item is GroupBox)
{
lboxResult.Items.Add(string.Format("현재 GroupBox : {0}, 다음 GroupBox : {1} 로 이동", CheckList.Text, ((GroupBox)item).Text));
ControlSearch((GroupBox)item, iLevel, eType, strChangeText); // 현재 호출된 함수 내에서 동일한 함수를 다시 호출 함!! (재귀 함수)
}
}
// foreach 문을 다 검색하고 나온 GroupBox와 가장 처음 검색 한 GroupBox가 동일 한 경우 함수가 종료되었다고 판단
if (CheckList == gboxCheckList)
{
lboxResult.Items.Add(string.Format("END"));
}
}
}
}



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함