티스토리 뷰

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

안녕하세요 Doridori 입니다. 


지난번에 썻던 내용이지만 한번더, 12강 강의 부터 해서 클래스 관련된 내용을 진행 중인데 이번에는 Class와 관련 된 마지막 강의로 캡슐화( Encapsulation)와 Partial Class에 대해서 진행 하겠습니다. 


Partial Class의 경우 그냥 Class를 논리적으로 분리 해 준다 정도로만 생각 하면 될것 같고 캡슐화에 대한 내용을 숙지 해주시면 좋을 것 같습니다. 


얼핏보면 크게 쓸모 없어 보이지만 정보은닉 관련 내용으로 사용방법에 익숙해 질 필요가 있습니다. 


(원래 다른예제를 준비 했었는데 캡슐화 관련 내용이 이상한형태로 들어간것 같아서 갈아 엎고 새로 만드느라 조금 늦었습니다. ^^;;)

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


캡슐화( Encapsulation)와 Partial Class


Source UI) Study_15_Encapsulation_PartialClass(UI).zip

Soruce 전체) Study_15_Encapsulation_PartialClass.zip

교재) 15강 캡슐화( Encapsulation)와 Partial Class.pdf



캡슐화의 경우 보통 get/set 형태로 많이 사용 되는데 기존대시 선언하는 형태가 변형 되어서 (람다식 형태로) 사용 하는데 당황 스러웠습니다. 만. . . 이번 강의를 진행 해보지 않았다면 모르고 있었을 것 같다고 생각을 하면서 이런식으로 새롭게 변경되어 가는것을 놓치게 되는구나 싶었던 강의 였습니다. ^^;; 


프로그램의 구조는 크게 보면 클래스 하나에 Form 하나라고 보시면 될것 같습니다. 

CData의 경우 하나의 Class를 Partial로 나누어 놓아서 저런식으로 표시 했습니다.

Enum 관련 Data의 경우 Class 외부에 지정해서 같은 네임스페이스 안에서는 어디서든 접근 할 수 있도록 하였기 때문에 별도 Class 표시를 하지 않았습니다. 


이번 프로그램의 경우 간단하게 마트에서 물건을 샀을 때 할인율적용된 가격으로 계산하는 프로그램을 작성 하였습니다. 

UI Control들에 대해서는 기존에 사용 하였던 Control들이라서 어렵지 않을 것 같습니다. 





강의)



Source)

EnumClass.cs)

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _15_Partial
{
    /// <summary>
    /// 물건 종류 및 값을 가지고 있는 Enum Data
    /// </summary>
    public enum EnumItem
    {
        고기 = 10000,
        과자 = 3000,
        계란 = 5000,
        물 = 800,
        라면 = 3500,
        즉석식품 = 6500,
        냉동식품 = 8500,
    }
 
    /// <summary>
    /// 할인율을 가지고 있는 EnumData
    /// </summary>
    public enum EnumRate
    {
        할인_3 = 3,
        할인_5 = 5,
        할인_10 = 10,
        할인_20 = 20,
        사장할인_80 = 80,
    }
    
 
    //Enum을 class 외부에서 사용하기 때문에 .cs File의 이름은 의미가 없음
    //class EnumClass
    //{
    //}
}
 
cs


cData.cs)

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _15_Partial
{
    /// <summary>
    /// 변수
    /// </summary>
    partial class cData
    {
        private double _dTotalPrice = 0.0;
        public double DTotalPrice
        {
            get => _dTotalPrice;
            set
            {
                _dTotalPrice = _dTotalPrice + value;  // 외부에서 값을 입력 할 경우 기존 값에 값을 더해서 내부변수에 저장
            }
        }
 
 
        private string _strItem = string.Empty;
        public string StrItem
        {
            // get을 막아 놓았기 때문에 외부에서 읽을 수 없음
 
            //get
            //{
            //    return _strItem;
            //}
            set
            {
                if (String.IsNullOrEmpty(value))  // 값이 들어 올 경우 정합성 확인 후 사용
                {
                    _strErrorName = "물건이 선택되지 않았습니다.";
                }
                else
                {
                    _strItem = value;
                }
            }
        }
 
        
        private int _iRate = 0;
        public int IRate
        {
            //get => _iRate;
            set
            {
                if (value > 20)   // 값이 들어 올 경우 정합성 확인 후 사용
                {
                    _strErrorName = "사장님만 가능 한 할인 입니다.";
                }
                else
                {
                    _iRate = value;
                }
            }
        }
 
        
        private int _iCount = 0;
        public int ICount
        {
            //get => _iCount;
            set
            {
                if (value > 5)   // 값이 들어 올 경우 정합성 확인 후 사용
                {
                    _strErrorName = "개별 물품은 5개이상 살수 없습니다.";
                }
                else if (value == 0)
                {
                    _strErrorName = "물품의 개수가 0개 입니다.";
                }
                else
                {
                    _iCount = value;
                }
            }
        }
        
        private string _strErrorName = string.Empty;
        public string StrErrorName
        {
            get => _strErrorName;
            //set => _strErrorName = value;    // Set을 사용하지 않기 때문에 외부에서 입력 불가
        }
       
    }
 
    /// <summary>
    /// 수식 계산
    /// </summary>
    partial class cData
    {
        /// <summary>
        /// 가지고 있는 내부 값들을 가지고 할인된 가격을 반환
        /// </summary>
        /// <returns></returns>
        public double fItemPrice()
        {
            double dPrice = 0;
 
            int iItemPrice = 0;
 
            if (String.IsNullOrEmpty(_strErrorName))  // Error 가 없으면 정상 값들을 받았다
            {
                iItemPrice = (int)Enum.Parse(typeof(EnumItem), _strItem);
 
                dPrice = iItemPrice - Math.Round((double)iItemPrice * (double)_iRate / 100, 2);
            }
 
            return dPrice * _iCount;
        }
    }
 
    /// <summary>
    /// 문자열
    /// </summary>
    partial class cData
    {
        /// <summary>
        /// 화면에 값을 보여주기 위해서 문자열을 생성
        /// </summary>
        /// <param name="dPrice"></param>
        /// <returns></returns>
        public string fResult(double dPrice)
        {
            if (_iRate == 0)
            {
                return string.Format("{0} X {1} : {2}원", _strItem, _iCount, dPrice);
            }
            else
            {
                return string.Format("{0} X {1} : {2}원 (할인율 : {3}%)", _strItem, _iCount, dPrice, _iRate);
            }
        }
 
        /// <summary>
        /// 내부 변수값들을 초기화 시킴 (외부에서 초기화를 못시키도록 만들어 놓았기 때문에 초기화 하는 함수를 만들어서 사용)
        /// </summary>
        public void fDataResult()
        {
            _strErrorName = string.Empty;
            _strItem = string.Empty;
            _iRate = 0;
            _iCount = 0;
        }
    }
    
}
 
cs


Form1)

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
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 _15_Partial
{
    public partial class Form1 : Form
    {
        cData _Data = new cData();  // cData라는 Glass를 사용 할 수 있도록 선업하고 초기화 하였습니다. (이번 강의 핵심 Class)
 
        /// <summary>
        /// 프로그램의 진입점 입니다.
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }
 
 
        /// <summary>
        /// Form1을 Load 하는 시점에 ComboBox에 Data를 넣어 줍니다. (EnumClass.cs에 Enum 관련 된 내용들을 정리 하고 가지고와서 사용 하였습니다.)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            EnumItem[] ei = (EnumItem[])Enum.GetValues(typeof(EnumItem));  // Enum에 있는 값들을 배열 형태로 불러옵니다. (Enum을 많이 쓰시면 자주 사용 됩니다.)
 
            foreach (EnumItem oitem in ei)  //foreach 문으로 Enum 형태의 배열에 있는 값을 하나씩 가져와서 ComboBox에 넣어 줍니다.
            {
                cboxItem.Items.Add(oitem.ToString());
            }
            
            foreach (EnumRate oitem in (EnumRate[])Enum.GetValues(typeof(EnumRate)))   // 위와 같음
            {
                cboxRate.Items.Add(oitem.ToString());
            }
        }
 
        /// <summary>
        /// Button "담기"를 Click 하였을 경우 cData Class에 Form에 Setting 된 값을 넣어주고 계산을 한뒤 값을 ListBox에 보여 줍니다.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAdd_Click(object sender, EventArgs e)
        {
            _Data.fDataResult();  // cData에 있는 변수 값들을 초기화 시킴
 
            _Data.StrItem = cboxItem.Text;
            _Data.IRate = (int)Enum.Parse(typeof(EnumRate), cboxRate.Text);  // 문자 형태로 가지고 있는 Enum 값을 int 형태로 변환 시킴 (Enum을 많이 쓰시면 자주 사용 됩니다.)
            _Data.ICount = (int)numCout.Value;
 
            if (!String.IsNullOrEmpty(_Data.StrErrorName))   // Error Data가 있을 경우 tboxErrorMsg에 Error 내용을 보여주고 종료
            {
                tboxErrorMsg.Text = _Data.StrErrorName;
                return;
            }
 
            //Error가 없을 경우 아래 할인 가격을 계산하는 Logic을 수행 후 ListBox에 값을 뿌려줌.
 
            double dPrice = _Data.fItemPrice();
            lboxItem.Items.Add(_Data.fResult(dPrice));
 
            _Data.DTotalPrice = dPrice;
            tboxResult.Text = _Data.DTotalPrice.ToString() + "원";
        }
    }
}
 
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
글 보관함