맨위로가기

GObject

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

GObject는 GNOME 프로젝트의 핵심적인 객체 지향 시스템으로, GLib와 표준 C 라이브러리에 의존하며 GTK, Pango, ATK, GStreamer 등 다양한 GNOME 라이브러리와 애플리케이션에서 널리 사용된다. GTK+ 2.0 이전에는 GTK 코드베이스의 일부였지만, 이후 독립적인 라이브러리로 분리되어 GUI뿐만 아니라 CUI 및 서버 애플리케이션에서도 활용된다. GObject는 런타임 형식 시스템인 GType을 통해 객체의 런타임 정보를 관리하며, 클로저와 시그널을 기반으로 하는 메시징 시스템을 갖추고 있다. GObject는 C++ 및 Objective-C와 같은 다른 객체 지향 언어와 비교되며, C++와 달리 다중 상속을 지원하지 않고 GLib의 메모리 할당 함수를 사용하며, 시그널 프로그래밍에 중점을 둔다. GObject는 언어 바인딩을 쉽게 만들 수 있어 C++, Java, Python 등 다양한 언어에서 사용되며, GIMP와 같은 자유 소프트웨어 프로젝트에서 활용된다.

더 읽어볼만한 페이지

  • GTK - Pango
    Pango는 텍스트 렌더링 라이브러리로, OpenType 기능을 지원하여 텍스트 렌더링의 유연성을 높였으며, 리눅스, GTK 툴킷, 모질라 제품군 등 다양한 소프트웨어에서 사용되고 2006년 Cairo에 통합되어 다양한 플랫폼에서 텍스트와 그래픽 렌더링을 지원한다.
  • GTK - GLib
    GLib는 C 프로그래밍 언어를 위한 라이브러리로서, 자료 구조, 유틸리티 함수, 스레딩, 국제화 기능 등을 제공하며, 크로스 플랫폼 환경을 지원하여 다양한 운영체제에서 사용 가능하다.
  • C 라이브러리 - OpenSSL
    OpenSSL은 1998년에 설립된 암호화 도구 프로젝트로, 다양한 암호화 알고리즘과 프로토콜을 지원하며, 아파치 라이선스를 채택했고, 보안 문제와 API 호환성 문제 등의 비판을 받았다.
  • C 라이브러리 - SQLite
    SQLite는 D. 리처드 히프가 설계한 서버리스 구조의 임베디드 SQL 데이터베이스 엔진으로, 별도의 DBMS 없이 프로그램에 통합되어 작동하며 전체 데이터베이스를 단일 파일로 저장하는 특징이 있고, 다양한 운영체제와 환경에서 널리 사용된다.
  • 그놈 - 자바 데스크톱 시스템
  • 그놈 - 그놈 셸
    그놈 셸은 그놈 데스크톱 환경의 그래픽 셸로, Mutter를 기반으로 하며 JavaScript로 작성된 플러그인 형태로 구성되어 다양한 그래픽 요소와 사용자 인터페이스를 제공하고, 확장 기능을 통해 기능을 변경할 수 있다.
GObject - [IT 관련 정보]에 관한 문서
기본 정보
GObject 로고
GObject 로고
개발자그놈 재단
최초 릴리스2002년 3월 11일
최신 안정화 버전(정보 없음, 문서에 명시되지 않음)
프로그래밍 언어C
운영 체제크로스 플랫폼
플랫폼크로스 플랫폼
언어다국어
장르소프트웨어 라이브러리
라이선스GNU LGPL
웹사이트GObject 공식 웹사이트

2. 역사

GLib와 libc에만 의존하는 GObject는 GNOME의 기초로서 GTK, Pango, Accessibility Toolkit, 많은 GNOME 라이브러리 및 애플리케이션 등 광범위하게 사용된다. GTK 2.0 이전에는 GObject의 코드는 GTK+의 일부였으며, 당시에는 GObject라고 불리지 않고 기본 클래스는 `GtkObject`라고 불렸다.

GTK 2.0 릴리스 시, 객체 시스템을 범용 유틸리티로 만들기 위해 별도의 라이브러리로 분리하였다. 그 과정에서 GUI와 관련 없는 `GtkObject` 클래스의 대부분은 새로운 기본 클래스인 `GObject`로 옮겨졌다. 2002년 3월 11일 GTK 2.0이 릴리스된 이후, GObject는 독립적인 라이브러리로서 CUI 애플리케이션 및 서버 애플리케이션에도 널리 사용되고 있다.

2. 1. 초기 역사

GLib와 libc에만 의존하는 GObject는 GNOME의 초석이며, GTK, Pango, ATK, GStreamer 및 애플리케이션과 같은 대부분의 상위 수준 GNOME 라이브러리 전체에서 사용된다. GTK+ 2.0 이전에는 GObject와 유사한 코드가 GTK 코드베이스의 일부였다. ("GObject"라는 이름은 아직 사용되지 않았고, 일반적인 기본 클래스는 `GtkObject`라고 불렸다.)

GTK+ 2.0이 출시되면서 객체 시스템은 일반적인 유용성으로 인해 별도의 라이브러리로 추출되었다. 이 과정에서 `GtkObject` 클래스의 대부분의 비 GUI 관련 부분은 새로운 공통 기본 클래스인 `GObject`로 이동했다. 2002년 3월 11일(GTK+ 2.0 출시일)부터 별도의 라이브러리로 존재해 온 GObject 라이브러리는 이제 명령줄 및 서버 애플리케이션과 같은 많은 비 GUI 프로그램에서 사용된다.

2. 2. 분리 및 발전

GTK+ 2.0 출시와 함께 객체 시스템은 범용적인 유용성을 위해 별도의 라이브러리인 GObject로 추출되었다. 이 과정에서 `GtkObject` 클래스에서 GUI와 관련 없는 대부분의 부분은 새로운 공통 기본 클래스인 `GObject`로 이동했다. 2002년 3월 11일(GTK+ 2.0 출시일)부터 별도의 라이브러리로 존재해 온 GObject 라이브러리는 명령줄 및 서버 애플리케이션과 같은 많은 비 GUI 프로그램에서도 널리 사용되고 있다.

3. GLib와의 관계

GObject는 자체적인 문서 집합[1]을 가지고 있으며, 일반적으로 자체 공유 라이브러리 파일로 컴파일되지만, GObject의 소스 코드는 GLib 소스 트리에 있으며 GLib와 함께 배포된다. 이러한 이유로 GObject는 GLib 버전 번호를 사용하며 일반적으로 GLib와 함께 패키지된다(예: 데비안은 GObject를 `libglib2.0` 패키지 계열에 넣는다).[9]

4. 형 시스템

GObject 프레임워크의 가장 기본적인 수준에는 GType이라는 일반적이고 동적인 형식 시스템이 있다. GType 시스템은 모든 객체의 런타임 설명을 유지하여 글루 코드가 여러 언어 바인딩을 용이하게 한다. 이 형식 시스템은 단일 상속 클래스 구조뿐만 아니라 불투명 포인터, 문자열, 다양한 크기의 정수 및 부동 소수점 수와 같은 '비클래스' 형식도 처리할 수 있다.[9]

형식 시스템은 등록된 모든 형식에 속하는 값을 복사, 할당 및 삭제하는 방법을 알고 있다. 참조 계산된 객체를 "복사"하면 일반적으로 참조 횟수만 증가하며, 문자열과 같이 복잡하고 참조 계산되지 않은 객체를 복사할 때는 메모리 할당을 통해 실제 복사본을 생성한다.[9]

이러한 기본 기능은 형식 시스템이 알고 있는 모든 형식의 값을 저장할 수 있는 일반 컨테이너 유형인 `GValue`를 구현하는 데 사용된다. 이러한 컨테이너는 모든 기본값이 태그된 유니온 컨테이너에 있는 동적으로 형식화된 언어 환경과 상호 작용할 때 특히 유용하다.[9]

4. 1. 기본형

GType 시스템의 기본형은 클래스와 관련이 없는 ''비클래스'' 형과 클래스와 관련된 ''클래스'' 형으로 나뉜다.

GLib 2.9.2[2][10]부터, ''비클래스'' 내장 기본 타입은 다음과 같다.

타입설명
G_TYPE_NONE빈 타입, C의 `void`에 해당한다.
G_TYPE_CHAR, G_TYPE_UCHAR, G_TYPE_INT, G_TYPE_UINT, G_TYPE_LONG, G_TYPE_ULONG, G_TYPE_INT64, G_TYPE_UINT64정수 타입, C의 부호 있는 및 부호 없는 `char`, `int`, `long`, 그리고 64비트 정수에 해당한다.
G_TYPE_BOOLEAN부울형
G_TYPE_ENUM, G_TYPE_FLAGS열거형 타입과 "플래그" 타입, 둘 다 C의 `enum` 타입에 해당하지만, 후자는 비트 필드에만 사용된다.
G_TYPE_FLOAT, G_TYPE_DOUBLEIEEE 부동 소수점 타입, C의 `float` 및 `double`에 해당하는 단정밀도 및 배정밀도 부동 소수점 수이다.
G_TYPE_STRING문자열 타입, C의 `char *`에 해당한다.
G_TYPE_POINTER불투명 포인터 타입, C의 `void *`에 해당한다.



''클래스'' 내장 기본 타입은 다음과 같다.

타입설명
G_TYPE_OBJECT기본 클래스 타입, 표준 클래스 상속 트리의 루트인 GObject의 인스턴스에 대한 기본 클래스 타입이다.
G_TYPE_INTERFACE기본 인터페이스 타입, 표준 인터페이스 상속 트리의 루트를 나타낸다.
G_TYPE_BOXED박스형 구조체 타입, 단순 값 객체나 외부 객체를 참조 카운트된 "박스"에 래핑하는 데 사용된다.
G_TYPE_PARAM"매개변수 명세 객체" 타입, GObject에서 객체 속성에 대한 메타데이터를 설명하는 데 사용된다.


4. 2. 파생형

GObject의 기본 유형에서 파생된 유형은 크게 네 가지로 나뉜다.

  • 열거형 및 플래그형: 객체 속성으로 사용되는 열거형(enum)이나 정수 기반 비트 필드 유형은 형식 시스템에 등록해야 한다.
  • 박스형: 클래스로 만들기에는 단순하지만 형식 시스템에 등록해야 하는 데이터 구조체에 사용된다.
  • 불투명 포인터형: 복사나 해제가 필요 없는 객체에 사용되며, 단순 포인터로 처리된다.
  • 클래스 및 인터페이스형: `GObject`를 직간접적으로 상속하는 클래스들이다.


이러한 유형들은 `glib-mkenums`[3] 도구를 통해 자동 생성되는 코드로 등록할 수 있다.

4. 2. 1. 열거형 및 플래그형

객체 시스템과 관련하여 사용하려는 모든 열거형 및 정수 기반 비트 필드 유형은 형식 시스템에 등록해야 한다. 객체의 속성 유형 등이 이에 해당한다. 일반적으로 이러한 유형의 등록을 수행하는 초기화 코드는 `glib-mkenums`[11]라는 도구로 자동 생성되어 별도의 파일에 저장된다.

4. 2. 2. 박스형

완전한 클래스형으로 만들기에는 너무 단순한 데이터 구조이지만, 형 시스템에 등록할 필요가 있는 것이다. 예를 들어, 어떤 클래스에 `background-color`라는 속성을 추가하고 싶다고 가정할 때, 그 값은 `struct color { int r, g, b; }`와 같은 데이터 구조의 인스턴스이다. 이것을 `GObject`의 서브클래스로 만들고 싶지 않은 경우, 박스화형으로 나타내어 복사 및 해제와 같은 기능을 제공할 수 있다. GObject에는 GLib의 단순한 데이터형을 감싼 각종 박스화형이 처음부터 갖춰져 있다. 박스화형은 외부 객체의 태그가 붙은 컨테이너로도 사용할 수 있다.[11]

4. 2. 3. 불투명 포인터형

복사하거나 해제할 필요가 없는 객체는 불투명 포인터(G_TYPE_POINTER)로 취급할 수 있지만, 파생 포인터형을 생성하여 특정 용도의 객체임을 나타낼 수 있다.[11]

4. 2. 4. 클래스 및 인터페이스 형

GObject 애플리케이션에서 대부분의 형은 클래스형이며, 일반적인 객체 지향적인 관점에서 보면 루트 클래스인 `GObject`에서 직접 또는 간접적으로 파생된다. 자바 스타일의 인터페이스도 있지만, 2006년 현재는 그다지 사용되지 않는다(2004년 3월 16일에 출시된 GLib 2.4 즈음에 도입된 신기능이기 때문). GIMP는 GObject의 인터페이스형을 사용하고 있다.[11]

5. 메시징 시스템

GObject 메시징 시스템은 ''클로저''와 ''시그널''이라는 두 가지 상호 보완적인 요소로 구성된다.[1] 클로저는 콜백의 일반화된 버전이며, 시그널은 클로저를 호출하는 주된 메커니즘이다.

5. 1. 클로저

콜백을 일반화한 것이다. C언어와 C++(C++) 이외에도 바인딩이 있는 언어에서 사용할 수 있다. 예를 들어, 파이썬(Python)이나 자바(Java) 코드를 클로저를 통해 GObject에서 호출할 수 있다.[1]

5. 2. 시그널

시그널은 클로저를 호출하는 기본 메커니즘이다. 객체는 특정 시그널과 특정 클로저 간의 매핑을 지정하여 형식 시스템에 시그널 리스너를 등록한다. 등록된 시그널이 발생하면 해당 시그널의 클로저가 호출된다. GTK에서 모든 네이티브 GUI 이벤트(마우스 움직임 및 키보드 동작 등)는 리스너가 잠재적으로 작동할 수 있도록 GObject 시그널을 생성할 수 있다.[1]

6. 클래스 구현

각 GObject 클래스는 클래스 구조체와 인스턴스 구조체, 이렇게 최소 두 개의 구조체로 구현된다.[12]

GObject 프레임워크에서 클래스를 정의하는 것은 복잡하며, 형식 캐스팅 매크로의 수동 정의 및 모호한 유형 등록 주문과 같은 많은 양의 보일러플레이트 코드가 필요하다.[12] 이러한 복잡성 때문에 C로 GObject를 소스 간 컴파일하는 몇 가지 상위 수준 언어가 존재한다.[12] Vala는 C# 스타일 구문을 사용하며, 바닐라 C 코드로 사전 처리된다.[12] GObject 빌더 또는 [https://www.jirka.org/gob.html GOB2]는 자바를 연상시키는 템플릿 구문을 제공한다.[12]

6. 1. 클래스 구조체

클래스 구조체는 C++ 클래스의 vtable에 해당하며, 가상 메서드에 대한 함수 포인터 집합을 포함한다.[12] 클래스 특정 변수는 클래스 멤버를 에뮬레이션하는 데 사용할 수 있다.

6. 2. 인스턴스 구조체

객체 인스턴스당 하나의 복사본으로 존재하는 인스턴스 구조체는 슈퍼클래스의 인스턴스 구조체로 시작해야 한다 (이는 모든 인스턴스가 클래스 구조체에 대한 포인터로 시작하도록 보장하는데, 모든 기본 인스턴스화 가능한 유형이 이 속성을 공유하기 때문이다). 슈퍼클래스에 속하는 데이터 다음에, 이 구조체는 C++ 멤버 변수에 해당하는 모든 인스턴스 특정 변수를 포함할 수 있다.[12]

C언어의 구조체에는 "public", "protected", "private"와 같은 접근 제한자가 없기 때문에, 인스턴스 구조체에는 비공개 데이터에 대한 포인터 `_priv`가 있다.[12] 비공개 구조체는 공통 헤더 파일에 선언할 수 있지만, 정의는 개별 구현 파일에서만 이루어지며, 외부에서 보이지 않도록 하고 있다.[12] 비공개 구조체를 GType에 등록하면, 객체 시스템에서 자동으로 확보된다.[12] 비공개 데이터가 필요할 때마다 `G_TYPE_INSTANCE_GET_PRIVATE`를 사용하도록 하면, `_priv` 포인터를 구조체에 포함할 필요가 없다.[12]

7. GObject Introspection

GObject 인트로스펙션(GIR)[4]은 C 라이브러리(GObject 사용)와 언어 바인딩 간의 외부 함수 인터페이스 미들웨어 계층이다. GTK용 언어 바인딩 목록을 참고하면 된다.

8. 다른 객체 시스템과의 비교

GObject는 C 언어를 위한 거의 완전한 객체 시스템으로, C++ 및 Objective-C와 같은 C 파생 언어의 대안으로 볼 수 있다. 그러나 GObject는 이들과 몇 가지 중요한 차이점을 가지고 있다.[6]

가장 큰 차이점은 GObject가 다중 상속을 지원하지 않는다는 점이다. 또한 GObject는 라이브러리 형태로 제공되므로, 새로운 구문이나 컴파일러 기능을 도입하지 않는다. 따라서 GObject 기반 C 코드는 일반 C와는 다른 별개의 언어로 간주되기도 한다.

GObject는 시그널 프로그래밍(다른 언어에서는 이벤트 구동 프로그래밍이라고 함)에 중점을 둔다는 특징이 있다. 이는 GUI 툴킷의 요구 사항을 충족하도록 설계되었기 때문이다. 대부분의 객체 지향 언어에 시그널 라이브러리가 있지만, GObject는 객체 시스템에 시그널이 내장되어 있다.

8. 1. C++와의 비교

GObject는 C를 위한 거의 완전한 객체 시스템을 제공하므로, C++ 및 Objective-C와 같은 C 파생 언어의 대안으로 볼 수 있다. (하지만 둘 다 해당 객체 시스템 외에도 많은 다른 기능을 제공한다.) C++와 GObject의 쉽게 관찰할 수 있는 차이점은 GObject는 (Java와 마찬가지로) 다중 상속을 지원하지 않는다는 것이다.[6]

GObject는 GLib의 g_malloc() 메모리 할당 함수를 사용하므로 메모리가 소진되면 프로그램이 무조건 종료된다.[7] 반면 C 라이브러리의 malloc(), C++의 new 및 기타 일반적인 메모리 할당자는 단순히 충돌하는 대신 프로그램이 메모리 부족 상황에 대처하거나 심지어 완전히 복구할 수 있도록 한다.[7]

또 다른 중요한 차이점은 C++와 Objective-C가 별도의 언어인 반면, GObject는 엄밀히 말하면 라이브러리이며, 따라서 새로운 구문이나 컴파일러 인텔리전스를 도입하지 않는다는 것이다. 예를 들어, GObject 기반 C 코드를 작성할 때는 명시적인 업캐스팅을 수행해야 하는 경우가 많다.

모든 C++ 컴파일러에서 작동하는 표준 ABI가 없는 플랫폼에서는 한 C++ 컴파일러로 컴파일된 라이브러리가 다른 컴파일러로 컴파일된 라이브러리를 항상 호출할 수 있는 것은 아니다. 이러한 호환성이 필요한 경우, C++ 메서드는 일반 C 함수로 내보내야 하며, 이는 C++ 객체 시스템의 목적을 부분적으로 무력화한다. 반대로, C는 오버로딩 또는 네임스페이스의 어떤 형태도 지원하지 않기 때문에, C 라이브러리의 작성자는 일반적으로 명시적 접두사를 사용하여 내보낸 이름의 전역적 고유성을 보장한다. 따라서 GObject 기반의 C로 작성된 라이브러리는 객체 지향적임에도 불구하고 어떤 컴파일러를 사용하든 동일한 외부 기호 이름을 사용한다.

아마도 가장 근본적인 차이점은 GObject가 시그널 프로그래밍(다른 언어에서는 이벤트 구동 프로그래밍이라고 함)에 중점을 둔다는 것이다. glibmm/gtkmm(각각 Glib/GTK에 대한 공식 C++ 래퍼)을 사용하는 경우, 자매 프로젝트인 libsigc++를 사용하면 표준 C++를 사용하여 기본 GObject 시그널을 쉽게 사용할 수 있다. 물론, C++용 Boost.Signals2와 같이 추가 라이브러리가 필요한 경우도 있지만, 거의 모든 플랫폼에서 다른 시그널 구현을 사용할 수 있다.

8. 2. Objective-C와의 비교

GObject는 C를 위한 거의 완전한 객체 시스템을 제공하며, C++(C++) 및 Objective-C(Objective-C)와 같은 C 파생 언어의 대안으로 볼 수 있다. 그러나 GObject는 라이브러리인 반면, Objective-C는 별도의 언어이다.[6] 따라서 "GObject가 있는 C"는 일반 C와는 별개의 언어로 간주되기도 한다.

8. 3. 기타

GObject는 시그널 프로그래밍(다른 언어에서는 이벤트 구동 프로그래밍이라고 함)에 중점을 둔다.[6] 이는 GObject가 특히 GUI 툴킷의 요구 사항을 충족하도록 설계되었기 때문이다. 대부분의 객체 지향 언어에 시그널 라이브러리가 있지만, GObject의 경우 객체 시스템에 내장되어 있다. 이 때문에 일반적인 GObject 애플리케이션은 비 GObject 애플리케이션보다 훨씬 더 광범위하게 시그널을 사용하는 경향이 있으며, GObject 컴포넌트가 일반 C++ 또는 Java를 사용하는 것보다 훨씬 더 정보 은폐 및 재사용이 가능하게 된다.[6]

GObject 기반 C 코드를 작성할 때는 명시적인 업캐스팅을 수행해야 하는 경우가 많다.

9. 사용

C와 GObject의 조합은 GNOME 데스크톱, GTK 툴킷, GIMP 이미지 편집 프로그램과 같은 많은 성공적인 자유 소프트웨어 프로젝트에서 사용된다.[5] GObject 시스템은 C++, 자바, 루비, 파이썬, 공통 리스프, .NET/모노와 같은 다른 많은 언어의 기본 객체 시스템에 잘 매핑된다. 결과적으로, 잘 작성된 GObject 프레임워크를 사용하는 라이브러리에 대한 언어 바인딩을 만드는 것은 일반적으로 비교적 쉽다.[5]

그러나 C로 GObject 코드를 작성하는 것은 다소 장황하다. 고급 언어 객체 지향 언어에 경험이 있는 프로그래머는 C에서 GObject를 사용하는 것이 다소 지루하다고 느낄 수 있다. 예를 들어, (GObject의 하위 클래스조차도) 하위 클래스를 만들려면 많은 양의 보일러 플레이트 코드를 작성하거나 복사해야 할 수 있다.[5] 그러나 GObject와 함께 작동하도록 설계되었으며 C로 변환되는 언어인 발라를 사용하면 GObject로 작업하거나 GObject 기반 라이브러리를 작성하는 것이 더 쉬워질 것이다.[5]

참조

[1] 웹사이트 GObject Reference Manual https://developer.gn[...]
[2] 웹사이트 GObject Reference Manual - Stable https://developer.gn[...]
[3] 웹사이트 glib-mkenums, GObject Reference Manual https://developer.gn[...]
[4] 웹인용 Introspection, Summary https://developer.gn[...] 2020-08-09
[5] 웹사이트 How to define and implement a new GObject https://developer.gn[...] 2013-07-27
[6] 웹사이트 c++ - Why Was the GObject System Created? https://stackoverflo[...] 2019-11-16
[7] 웹사이트 Memory Allocation: GLib Reference Manual https://developer.gn[...] 2019-11-16
[8] 웹사이트 Memory Allocation: GLib Reference Manual https://developer.gn[...] 2019-11-17
[9] 웹사이트 GObject Reference Manual http://developer.gno[...]
[10] 웹사이트 GType http://developer.gno[...]
[11] 웹사이트 glib-mkenums http://developer.gno[...]
[12] 웹사이트 GObject Builder http://www.jirka.org[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com