보통 비관리 클래스를 정의할 때 캡슐화를
위해서 멤버 변수는 최대한 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
'C++/CLI' 카테고리의 다른 글
| [Step. 10] 이벤트 ( event ) (0) | 2010/08/20 |
|---|---|
| [Step. 09] 델리게이트 (delegate) (2) | 2010/08/12 |
| [Step. 08] 프로퍼티 ( property ) (8) | 2010/08/06 |
| [Step. 07] 비관리 클래스에서 관리 클래스를 멤버로, 관리 클래스에서 비관리 클래스를 멤버로 (0) | 2010/07/30 |
| [Step. 06-2] 관리코드의 문자열과 비관리코드의 문자열 변환 (3) | 2010/07/23 |
| [Step. 06-1] 관리코드의 문자열과 비관리코드의 문자열 변환 (3) | 2010/07/16 |




댓글을 달아 주세요
C++ CLI 문법이 정말 많이 좋아지고 있군요 ㅎㅎ
C#도 해당사항이 되나요?
네. C#도 해당되는 내용입니다. 다만, 언제든지 getter의 접근 제한자가 setter보다는 넓어야 한다는 제약이 붙습니다.
//C#의 경우
public int Test
{
get { ... } // public
private set { ... } // private
}
C++/CLI 공부를 해보면 좀 애매한면이 있지만 요즘 시대에 맞는 기능이 꽤 많아서 MS의 새로운 C++ 표준이라는 생각이 들기도 합니다. 아마 MS가 단독으로 새로운 C++ 표준을 만든다면 지금의 C++/CLI와 비슷한 모습이 될 것 같습니다(참고로 C++/CLI는 꼭 닷넷을 위해 만들어진 언어가 아닙니다).
아, 그리고 이건 개인적인 호기심인데, C#이나 VB.NET의 경우는 이벤트 프로퍼티에 대해서도 Custom Override를 지원하는데, C++ CLI도 이에 대응되는 문법 체계가 동일하게 존재하는지 궁금하네요. :-)
//C#의 경우
public event EventHandler MyEvent
{
add { ... }
remove { ... }
}
property 선언과 정의 나누기
ref class Character { ... }
가 *.h 파일에 선언되고
void Character::CharCd::set( int CharCd ) { ... }
void Character::CharCd::get() { ... }
가 *.cpp 파일에 정의되는 건가요?
public:
...
private:
...
글에 보면 이렇게 되어 있는데 public:과 private:는 같은 이름의 클래스에 들어 있는 건가요?
property 선언과 정의 나누기
void Character::CharCd::set( int CharCd ) 오타입니다.
void Character::CharCd::set( int nCharCd )로 고쳐야 합니다.