대문‎ > ‎GNOME 배우기‎ > ‎

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는 객체지향적으로 만들어졌지만 흔히 생각하는 객체지향과는 다소 차이가 있다. 이해를 돕기위해 객체지향스럽게 설명을 하고 있는것 뿐이니 이점을 유의하기 바랍니다.
Comments