[Step. 08] 프로퍼티 ( property )
보통 비관리 클래스를 정의할 때 캡슐화를
위해서 멤버 변수는 최대한 private 접근으로 한 후 외부에서의 접근을 위해서 get과 set 멤버 함수를 정의합니다.
class
Character
{
public:
…….
void SetCharCd( const int nCharCd ) {
m_nCharCd = nCharCd; }
int GetCharCd() { return m_nCharCd; }
…….
private:
int m_nCharCd;
…….
};
클래스의 멤버를 하나 정의할 때마다 그에
대응하는 get, set 멤버 함수를 정의하는 것은 좀 귀찮은 일이기도 합니다. 그래서 관리코드에서는 이 작업을 쉽게 해주는 property가 생겼습니다.
ref class
Character
{
public:
…….
property int CharCd
{
void set( int nCharCd ) { m_nCharCd = nCharCd; }
int get() { return m_nCharCd; }
}
…….
private:
int m_nCharCd;
…….
};
위 코드에서는 get과 set을 둘 다 정의 했는데 둘 중 하나만 정의 해도 괜찮습니다.
또 위의
set은 아주 간단하게 그냥 대입만 하고 있는데 좀 더 로직을 넣을 수도 있습니다.
ref class
Character
{
public:
…….
property int CharCd
{
void set( int nCharCd )
{
if( nCharCd < 0 ) {
m_nCharCd = 0;
} else {
m_nCharCd = nCharCd;
}
}
int get() { return m_nCharCd; }
}
…….
private:
int m_nCharCd;
…….
};
property 선언과 정의 나누기
일반적으로 클래스의 멤버 선언은 헤더 파일에
정의는 cpp 파일에 하듯이 property도 선언과 정의를
나눌 수 있습니다.
ref class
Character
{
public:
…….
property int CharCd
{
void set( int nCharCd );
int get();
}
…….
private:
int m_nCharCd;
…….
};
void
Character::CharCd::set( int nCharCd )
{
if( nCharCd < 0 ) {
m_nCharCd = 0;
} else {
m_nCharCd
= nCharCd;
}
}
void
Character::CharCd::get()
{
return m_nCharCd;
}
get과 set의 접근
지정자 다르게 하기
위에서
property를 정의할 때 get과 set은
모두 public 였습니다.
이것을 각각 다르게 접근 지정자를 정할 수
있습니다.
ref class
Character
{
public:
…….
property int CharCd
{
protected:
void set( int nCharCd )
{
if( nCharCd < 0 ) {
m_nCharCd = 0;
} else {
m_nCharCd = nCharCd;
}
}
public:
int get() { return m_nCharCd; }
}
…….
private:
int m_nCharCd;
…….
};
참고
http://cppcli.shacknet.nu/cli:property
http://vene.wankuma.com/prog/CppCli_Property.aspx