위의 두가지를쉽게 말해주겠다. 먼저 프로그램을 띄우고 하면에 보여주려면 Window부터 하나 있어야한다. GtkWindow가 바로 그것이다. 이놈을 생성하는 방법을 잠시 보자.
GtkWidget* gtk_window_new (GtkWindowType type);
미리 말씀드렸듯이 return 타입이 GtkWidget* 즉 GtkWidget의 포인터다. gtk_window_new 함수내에서 메모리 영역을 동적으로 할당한뒤 이 주소를 반환하는것이다. 이때 GtkWindow 타입에 맞는 크기로 할당된다. GtkWindow는 GtkWidget을 상속받았기 때문에 GtkWidget으로 타입 캐스팅이 하여 반환하는것이 가능한 것이다.
1) 먼저 해당 타입에 맞게 메모리를 동적으로 할당한뒤,
2) 기본적인 사항들에 대해 처리하고,
3) GtkWidget의 포인터타입(GtkWidget*)으로 할당된 메모리의 주소를 반환한다.
새로운 메모리의 영역을 동적으로 할당한다. 생소할 수도 있겠으나 자세한것은 나중에 glib관련된 내용을 따로보면 이해가 쉽다. malloc과 동일하다고 보기는 힘들지만 메모리의 영역을 동적으로 할당하는 역할에 있어서는 같다고 보면 된다.
return GTK_WIDGET (window);
GTK_WIDGET 매크로를 이용하여 GtkWidget 타입으로 타입 캐스팅(업캐스팅)을 하여 반환한다. GTK_WIDGET() 매크로는 GtkWidget을 상속받은 포인터변수를 GtkWidget으로 타입 캐스팅을 한다. 받대로 GtkWidget을 GtkWindow으로 타입캐스팅(다운캐스팅)할때는 GTK_WINDOW()를 이용한다. 대부분의 구성요소들이 위와 같다. 실제 gtkwindow.h 소스를 보면 아래와 같이 정의되어 있다.