C# - Property

Code April·2022년 4월 25일
0

C#

목록 보기
3/12

GitHub Source : https://github.com/cocoknight/myblog/tree/main/C%23/PropertyHandler/HelloProperty


클래스의 데이터 멤버에 접근하는 방법은 다양하게 존재 합니다.
public 데이터 멤버의 경우는 해당 변수이름을 가지고 바로 데이터를
접근할 수 있습니다. 하지만 protected,private 데이터 멤버의 값을
접근하기 위해서는 별도의 멤버펑션을 통해서 접근을 해야 합니다.
즉, 멤버 접근지정자의 종류(public,protected,private)에 따라 접근 방법이
틀려지게 됩니다. 클래스 멤버 접근지정자와 별도로 클랫 상속 접근 지정자도
동일하게(public,protected,private)존재 합니다.

이번 글에서는 멤버 접근지정자와 setter,getter,property관련 정리를 하겠습니다.


위와 같이 은행은 고객의 예금을 관리하고 있고, 고객들은 은행(은행계좌)을 통해
입금,출금등의 경제 활동을 진행 합니다. 만약 고객의 자산이 public 데이터 멤버로
구성되어 있다면, 외부에서 임의로 값을 제어가능 할 수 있기 때문에, 이 경우는
절대 public 멤버 접근 지정자를 사용해서는 안됩니다.

클래스가 상속 관계가 아닐때는 protected와 private는 큰 차이가 나지 않으므로
데이터 멤버를 private로 구성하여 초기 클래스를 구성 합니다.

File : BankCustomer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloProperty
{
    class BankCustomer
    {
        private int customer1Assets;
        private int customer2Assets;


        public void setCustomer1Assets(int money)
        {
            customer1Assets = money;

        }

        public int getCustomer1Assets()
        {
            return customer1Assets;
        }

        public void setCustomer2Assets(int money)
        {
            customer1Assets = money;
        }

        public int getCustomer2Assets()
        {
            return customer1Assets;
        }

    }
}

현재 2개의 자산 데이터 멤버가 있고, 해당 데이터멤버의 값을 설정하거나 획득하기
위해서 setCustomer1Assets/getCustomer1Assets/setCustomer2Assets/getCustomer2Assets
와 같이 4개가 존재합니다. 만약 이와같은 코드 스타일을 유지했을 때, 고객 1명이 추가로
늘어나면 또 한쌍의 get/set멤버 펑션이 필요해 지게 됩니다.이러한 성격의 함수를 getter,
setter라고 부르며 여러 언어에서 자동으로 getter,setter함수를 생성하기 위한 방법을
지원하고 있습니다.
C#에서는 property 문법을 사용하여 setter/getter를 자동으로 생성 합니다.

  1. 프로퍼티(Property)사용
    위 코드를 Property를 사용한 버전으로 변경하겠습니다.

    Property 문법
    //Data Member선언
    class Person
    {
    private int age;
    //Property선언(public datatype propertyname순서)
    public int Age
    {
    //아래 get,set함수 부분을 별도로 getter,setter라고 한다.
    get {return age;};
    set {age =value;}
    }
    }
    //Main Class
    Person person = new Persion();
    person.Age=33; //Age프로퍼티의 set이 호출 되면 33이 value로 매핑
    int currentAge = person.Age; //Aget프로퍼티의 get이 호출 됨.

자,이제 유사하게 코드를 변경토록 하겠습니다.

File : BankCustomer.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloProperty
{
    class BankCustomer
    {
        private int customer1Assets;
        private int customer2Assets;
       
        //TOAN : 05/10/2022. Property를 사용한 방법
        public int Custmer1Asset
        {
            get { return customer1Assets; }
            set { customer1Assets = value; }
        }

        public int Custmer2Asset
        {
            get { return customer2Assets; }
            set { customer2Assets = value; }
        }

    }
}

File : Form1.cs
 //Form1이 로드 될때 BankCustomer클래스 객체 생성
 private void Form1_Load(object sender, EventArgs e)
  {
    _bankCustomer = new BankCustomer();
  }
  
//"고객1 입급"버튼이 눌렀을 때
 private void button1_Click(object sender, EventArgs e)
  {
    int money = 50000;
    //Customer1Asset프러퍼티의 setter사용
    _bankCustomer.Custmer1Asset = money; 
    depositMessage("customer1", money);
  }
 
//"고객1 출금" 버튼이 눌렀을 때
private void button2_Click(object sender, EventArgs e)
 {
   //Customer1Asset프러퍼티의 getter사용
  int currentAsset = _bankCustomer.Custmer1Asset;
  withdrawMessage("customer1", currentAsset);
 }
  1. 자동구현 프로퍼티(Auto Property)사용
    Property의 set,get함수에 특별한 로직이 전혀 필요가 없을때는
    자동 구현 프로퍼티를 사용할 수 있습니다.
    (C# 7.0이상부터 지원된 기능)

자동구현 프로퍼티에서는 데이터멤버를 별도 선언할 필요 없이
Property자체로만 사용이 가능합니다.

class Person
{
public int Age
{
get;
set;
}
}
//그리고 값을 부여하고 싶을 때는 아래와 같이 선언과 동시에
//값을 부여할 수도 있다.
class Person
{
public int Age
{
get;
set;
}
} =33;
선언과 동시에 값을 줄 수도 있다.
그리고 자동구현 프로퍼티는 변수랑 동일하게 취급 되기 때문에
아래와 같이 생성자에서 값을 부여할 수도 있다.
public Person()
{
Age=33;
}

최종적으로 자동구현 프로퍼티를 사용한 방식으로 코드를 변경해 보자.

File : BankCustomer.cs

namespace HelloProperty
{
    class BankCustomer
    {
        public int Custmer1Asset
        {
            get;
            set;
        }

        public int Custmer2Asset
        {
            get;
            set;
        }

    }
}

얼마나 간단한가??물론 AndroidStudio의 경우에는 코딩할 필요도 없이
Getter/Setter를 prefix규약으로 자동 생성해 주기도 한다^^.

  1. QUIZ
File : BankCustomer.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace HelloProperty
{
    class BankCustomer
    {
       public int Custmer1Asset
        {
            get;
            set;
        }

        public int Custmer2Asset
        {
            get;
            set;
        } = 44;

        public BankCustomer()
        {
            Custmer2Asset = 22;
            Debug.WriteLine(string.Format("Default Constructor(BankCustomer)" ));
        }

    }
}

위와 같이 코드가 구현되었을 때 사용자가 최초 Customer2Asset을 접근했을 때
어떤 값이 출력이 될까요???

profile
Next Level

0개의 댓글