티스토리 뷰
======================================================
안녕하세요 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 |
'C# > C# 강좌 Winform' 카테고리의 다른 글
Doridori C# 강의) 17. XMLReader, XMLWriter (25) | 2018.09.16 |
---|---|
Doridori C# 강의) 16. StreamReader, StreamWriter (24) | 2018.09.09 |
Doridori C# 강의) 14. 오버라이딩(Override)과 오버로딩(Overload) (6) | 2018.08.12 |
Doridori C# 강의) 13.상속(Inheritance) 및 접근제어 (18) | 2018.08.05 |
Doridori C# 강의) 12.클래스의 생성 및 사용(Class) (10) | 2018.07.30 |
- Total
- Today
- Yesterday
- C# 강의
- C# 기초 강의
- 증류주
- 칵테일
- 가볼만한곳
- 도리도리
- 와인
- 전통주
- 하이볼
- 서울
- 술
- 프로그램 강의
- 맥주
- 위스키
- WinForm
- Visual Studio
- C# 강좌
- 나들이
- 주말
- 가볼만한 곳
- 모바일
- 아이랑
- 소주
- 보드카
- 맛집
- 도리도리 C#
- 막걸리
- 광저우
- C#
- 게임
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |