IT 야놀자/C #

프로퍼티 (Property)

주니어로빈 2019. 10. 25. 22:05
728x90
728x90

1. C++의 Set(). Get()

 

C++로 클래스를 만들면 보통 데이터의 은닉성을 위해

변수를 Private나 Protected로 선언하고 Set()과 Get() 함수로 변수를 읽고 쓰고 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyClass
{
private:
    int num;
public:
    void SetNum(int n) { num = n; }
    int GetNum()       { return num; }
}
 
void Main()
{
    MyClass _class;
 
    _class.SetNum(10);
    cout << _class.GetNum() << endl;
}
 

 

문제는 클래스의 변수가 많아질수록 Set(), Get() 함수로 도배되어져서 가독성도 떨어지고,

변수를 더 추가할 때마다 매번 Set(), Get() 함수를 작성해주어야하는 불편함이 있다.

은닉성은 지킬 수 있다지만 상당히 번거롭고 귀찮은 작업이다.

 

 

2. C#의 프로퍼티

 

c#에서는 이를 단순화하는 프로퍼티(Property)라는 변수를 제공한다.

C++의 클래스를 C#의 프로퍼티로 작성하면 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass
{
    private int num;
    public int Number;
    {
        set { num = value; }
        get { return num; }
    }
}
static void Main()
{
    MyClass _class = new MyClass();
    _class.Number = 10;
    Console.WriteLine(_class.Number);
}
 
 

 

(value이라는 변수는 미리 예약된 변수로 멤버변수에 대입하는 값이 자동으로 들어간다.)

C++에서 사용하던 Set(), Get() 함수를 뭐 나름 단순화시키긴 했다지만...

뭐 그닥 다른건 없는것 같다.;;;

그래서인지 C# 3.0 부터는 이를 더 단순화할 수 있는 자동구현(?) 프로퍼티를 제공한다.

 

 

3. 자동구현 프로퍼티

 

1
2
3
4
5
6
7
8
9
10
11
class MyClass
{
    public int num { set; get; }
}
 
static void Main()
{
    MyClass _class = new MyClass();
    _class.num = 10;
    Console.WriteLine(_class.num);
}
   
 

 

변수에 set; get; 만 넣어주면 알아서 set(), get() 함수를 자동 구현해준다.

그래서 자동구현 프로퍼티!

게다가 set을 빼고 get만 넣어주면 아주 쉽게 멤버변수를 읽기전용으로도 사용할수 있다.

 

 

4. 프로퍼티 변수 초기화

 

이뿐 아니라 객체 생성시에 손쉽게 프로퍼티 변수를 초기화할 수 있다는 편리함까지 제공한다.

클래스내에 프로퍼티 변수가 선언되어 있다면

생성자를 작성하지 않아도 객체 생성시에 초기화가 가능하며,

또한 원하는 프로퍼티만 골라서 초기화를 해줄 수 있다.

다음 예제를 참고하자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass
{
    public int num1 { set; get; }
    public int num2 { set; get; }
    public string name { set; get; }
    public int sum { get{ return num1 + num2 } }  // 읽기전용
}
 
static void Main()
{
    // 객체 생성시에 프로퍼티 변수 초기화 (매개변수는 ,로 구분)
    MyClass _class = new MyClass(num1=10, name="프로퍼티");
    _class.num2 = 20;
    Console.WriteLine(_class.sum);
}
                  
 

 

이 정도면 보기에도 심플하고, 사용하는데도 상당히 편리하다.

 

 


※ 인터페이스나 추상클래스를 상속받는 클래스를 정의하는 경우,

     인터페이스나 추상클래스 내의 프로퍼티는 메소드와 같이 반드시 정의해주어야 한다.

728x90
728x90