티스토리 뷰

C#/C# 강좌 Winform

Doridori C# 강의) 30.Lambda (람다식)

꼬꼬마도리도리 2019. 2. 8. 22:14

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

안녕하세요 Doridori 입니다. 


이번 강의는 Lambda(람다식)에 대한 강의 입니다. 


람다식의 경우 꼭 알아야 할 필요는 없지만 꼭 알아야하는 내용이라고 할 수 있습니다. 


람다식을 모른다고 내가 원하는 기능을 구현하지 못하지는 않지만 모른 다면 다른 사람이 짜놓은 코드를 이해 할 수 없습니다.


두가지 목표를 가지고 내용을 보면 좋을것 같은데 


1. 람다식으로 짜여진 코드를 해석 할 수 있게 한다.

2. 람다식이 필요한 경우를 확인 한다.


화이팅입니다. ^^

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


Lambda(람다식)


Source UI) Study_30_Lambda (UI).zip

Soruce 전체) Study_30_Lambda.zip

교재) 30강 Lambda (람다식).pdf








람다식의 경우 새로운 기능이라고 하기 보다는 코드를 간결하게 만들어 주는 구문이라고 보시면 될것 같습니다. 


코드를 축약 시키는 기능을 하는데 코드가 축약 된다고 하면 항상 이야기 하는 두가지 점이 있는데 한가지는 코드가 간결하고 짧아 지는 점점과 다른 하나는 짧아지기 때문에 가독성이 떨어집니다. 


물론 코드를 간결하게 많이 사용해서 익숙한 개발자의 경우 자연스럽게 사용할 수 있겠지만, 아직 익숙하지 않은 개발자의 경우 코드를 이해하기가 매우 어려워 집니다. 


축약 시킬 수 있는 부분이 한정적이기 때문에 남발 할 필요는 없을것 같고 필요한 부분에 가져다 사용 할 경우 기존보다 훨씬 간결한 코드를 작성 할 수 있습니다. 


내가 코드를 작성 할 때 억지로 넣어서 사용 할 필요 까지는 없지만 다른 사람이 짜놓은 코드를 천천히 쫓아서 이해할 수 있을 정도는 알아 두면 좋을 것 같습니다.




UI)


이번 화면의 경우 람다식의 내용을 하나씩 확인 해보는 것을 목적으라 작성 하였습닏니다. 


(뭔가 심심하다는 느낌을 받을 수 있기는 한데 다른 부분들 보다는 사용 되는 부분들을 집고 넘어가는 것이 좋을 것 같습니다.)





강의)

UI는 간단한데 강의 시간은 1시간 정도 될 정도로 길게 되었습니다. (하다보니 . . . ㅎㅎ)

설명하는 부분들이 많다고 해석 하셔도 될 것 같습니다. 

강의를 잘 보시면 가져 가시는 부분이 많다고 생각하시면 될것 같습니다. ㅎㅎㅎ

Source)

코드에 주석을 열심히 달아 놨기 때문에 주석을 보시고 부분 부분 확인하시면서 천천히 따라가시면 좋을 것 같습니다.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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 _30_Lambda
{
    public partial class Form1 : Form
    {
        /// <summary>
        /// 프로그램 진입점
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }
 
        Action _aStepCheck = null;  // 다음 step에 대한 내용을 표시해 줄 Text를 Action으로 선언
 
        /// <summary>
        /// Form이 Load 되는 시점에 호출
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            _aStepCheck = () => lblStepCheck.Text = string.Format(" - 다음 Step은 {0}.{1}", iNowStep, ((enumLambdaCase)iNowStep).ToString());  // 람다식으로 등록
            _aStepCheck();  // 다음 Step을 표시하기 위해 Action을 호출
 
            ButtonColorChange();   // Button 색상을 변경 하는 예제
        }
 
        /// <summary>
        /// Form Load 시점에 Button Event를 등록 해줌
        /// </summary>
        private void ButtonColorChange()
        {
            // Button Event 함수에서 Button 색상 변경
            btnColorChange_1.Click += BtnColorChange_1_Click;
 
 
            // 무명 메서드를 사용해서 Button 색상 변경
            btnColorChange_2.Click += delegate (object sender, EventArgs e)
            {
                btnColorChange_2.BackColor = Color.Brown;
            };
 
 
            // 람다식을 사용해서 Button 색상 변경
            btnColorChange_3.Click += (sender, e) => btnColorChange_3.BackColor = Color.Coral;
            
        }
 
        /// <summary>
        /// Button Event 함수
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnColorChange_1_Click(object sender, EventArgs e)
        {
            btnColorChange_1.BackColor = Color.Aqua;
        }
 
 
        int iNowStep = 0;
        delegate int delIntFunc(int a, int b);
        delegate string delStringFunc();
 
        /// <summary>
        /// Button Next를 Click 했을 경우 Case에 맞는 내용을 진행
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNext_Click(object sender, EventArgs e)
        {
            Lambda(iNowStep); // 람다식 예제를 Switch 형식으로 정리
            iNowStep++;
            _aStepCheck();    // 다음 Step을 표시하기 위해 Action을 호출
        }
 
 
        private void Lambda(int iCase)
        {
            switch (iCase)
            {
                case (int)enumLambdaCase.식형식_람다식:
                    // 식형식 람다식 
                    delIntFunc dint = (a, b) => a * b;
                    int iRet = dint(45);
                    lboxResult.Items.Add(iRet.ToString());
 
                    delStringFunc dString = () => string.Format("Lambda Sample 식형식");
                    string strRet = dString();
                    lboxResult.Items.Add(strRet.ToString());
 
                    break;
                case (int)enumLambdaCase.문형식_람다식:
                    // 문형식 람다식
                    delStringFunc dstrSeqment = () =>
                    {
                        return string.Format("Lambda Sample 문형식");
                    };
                    string strSeqRet = dstrSeqment();
                    lboxResult.Items.Add(strSeqRet.ToString());
 
                    break;
                case (int)enumLambdaCase.제네릭_형태의_무명메서드_Func:
                    // 제네릭 형태의 무명 메서드
                    // Func : 반환 값이 있는 형태
                    Func<intintint> fInt = (a, b) => a * b;
                    int fIntRet = fInt(45);
                    lboxResult.Items.Add(fIntRet.ToString());
                    
                    break;
                case (int)enumLambdaCase.제네릭_형태의_무명메서드_Action:
                    // 제네릭 형태의 무명 메서드
                    // Action : 반환값이 없는 형태
                    Action<stringstring> aString = (a, b) =>
                    {
                        string strText = String.Format("인자 값 {0}와 {1}을 받았습니다.", a, b);
                        lboxResult.Items.Add(strText.ToString());
                    };
                    aString("시간","금");
 
                    break;
                case (int)enumLambdaCase.제네릭_형태의인자__반환_예제:
                    // 배열의 sum 함수의 경우 인자 값이 func<> 형태로 되어있음)
 
                    int[] iGroup = { 13579 };
                    int iNumSum = iGroup.Sum(x => x);
                    lboxResult.Items.Add(iNumSum.ToString());
                    
                    string[] strGroup = { "XXX""TTTT""YYY" };
                    int ilengthSum = strGroup.Sum(x => x.Length);
                    lboxResult.Items.Add(ilengthSum.ToString());
                    
                    break;
                default:
                    break;
            }
        }
 
        /// <summary>
        /// case의 형태 진행 상태를 정리하기 위한 enum 정의
        /// </summary>
        enum enumLambdaCase
        {
            식형식_람다식 = 0,
            문형식_람다식 = 1,
            제네릭_형태의_무명메서드_Func = 2,
            제네릭_형태의_무명메서드_Action = 3,
            제네릭_형태의인자__반환_예제 = 4,
        }
 
    }
}
 
cs




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함