Widget의 생성

1. GTK에서는 화면의 구성요소를 생성하면 GtkWidget으로 반환한다.

Widget의 생성은 동적으로 메모리의 영역을 할당한다.

Widget의 생성함수 반환(return)타입은 GtkWidget의 포인터이다.

    • 위의 두가지를쉽게 말해주겠다. 먼저 프로그램을 띄우고 하면에 보여주려면 Window부터 하나 있어야한다. GtkWindow가 바로 그것이다. 이놈을 생성하는 방법을 잠시 보자.
      • GtkWidget* gtk_window_new (GtkWindowType type);
    • 미리 말씀드렸듯이 return 타입이 GtkWidget* 즉 GtkWidget의 포인터다. gtk_window_new 함수내에서 메모리 영역을 동적으로 할당한뒤 이 주소를 반환하는것이다. 이때 GtkWindow 타입에 맞는 크기로 할당된다. GtkWindow는 GtkWidget을 상속받았기 때문에 GtkWidget으로 타입 캐스팅이 하여 반환하는것이 가능한 것이다.
    • 1) 먼저 해당 타입에 맞게 메모리를 동적으로 할당한뒤,
    • 2) 기본적인 사항들에 대해 처리하고,
    • 3) GtkWidget의 포인터타입(GtkWidget*)으로 할당된 메모리의 주소를 반환한다.
      • GtkWidget*
      • gtk_window_new (GtkWindowType type)
      • {
      • GtkWindow *window;
      • g_return_val_if_fail (type >= GTK_WINDOW_TOPLEVEL &&
      • type <= GTK_WINDOW_POPUP, NULL);
      • window = g_object_new (GTK_TYPE_WINDOW, NULL);
      • window->type = type;
      • return GTK_WIDGET (window);
      • }
    • 해당 함수의 내용이다.
      • GtkWindow *window;
    • 먼저 GtkWindow 타입의 포인터변수를 선언한다.
      • window = g_object_new (GTK_TYPE_WINDOW, NULL);
    • 새로운 메모리의 영역을 동적으로 할당한다. 생소할 수도 있겠으나 자세한것은 나중에 glib관련된 내용을 따로보면 이해가 쉽다. malloc과 동일하다고 보기는 힘들지만 메모리의 영역을 동적으로 할당하는 역할에 있어서는 같다고 보면 된다.
      • return GTK_WIDGET (window);
    • GTK_WIDGET 매크로를 이용하여 GtkWidget 타입으로 타입 캐스팅(업캐스팅)을 하여 반환한다. GTK_WIDGET() 매크로는 GtkWidget을 상속받은 포인터변수를 GtkWidget으로 타입 캐스팅을 한다. 받대로 GtkWidget을 GtkWindow으로 타입캐스팅(다운캐스팅)할때는 GTK_WINDOW()를 이용한다. 대부분의 구성요소들이 위와 같다. 실제 gtkwindow.h 소스를 보면 아래와 같이 정의되어 있다.
      • #define GTK_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
      • GTK_TYPE_WINDOW, GtkWindow))
    • 비슷한 예로 GtkLabel을 GtkWidget으로 바꿀때는 GTK_WIDGET(label) 반대는 GTK_LABEL(widget)이다. 매크로를 외울필요는 없다.
    • ***** 참고 ***
    • (GtkWidget*) window 와 같은 방법으로 타입캐스팅이 가능하지만 별로 권장하지는 않는다.
    • 가급적 매크로가 있다면 매크로를 사용하자.
    • *************************************************************************************
    • 위젯의 생성밥법을 참 길게 설명했는데 개략적인 내용이라도 이해해야한다.
    • 모든 위젯은 GtkWidget을 상속받고 생성함수 리턴타입은 GtkWidget의 포인터이며 타입캐스팅은 쉽게 유추가능한 이름을 쓴다.
      • GtkWidget *widget;
      • widget = gtk_window_new(어쩌구);
    • 더 간단하게는 위와같은 코드만 알아도 윈도우를 생성할 수 있고 언급한 몇가지만 알아도 당장의 프로그램을 작성은 가능하겠지만 나중을 생각해서라도 "아 이게 대략 이런 저런 과정을 거치는구나" 정도는 알아두시는게 좋다.

2. 정리 해보자

    • Widget의 생성함수 반환(return)타입은 GtkWidget의 포인터이다.
    • Widget의 생성은 메모리를 동적으로 할당하고 기본적인 사항을 처리한뒤 GtkWidget* 으로 반환한다.
    • 타입캐스팅은 대부분 매크로를 통해 이루어지며 매크로는 유추하기 쉽게 구성되어있다.
    • GTK는 객체지향적으로 만들어졌지만 흔히 생각하는 객체지향과는 다소 차이가 있다. 이해를 돕기위해 객체지향스럽게 설명을 하고 있는것 뿐이니 이점을 유의하기 바랍니다.