.Net Framework/C#2010. 2. 18. 00:07


프로퍼티(property)는 자바나 C++에는 없는 기능으로, 클래스외부에서 보면 멤버변수처럼 보이고,클래스내부에서 보면 메소드처럼 보이는 것이다.

 

■프로퍼티사용법

엑세스레벨 형 프로퍼티이름
{
  set
  {
    //  set엑세서
    //  여기에 값이 변경될때 처리를 쓴다.
    //  value 라고 하는 이름의 변수에 대입된 값이 들어간다.
  }
  get
  {
    //  get엑세서
    //  여기에 값을 얻을때 처리를 쓴다.
    //  메소드의 경우와 같이 값은 return 키워드를 사용해서 돌려준다.
  }
}

예를 들어 실제로 클래스를 이용하는 쪽의 코드는 복잡해진다.

■프로퍼티를 사용하지 않은 클래스

using System;
//실체를 숨겨서 만든 복소수 클래스

class Complex
{

  //실체는 외부에서 숨김(private로 해놓는다.)
  private double re; // 실수부를 기억해 놓는다.
  private double im; // 허수부를 기억해 놓는다.
  public double Re(){return this.re;}    // 실수부를 꺼낸다.

  public void Re(double x){this.re = x;} // 실수부를 바꿔쓴다.
  public double Im(){return this.im;}    // 허수부를 꺼낸다.
  public void Im(double y){this.im = y;} // 허수부를 바꿔쓴다.

  public double Abs(){return Math.Sqrt(re*re + im*im);}  // 절대값을 꺼낸다.
}

// 클래스를 사용하는 쪽
class ConcealSample
{
  public static void Main()
  {
    // x = 5 + 1i
    Complex x = new Complex();
    x.Re(5);  // x.re = 5
    x.Im(1);  // x.im = 1

    // y = -2 + 3i
    Complex y = new Complex();
    y.Re(-2); // y.re = -2
    y.Im( 3); // y.im =  3

    Complex z = new Complex();
    z.Re(x.Re() + y.Re()); // z.re = x.re + y.re
    z.Im(x.Im() + y.Im()); // z.im = x.im + y.im

    Console.Write("|{0} + {1}i| = {2}\n", z.Re(), z.Im(), z.Abs());
    // |3 + 4i| = 5 로 표시됨

  }
}

위의 복소수 클래스를 프로퍼디를 이용해서 바꿔쓰면 아래와 같다.

■프로퍼티를 사용하는 클래스

using System;
// 클래스정의
class Complex
{
  // 실체를 외부로 부터 숨김(private로 해놓는다.)
  private double re; // 실수부를 기억해 놓는다.
  private double im; // 허수부를 기억해 놓는다.

  // 실수부 취득,변환용 프로퍼티
  public double Re
  {
    set{this.re = value;}
    get{return this.re;}
  }
  /* 위의 코드의 의미는 아래와 같다.
  public void SetRe(double value){this.re = value;}
  public double GetRe(){return this.re;}
  메소드와 같은 감각으로 사용한다.
  */

  // 실수부를 취득,변환용의 프로퍼티
  public double Im
  {
    set{this.im = value;}
    get{return this.im;}
  }

  // 절대값의 취득용 프로퍼티
  public double Abs
  {
    // 읽기 전용 프로퍼티
    // set 블록을 쓰지 않는다.
    get{return Math.Sqrt(re*re + im*im);}
  }
}

// 클래스를 이용하는 쪽
class PropertySample
{
  public static void Main()
  {
    Complex c = new Complex();
    c.Re = 4; // Re프로퍼티의 set 엑세스를 불러낸다.
    c.Im = 3; // Im프로퍼디의 set 엑세스를 불러낸다.
    Console.Write("|{0} + ", c.Re); // Re프로퍼티의 get엑세스를 불러낸다.
    Console.Write("{0}i| =", c.Im); // Im프로퍼티의 get엑서스를 불러낸다.
    Console.Write(" {0}\n", c.Abs); // Abs프로퍼디의 get엑세스를 불러낸다.
  }
}

■get/set에 다른 엑세스레벨을 설정

Ver.2.0
C#2.0에서 부터 프로퍼티 엑세스의 get/set 에 다른 엑세스레벨을 설정하는 것이 가능하게 되었다.
예를 들어,

class A
{
  private int n;

  public int N
  {
    get{ return this.n; }
    protected set{ this.n = value; }
  }
}

■자동프로퍼티

Ver.3.0
C#3.0 에서는 프로퍼티 get/set의 내용을 생략해도 될수있게 되었다.
이 기능을 자동프로퍼티(auto-property,auto-implemented property)라고 한다.
예를 들면,
public string Name { get; set; }
이라고 쓰면,
private string __name;
public string Name
{
  get { return this.__name; }
  set { this.__name = value; }
}
위와 같은 코드가 자동적으로 생성되어진다.(__name의 변수는 프로그래머는 참조할수 있는것은 아니다.)

 

'.Net Framework > C#' 카테고리의 다른 글

ReleaseComObject() 와 Dispose()  (0) 2010.06.07
Excel 사용시.. 초간단 요약  (0) 2010.06.04
Callback 함수  (0) 2010.02.18
String.Format - 화폐 단위처리  (0) 2010.02.18
참조 추가 또는 제거  (0) 2010.02.18
Posted by Tiwaz