프로퍼티(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의 변수는 프로그래머는 참조할수 있는것은 아니다.)
참조
http://ufcpp.net/study/csharp/oo_property.html
'프로그래밍 > C#.net' 카테고리의 다른 글
계승 (0) | 2009.08.24 |
---|---|
정적변수,정적메소드 (0) | 2009.08.24 |
은폐 (0) | 2009.08.24 |
Constructor (0) | 2009.08.24 |
클래스 (0) | 2009.08.24 |
댓글