18. [C#,닷넷강좌]C#프로퍼티(Property), value,
C#/WPF/닷넷WPF/ASP.NET/ADO닷넷/닷넷교육/닷넷강좌학원/닷넷공부/닷넷책/닷넷객체지향교육
C#에서 프로퍼티란 스마트필드(Smart Field)라고도 하는데 멤버 필드에 값을 할당하는 방법으로 객체의 속성을 나타내는 필드의
특별한 형태이다. 기존의 VB나 VC++ 프로그래머들은 버튼이나 레이블 같은 것에서 색깔이나 크기 등을 설정 하거나 값을 얻어 내는데 한가지
속성을 이용한 다는 것을 알고 있을 것이다. C#에서는 이러한 것을 Language 차원에서 지원하고 있는데 이것이 바로 Property
이다.
프로퍼티는 실제 값을 가지고 있지 않는데 다만 프로퍼티를 이용하여 다른 멤버 변수의 값을 바꿀 수 있고 어떤 연산에 의해 값을 얻어 올
수도 있는 가상의 필드, Set과 Get 형식의 함수를 일반화한 형태로 생각 하면 될 것이다.
경우에 따라서 멤버 변수를 public으로 공개 할 수도 있겠지만 전통적인 객체 지향 프로그래밍에서는 보통 멤버들을 private으로
숨기고 그것에 대한 접근 가능한 메소드를 제공 함으로서 데이터를 보호 한다.
Property 형식
private 데이터 타입 변수명;
public 데이터 타입 속성명 { //속성멤버
set {
//속성 설정 구현
}
get {
//속성 반환 구현
}
} //속성
매개변수 value
set 함수 내에서 value라는 매개변수를 사용하며 외부에서 들어오는 값을 얻어낼 수 있는데 value는 set 접근자가 갖는 디폴트
매개변수이다.
아래의 예제를 보도록 하자.
using System;
class Triangle
{
private int
width;
private int
height;
private int
area;
public int
getWidth()
{
return
width;
}
public void
setWidth(int x)
{
width = x;
}
public int
getHeight()
{
return
height;
}
public void
setHeight(int y)
{
height =
y;
}
public int
getArea()
{
area = width *
height / 2;
return
area;
}
}
public class Test
{
static void
Main()
{
Triangle A = new
Triangle();
A.setWidth(4);
A.setHeight(3);
Console.WriteLine("면적은
{0} ", A.getArea());
}
}
위의 예제는 잘 돌아간다. 아쉬운 것이 있다면 필드에 값을 입력하고 조회하는데 메소드명을 알고 있어야 한다는 것이다.
만약 현재 삼각형의 밑변을 1만큼 증가 하고자 한다면 아래와 같이 해야 할 것이다.
A.setWidth(A.getWidth() + 1);
만약 이런 경우가 수시로 일어 난다면 아래와 같이 사용하고 싶은 욕구가 들것이다.
A.width=4;
A.width++;
그러나 객체 지향 프로그래밍의 특성상 데이터는 숨기는 것(private)이 원칙이므로 거의 불가능 한 얘기이다. 그래서 C#에서는
프로퍼티 라는 기능을 제공 하고 있다. 프로퍼티를 이용하면 위와 같이 값을 읽어 오고 설정 하는 부분을 클라이언트에서 모두 알고 있어야 하는
것과는 달리 마치 그것을 public 필드인 것처럼 이용 할 수 있다.
프로퍼티를 선언 하는 방법은 보통 필드처럼 선언 하고 메소드 처럼 중괄호({})안에 내용을 넣는다. 그 안에는 set과 get으로
나뉘어져 있는데 get 접근자는 외부로 값을 줄 때 즉 값이 읽혀 질 때 호출되며 set 접근자는 값을 설정하는 내용을 집어
넣는다.
위에서 구현한 예제를 프로퍼티를 이용하여 변경 해 보자.
using System;
class Triangle
{
private int
width;
private int
height;
private int
area;
public int
Width
{
get { return
width; }
set { width =
value;}
}
public int
Height
{
get { return
height; }
set { height =
value;}
}
public int
Area
{
get { return
width * height /2; }
}
}
public class Test
{
static void
Main()
{
Triangle A = new
Triangle();
A.Width =
4;
A.Height =
3;
Console.WriteLine("밑변은
{0} ", A.Width);
Console.WriteLine("높이는
{0} ", A.Height);
Console.WriteLine("면적은
{0} ", A.Area);
}
}
프로퍼티와 필드의 비교
프로퍼티와 필드는 값을 얻어 낼 수 있다는 부분에서 비슷하며 실제로 값을 얻어오는 방법도 같다. 하지만 프로퍼티는 실제 값을 가지고
있지 않으며 다른 필드의 값을 되돌려 줄뿐 메모리를 차지하고 있는 것은 아니다.
프로퍼티와 필드의 유사점
1. void 타입이 아닌
다른 타입으로 선언 한다.
class test {
int field;
int Property {
.. }
}
2. 접근 제한자와 같이 쓸
수 있다.
class test {
public int
field;
private int
Property {…}
}
3. static으로 선언 할
수 있다.
class test {
static public
int field;
static private
int Property {…}
}
4. 부모클래스의 멤버중 같은
이름의 멤버를 숨길 수 있다.
class Parent {
static public
int field;
static private
int Property { … }
}
class Child: Parent {
new public int
field;
new private int
Property;
}
5. 값을 할당 하거나 읽어
올 때 문법이 같다.
Test t = new Test();
t.field = 1000;
t.Property = 2004;
프로퍼티와 필드의 다른 점
1. 프로퍼티는 필드와 달리 메모리 상에서 값을 가지고 있지 않다. 그러므로 주소와 관련된 메소드 매개변수로서 사용은 불가능 하다.
함수에서 인자로 넘길 때 ref, out 등의 사용은 불가능 하다는 의미이다.
2. 프로퍼티는 괄호를 사용 하지 않는다.(메소드와 다르다)
class Test {
public int
Method(int a, int b) {}
public int
Property (int a, int b) {} //오류
}
3. 프로퍼티는 void 타입으로 쓸 수 없다.
class test {
public void
Method(int I, int j) {…}
public void
Property { … } //오류
}
static 프로퍼티
정적 프로퍼티는 static 제한자가 붙는다. 인스턴스와 관계없으며 클래스와 관련이 있다는 것을 의미하고 객체가 선언된 순간부터
존재하고 모든 인스턴스들이 공유하게 되는 것이다. 따라서 정적 프로퍼티 안에는 static으로 선언된 필드만이 올 수 있다.
댓글 없음:
댓글 쓰기