2012년 10월 28일 일요일

GObject의 property 정의 및 사용


처음 올린 글은 GObject의 subclass로 StudentInfo 를 정의하는 방법을 설명했습니다. 덧붙여, 각종 macro와 객체 초기화 및 정리 코드에 대한 내용도 설명했습니다.

이제 두번째로 StudentInfo 에서 선언했던 property에 대한 설명과 실제로 StudentInfo를 사용하는 예제를 보여드리려 합니다.

다음 코드는 첫번째 글의 Figure 4에서 가져온 것입니다.
Figure 2.1

위 코드는 student_info_class_init에서 property를 정의한 부분을 가져온 것입니다. 두개의 properties가 있는데, "name" 과 "address"를 정의합니다. g_param_spec_string 은 string (gchar *)값을 가지는 property를 나타냅니다. 함수의 정의는 링크를 참조하세요. 링크된 페이지를 보면, 비슷한 류의 다른 함수들도 보입니다. 

135 줄의 코드를 설명하면, 이름은 "name"이고, 별명도 "name"인 읽고 쓰기가 가능한 property를 정의하고 있습니다. 그리고 정의된 "name" 과 "address" 를 151 줄에서 등록하고 있습니다.
Figure 2.2 - StudentInfo.h

Figure 2.2는 Figure 2.1에 정의된 enum 값을 보여주고 있습니다. 그리고 props 변수는 보통 객체를 정의하는 StudentInfo.c 파일에 다음처럼 선언합니다.
GParamSpec 정의 참조

일단 위처럼 정의된 property는 set/get method를 통해서 access 하게 됩니다.
Figure 2.3

set/get 함수는 Figure 2.3에서 보는 것처럼 정의하는데, static으로 정의된 것에서 알 수 있듯이 이 set/get 함수를 직접 호출하는 경우는 없습니다. g_object_set_property(GObject *obj, const gchar *property_name, const GValue *value) 함수를 호출하면 obj에 해당하는 _set_property () 함수가 호출되는 것입니다. 따라서 여기서는 g_object_set_property를 호출하면 내부적으로 student_info_set_property가 호출됩니다. get_property 함수도 마찬가지 입니다.

이제 지금까지 만들었던 StudentInfo class를 직접 사용하는 예는 다음과 같습니다.
Figure 2.4

위 코드를 실행시키면 다음과 같은 출력을 얻을 수 있습니다.
Figure 2.5

위 출력은 이제까지 설명한 코드들에 있었던 g_print 문장의 결과입니다. 출력문을 보면, StudentInfo 객체의 name을 "다니엘"로, address를 "서울"로 만들고 곧바고 그 객체를 destroy하는 것을 보여주고 있습니다.

그럼, Figure 2.4의 코드를 봅시다. GValue는 다양한 type의 값을 담을 수 있는 container 입니다. g_value_init으로 담을 값의 type을 지정해 주고, g_value_set_ 계열의 함수로 값을 설정합니다. 물론 대응되는 g_value_get_ 계열의 함수로 값을 얻어올 수도 있습니다.

위 코드는 이렇게 설정된 val로 name과 address를 설정하고 있습니다. 그리고 80 줄에서 설정된 name 과 address를 출력하고 84 줄에서 StudentInfo 객체를 destroy하고 함수를 종료합니다.

70 줄의 g_value_reset 함수는 그 아래에 주석처리한 g_value_unset 함수와 g_value_init 함수를 연달아 부른 것과 같은 효과를 가집니다. (자세한 내용은 링크 참조.)

지금까지 GObject의 subclass로서 StudentInfo 객체를 정의하고, 그 객체에 필요한 property를 정의하고 사용하는 법을 다루어 봤습니다.

다음 세번째 글에서는 inheritance 에 대해서 다루어볼 예정입니다.