Post List

2018/01/10

C#__6.0 프로퍼티(Property)

프로퍼티(Property) C#에서 클래스의 멤버변수에 접근하는 메서드 형태로 구현된 C#언어의 요소입니다.

 C/C++에서는 Public 멤버변수를 사용하거나, Get,Set 메서드를 추가하여 멤버변수에 접근하는 방법을 사용했을것입니다


1
2
3
4
5
6
7
8
9
10
class MyClass
{
public:
    void set(int value) { data = value; }
    int  get()          { return data; }
 
private:
    int data;
}
 
cs
이러한 방법은 멤버변수가 늘어날수록 Get,Set 메서드를 추가해주어야하고, Get,Set 많아질수록 가독성도 떨어지게 되겠죠.. 일일이 추가해주어야하는 번거로움도 있답니다. 하지만 외부에서 데이터를 쉽게 바꿀수가 없기때문에 은닉성은 보장된답니다.

하지만 C#에서는 이러한 점들을 보완하고 은닉성과 편의성을 둘다 가질 있는 방법을 제공합니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class 클래스 이름
{
    데이터타입 변수명;
    접근제한자 데이터타입 프로퍼티이름
    {
        get
        {
            // 데이터 반환
            return 변수명;
        }
 
        set
        {
            // value 예약
            변수명 = value;
        }
    }
}
 
cs
프로퍼티선언은  코드와 같이 선언됩니다.

샘플 코드로 먼저 보시겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Property
{
   private int idata;
   public  int Data
   {
       set { idata = value; }
       get { return idata;  }
   }
}
static void Main()
{
   Property prt = new Property();
   prt.Data = 2;
}
 
cs
래스 이름은 Property 하였습니다.. , 프로퍼티 Data안에 Get, set 접근자라고 합니다. Get 접근자는 멤버변수로부터 값을 읽어오고 Set 접근자는 멤버변수의 값을 대입합니다. 고로 int형의 idata 읽고 쓰는 프로퍼티가 되겠지요.
그리고 set접근자를 보시면 value 변수가 보입니다. Value 어디에도 선언되어있지도 않은데 어디서 나온걸까요?

여기서 value C#컴파일러가 set접근자의 암묵적 매개 변수로 간주합니다. 미리 예약된 변수이지요. 외부에서 넘겨받은값을 value 담아 idata 대입되어집니다.

또하나 말씀드릴부분은 get,set접근자를 반드시 사용해야하는것은 아닙니다 get 접근자만 사용하여 읽기전용으로 사용할 있고, set 접근자만 사용하여 쓰기 전용으로만 사용이 가능합니다.

하지만 이렇게 봤을땐 프로퍼티가 늘어나게되면 C++ 많이 다를게 없어보이기도 합니다.. 하지만 C# 3.0 이후부터는 간결하게 프로퍼티를 작성할 있게끔 기능이 추가되었습니다.

1
2
3
4
5
6
7
8
9
10
class Property
{
   public int idata { set; get; }
}
static void Main()
{
   Property prt = new Property();
   prt.idata= 2;
}
 
cs

코드를 보시면 매우 간결해진것을 확인하실수있습니다.

3줄이상이였던  코드가 한줄로 간추려졌습니다. set; get; 넣어주면 알아서 set,get 메서드를 자동으로 구현해준답니다.
하나만 추가하셔도되고 get 추가했을경우엔 읽기전용으로만 사용할 있답니다.


이번에는 객체를 생성할 매개 변수를 입력해서 객체의 멤버변수들을 초기화하는 방법을 알아보겠습니다.

1
2
클래스이름 변수명 = new 클래스이름() { 프로퍼티1 = 값, 프로퍼티2 = 값 };
 
cs
방법은 위와 같습니다

모든 프로퍼티를 넣을 필요는 없고, 초기화하고 싶은 프로퍼티만 넣으시면 됩니다.
생성자에 프로퍼티초기화를 하길경우 프로퍼티에 set접근자가 있어야 합니다. 혹은 set,get접근자가 아예 없는 Public 경우도 초기화가 가능하답니다.

1
2
Property prt = new Property() { idata = 3 };
 
cs
  

인터페이스에서도 프로퍼티의 사용이 가능하답니다. 여기서 프로퍼티를 가진 인터페이스를 상속받는 클래스는 반드시 해당 프로퍼티를 구현해야 하는 점이 있습니다.

1
2
3
4
5
6
7
8
interface 인터페이스이름
{
    public 데이터타입 프로퍼티이름1
    {
        get; set;
    }
}
 
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
interface PropertyInterface
{
    string strName
    {
        get; set;
    }
}
 
class Property : PropertyInterface
{
    public int idata;
 
    public int Data
    {
        set { idata = value; }
        get { return idata;  }
    }
 
    public string strName
    {
        get { return strName;  }
        set { strName = value; }
    }
}
cs
Property클래스는 PropertyInterface 상속받습니다. 인터페이스의 strName 프로퍼티를 클래스내에서 구현하지 않는다면 컴파일 애러가 발생한답니다그래서 반드시 인터페이스의 프로퍼티는 구현을 해주셔야합니다!

마지막으로 추상클래스에서의 프로퍼티를 알아보겠습니다.
추상클래스에서도 프로퍼티의 사용이 가능합니다. 구현된 프로퍼티를 가질 수도 있지만, 인터페이스처럼 구현되지 않은 프로퍼티도 가질 있지요. 이것을 추상 프로퍼티라고 부르는데, 추상 프로퍼티 역시 자식 클래스가 해당 프로퍼티를 반드시 구현해야한다는 점이있습니다. 인터페이스의 프로퍼티와 다를것이 없지요,
  
1
2
3
4
5
6
7
8
abstract class 추상클래스이름
{
    abstract 데이터타입 프로퍼티이름
    {
        get; set;
    }
}
 
cs
추상클래스에서 추상프로퍼티는 위와같이 사용할 있습니다. 샘플코드를 보시면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
abstract class PropertyAbstract
{
    abstract public string strName
    {
        get; set;
    }
}
class Property : PropertyAbstract
{
    public override string strName
    {
        set { strName = value; }
        get { return strName;  }
    }
}
 
cs
추상클래스의 프로퍼티에 abstract 키워드를 선언해주고 상속받은 클래스에 override 붙여 추상프로퍼티를 재정의 해줍니다.