study

[C#] Chapter 14. Property

yz 2022. 6. 14. 15:51
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 MyFirstCSharp_01
{
    // 1. 설명
    // 프로퍼티 (Property)
    /* 클래스 내부 변수의 값을 읽거나 쓸 때 사용하는 방법
     * Public으로 선언한 변수의 변질을 막고, Public을 많이 사용하지 않도록 권장
     * 
     * 캡슐화
     * 정보 은닉을 위해 클래스에서 선언된 변수가 외부에서 접근이 안되도록
     * Public이 아닌 Private로 선언하여 접근을 불가능하게 만드는 객체지향 언어에서 지향하는 목표 중 하나
     * */
    public partial class Chap14_Property : Form
    {
        // 6. Chap14_Property 클래스에서 사용할 수 있는 BookStore 클래스 생성
        private BookStore B_S = new BookStore();

        public Chap14_Property()
        {
            InitializeComponent();
        }

        private void btnIn_Click(object sender, EventArgs e)
        {
            // 7. 책 입고
            int iInBookCount = Convert.ToInt32(txtInQty.Text);
            B_S.BookCount2 += iInBookCount; // 입고되는 책의 수량을 BookStore 클래스의 iBookCount에 누적
            txtInQty.Text = "";
            lblStock.Text = Convert.ToString(B_S.BookCount); // 현재 총 재고량을 라벨에 표시
            MessageBox.Show($"{iInBookCount}권의 책이 입고되었습니다.");
        }

        private void btnOut_Click(object sender, EventArgs e)
        {
            //// 8. 책 판매 현황 및 데이터 변경
            //// -- B_S.BookCount;

            //// 9. 책의 재고는 -가 될 수 없다.
            ////    만약 iBookCount를 Public으로 선언하거나 BookCount 프로퍼티를 Get/Set 상태로 그대로 둔다면
            ////    - 재고로 남게 된다
            //if (B_S.BookCount < 0)
            //{
            //    B_S.BookCount = 0;
            //    MessageBox.Show("책의 수량은 0보다 작을 수 없습니다.");
            //}
            //lblStock.Text = Convert.ToString(B_S.BookCount);

            // 12.
            --B_S.BookCount2;
            lblStock.Text = Convert.ToString(B_S.BookCount2);

            // 10. 다른 사람이 클래스의 BookCount 또는 Public으로 선언된 iBookCount에 접근할 때
            //     iBookcount가 - 값을 가질 수 있다.
            //     따라서 공통으로 사용하는 클래스의 필드일 경우 Public 방식보다는
            //     Get/Set을 통한 (프로퍼티) 값의 변질에 제한을 둘 수 있다.
        }
    }

    // 2. 서점이라는 클래스가 있다고 할 때
    class BookStore
    {
        private int iBookCount; // 3. 외부에 Open하지 않을 iBookCount 변수
        public int BookCount;   // 4. 외부에서 접근할 공용 프로퍼티 BookCount로 접근할 수 있다.
        {
            get { return iBookCount; }  // BookCount를 외부에서 호출할 경우 iBookCount 값을 반환
            set { iBookCount = value; } // BookCount에 외부에서 값을 대입할 경우 iBookCount에 값을 등록
        }
        // 11. 데이터의 변질을 막기 위한 공용 변수 iBookCount2 프로퍼티
        public int BookCount2
        {
            get { return iBookCount; }
            set
            {
                if (value < 0) // 지금 값이 0보다 이하일 경우
                {
                    MessageBox.Show("책의 수량은 0 이하일 수 없습니다.");
                }
                else iBookCount = value; // 그 외일 경우
            }
        }
        // 프로퍼티의 간단한 생성 방법
        public int BookCount3
        {
            // private int BookCount3를 자동으로 생성한다.
            get; set;
        }
        // 읽기 전용 멤버 변수
        public int BookCount4
        {
            get;
        }
        // 쓰기 전용 멤버 변수
        public int BookCount5
        {
            // set;
            set
            {
                BookCount5 = value;
            }
        }
        // 5. 정보 은닉을 위해 변수(iBookCount) 자체는 Private로 선언을 했지만, 
        // Get과 Set으로 접근을 가능하게 하니 Public과 별 차이 없어보인다.
        // 프로퍼티
        // 정보의 은닉성 (캡슐화)를 위하여 클래스의 필드는 Private로 선언해 둘 필요가 있으며
        // 공통으로 사용하는 변수일 경우 데이터의 변질을 막을 수 있어
        // 은닉성과 데이터 변질에 대한 벨리데이션 체크를 동시에 할 수 있다.
    }
}
LIST