component event 는 아래에 올리셨네요.. class __property 에 연결된 함수 연결에 대하여 적어 봅니다.
제 블로그에 있는거 옮겨 copy 해 왔어요..
http://opensourceforge.tistory.com/368
이하 paste 된 문장.------------------------------------------------------------------------------
C++ Builder 의 class 에서 __property 에 의한 함수의 호출이 어떻게 이루어 지는지를 간략하게 설명하고자 한다.
우선 C++ Builder 의 c++ 키워드로 __property 가 있다. 키워드 중 __ 가 붙은 즉 _ 가 두개 붙은 경우는 해당 컴파일러 만의 기능인 것을 인식해야 한다. 즉 __property 는 VC++ 에는 없다. 만약에 있다고 하더라도 그 기능은 다를 수 있다.
일단 클래스 A 를 만들어 본다.
class A
{
int Fdata;
protected:
int getData()
{
return Fdata;
}
void setData(int v)
{
Fdata = v;
}
public:
__property int data = {read=getData,write=setData};
};
위와 같은 class 에 의하여 객체를 하나 만들어 보자.
A a;
이제 a 라는 객체는 int Fdata 라는 private member 변수를 하나 갖게 되며 getData() 와 setData 라는 member 함수를 갖게 된다.
우리가 클래스 객체에 있어서 내부 데이터의 접근 보호를 위하여 hiding 을 시키는 경우가 있으며 그 데이터 메모리에 접근 하는 방법을 제한적으로 설정하기를 원할 때가 있다. 이러한 경우 우리는 일반적인 c++ 프로그래밍에서 get 과 set 메소드를 만들어 접근하도록 하는 방법을 사용하고 있다.
이는 모든 객체 지향 프로그래밍의 기본으로 사용되고 있는 방식이다.
그러나 이러한 get 과 set 을 이용할 경우 우리는 함수의 형태를 갖는다는 것을 알 수 있으며 실제 접근 자체에서 해당 객체의 멤버함수의 호출 형식으로 이루어 진다.
C++ Builder 의 __property (Delphi 도 마찬가지) 는 바로 이러한 객체 멤버함수에 접근하는 방법을 변수 형식으로 일관된 이름을 통하여 구현하도록 해 주는 것이다.
즉 위의 class 에 의하여 만들어진 객체 a 에 대하여
a.getData() 에 의하여 Fdata 에 대한 read 접근, a.setData() 에 의하여 Fdata 에 대한 write 접근을 하게 된다. 이러한 연결 채널을
__property int data = {read=getData,write=setData};
가 해주는 것이다.
a.data 라는 property 에 우리는 두 가지의 접근이 있을 수 있다는 것을 알 수 있다.
1. write 접근
2. read 접근
write 접근 과 read 접근이 과연 무엇일까??? 별거 아니다. 바로 대입 연산자(operator)의 왼쪽에 있는 피 연산자(operand) 인지 오른쪽에 있는 피 연산자 인지를 나타낸다.. 대입 연산자의 왼쪽에 있으면 write 접근이고 오른쪽에 있으면 read 접근이 된다.
이렇게 어떤 메모리에 데이터가 갱신 되어질 경우와 해당 데이터를 읽어 오는 경우로 나뉘며 이를 분석하여 C++ Builder 는 a.data 에 대한 연결된 메소드를 어떤 것을 컴파일 시간에 링크하여 호출해야 할지를 컴파일러가 알아서 할당한 다는 것이다.
즉
int i = a.data; 와 a.data = 10; 에서 data 접근은 서로 다른 함수가 호출된다는 것이다.
나그네 님이 쓰신 글 :
: 두가지 종합입니다.
: 프로퍼티에 연결된 메서드로 이벤트를 만들어서 프로그램의 흐름 중간에서 이벤트를 발생사켜서 사용해보려고 합니다.
: 그런데 프로퍼티에 연결된 메서드만드는거 부터가 안되네요..
: 둘리.CSIEDA 님이 쓰신 글 :
: : TForm 에 OnMouseDown 과 같은 event 를 말씀하시는건가요??
: : 아니면 __property 에 연결된 class method 를 말씀하시는 건가요?
: :
: : 나그네 님이 쓰신 글 :
: : : C++빌더에 보면 이벤트 핸들러런게 있네요.. 실제로 C++빌더로 짠 프로그램도 이 이벤트에 따라 움직이고요..
: : : 그렇다면 사용자 정의 이벤트를 만들어 사용 할 수도 있을거 같은데.. 이벤트를 만드는 방법은 없나요?