[C#의 기초] 프로퍼티 (Property)

안녕하세요. 임성윤입니다

 

클래스에는 접근 제한자라는 것이 있습니다. (접근 제한자) 이 접근 제한자을 사용하면 멤버의 접근을 허용하거나 불가능하게 하여 중요한 멤버들을 외부로부터 보호할 수 있다고 했었습니다. 모든 멤버에 대해서 외부에서 자유롭게 접근할 수 있다면, 원하지 않는 잘못된 값이 들어오거나 나가거나 할 것입니다. 이 문제의 해결책은 프로퍼티를 통해서 해결 할 수 있습니다.

 

프로퍼티를 사용하면 내부적으로는 메소드의 형태로 외부적으로는 클래스 멤버 변수의 형태로 객체의 상태에 접근할 수 있게 됩니다. 프로퍼티는 또 하나의 기능을 가지고 있습니다. 클래스에는 없는 멤버 변수를 계산된 형태로 값을 리턴 시킬 수 있다는 것입니다.

 

프로퍼티를 정의해보도록 하겠습니다.

 

private string num;

public string Num

{

    get { return num; }

    set { num = value; }

}

[예제 1] 프로퍼티 정의

 

프로퍼티는 필드를 선언하는 방법과 유사하지만 { } 블록안에, get, set 접근자(Accessor)를 추가하면 됩니다. 프로퍼티의 선언은 파라미터가 없는 메소드와 동일하지만 get, set 이라는 내부 메소드가 들어있다는 것이 다릅니다. get 블록은 프로퍼티의 값을 읽어서 리턴시키는 역할을 하며, set블록은 값을 변경 시키는 코드를 작성합니다.

 

프로퍼티는 get set 메소드들의 조합에 따라 아래와 같이 나뉠 수 있습니다.

 

1.     프로퍼티 안에 get set 메소드가 모두 정의 되었다면, 읽기 및 쓰기 모두 허용하는 프로퍼티가 됩니다.

2.     get 메소드만 정의 되어 있다면 읽기만 허용하는 프로퍼티가 됩니다.

3.     set 메소드만 정의 되어 있다면 쓰기만 허용하는 프로퍼티가 됩니다.

4.     프로퍼티의 선언을 정적으로 한다면 객체를 생성할 필요가 없는 정적 프로퍼티가 됩니다. 이렇게 선언된 프로퍼티는 this 키워드를 사용할 수 없고 static 앞에 virtual, abstract, override 키워드를 사용 할 수 없습니다.

5.     클래스 멤버 변수 뿐만 아니라 클래스 멤버 변수들 간의 연산 이나 멤버 변수와 상관 없는 별도의 연산을 사용해서 존재하지 않는 프로퍼티도 생성할 수 있습니다.

 

샘플을 보면서 이야기를 계속 하도록 하겠습니다.

 

    1 using System;

    2 

    3 namespace PropertyEx

    4 {

    5     class propertyEx

    6     {

    7         private static int num = 0;

    8         private string namePlus = "";

    9 

   10         //읽기, 쓰기 가능한 Property

   11         public string NamePlus

   12         {

   13             get { return namePlus + ""; }

   14             set { namePlus = value; }

   15         }

   16         //계산 Property

   17         public int Num

   18         {

   19             get { return num++; }

   20         }

   21     }

   22     class Program

   23     {

   24         static void Main(string[] args)

   25         {

   26             propertyEx pex = new propertyEx();

   27             pex.NamePlus = "임성윤";

   28 

   29             Console.WriteLine("Num={0}, name = {1}", pex.Num, pex.NamePlus);

   30 

   31             propertyEx pex2 = new propertyEx();

   32             pex2.NamePlus = "홍길동";

   33             Console.WriteLine("Num={0}, name = {1}", pex2.Num, pex2.NamePlus);

   34 

   35             Console.ReadLine();

   36         }

   37     }

   38 }

[예제 2] 프로퍼티 구현 예

 

[그림 1] 예제 2의 결과

 

예제 2 11라인에는 get, set 메소드를 사용하여 읽기 및 쓰기가 가능한 또, 17라인에는 계산된 속성을 표현한 프로퍼티 구현 예제 입니다.

 

마지막으로 프로퍼티에 대해서 간단하게 정리하고 이번 강좌를 마칠까 합니다. 프로퍼티는 필드처럼 보이지만 실제로는 메서드이며 내부적으로도 메서드로 구현됩니다. 이는 프로퍼티가 필드와 구분되는 가장 큰 이유인거 같습니다. 프로퍼티는 값에 의한 전달만이 가능합니다. (실제로 기억 장소가 할당되어 있지 않다.)

 

읽어 주셔서 감사합니다. 수고하셨습니다.

Posted by 임성윤 (err@live.it, errblog)

By err 6/8/2008 2:16:32 PM