본문 바로가기
모던 C 언어/C언어 STL

2. C언어의 STL, GLib

by 커널패닉 2021. 12. 17.
반응형
※ glibc와 혼동하지 말자. glibc(gnu c library)는 gnu에서 만든 C 표준 라이브러리이다. 반면 GLib는 gnome 재단에서 만든 서드파티 라이브러리이다.

 

GLib는 C언어 프로그램 개발을 돕는 라이브러리이다. C언어가 개발된지 어느덧 50년이 다 되어가는 만큼 지원하는 기능이 제한적이다. 대표적으로 C언어는 표준 자료구조, 클래스, 추상화된 파일 입출력 라이브러리 등 현대 언어에서 지원하는 기능들이 빠져있다. GLib는 현대 언어들이 제공하는 고수준 기능들을 C언어에서도 사용할 수 있도록 돕는 라이브러리이다.

 

2.1 GLib란?

공식 GLib 문서에서는 GLib에 대해 아래와 같이 설명하고 있다.

GLib is a general-purpose, portable utility library, which provides many useful data types, macros, type conversions, string utilities, file utilities, a mainloop abstraction, and so on.
GLib는 많은 유용한 데이터 유형, 매크로, 유형 변환, 문자열 유틸리티, 파일 유틸리티, 메인 루프 추상화 등을 제공하는 범용의 이식 가능한 유틸리티 라이브러리입니다.

GLib는 프로그래밍 전반에 대해 다루는 매우 방대한 라이브러리이다. GLib는 C언어가 제공하지 않는 고수준의 기능들을 제공한다. 대표적으로 자료구조, 객체 시스템, IO, 이벤트 루프 등이 있다. 얼핏 들으면 GLib가 제공하는 기능들은 이미 glibc가 제공하는 기능들과 비슷해 보인다. (심지어 이름마저 비슷하다!) 아래는 GLib와 glibc를 기능별로 비교한 표이다.

  GLib glibc
자료구조 배열, 큐, 링크드 리스트, 해쉬테이블, 트리 등 큐, 리스트, 트리 등
객체 시스템 GObject -
IO iostream, 파일 입출력 fopen, fwrite, fread, fclose 등

얼추 GLib가 제공하는 기능들은 glibc가 제공하는 기능과 유사해 보이지만 아래와 같은 차이가 있다.

  1. 추상화된 인터페이스 제공
  2. 일관성 있는 네이밍, 사용 방법 제

 

2.1.1 추상화된 인터페이스 제공

GLib는 glibc 대비 추상화된 인터페이스를 제공한다. 예를 들어서 문자열을 다루는 경우를 비교해 보자. GLib는 GString 객체를 이용해서, glibc는 string.h를 이용해서 문자열 추가 삭제, 변환 등을 할 수 있다. 기능적으로는 비슷하지만 실제 동작을 살펴보면 그렇지 않다.

GLib는 GString 객체를 이용하며, API에서 안전과 관련된 대부분의 체크를 수행한다. 따라서 사용자 입장에서는 사이즈체크, 널 검사 등을 신경 쓸 필요가 없다. 반면 glibc에서는 그렇지 않다. 아래는 문자열을 할당하는 함수를 비교한 예시코드이다.

#include <stdio.h>
#include <string.h>
#include <glib.h>

#define GLIBC_STRING_LEN 8

int main() {
    // 1. 문자열(배열)의 사이즈 관리
    // 2. 문자열의 초기화
    char glibc_string[GLIBC_STRING_LEN] = {'\0', };
    // 3. 문자열 삽입 시 사이즈 체크
    strncpy(glibc_string, "Hello, world", GLIBC_STRING_LEN);
    // 4. 사이즈 초과로 문자열이 100% 복사되지 않는 경우 발생
    printf("%s\n", glibc_string);

    GString *glib_string = g_string_new(NULL);
    glib_string = g_string_assign(glib_string, "Hello, world");
    printf("%s\n", glib_string->str);

    return 0;
}

glibc에서는 사용자가 다양한 요소들을 고려해야 하지만, GLib에서는 GString 객체가 이러한 요소들을 모두 알아서 고려해 주는 것을 알 수 있다. 따라서 사용자 입자에서는 생산성이 증가하고, 휴먼에러에 의한 버그를 예방할 수 있다.

 

2.1.2 일관성 있는 네이밍, 사용 방법 제공

API의 일관성의 중요도에 대해서 사람마다 생각이 약간씩 다를 수 있겠지만, API가 일관적이지 않으면 사용할 때마다 헷갈린다. glibc의 캐릭터 문자를 받아오는 getchar() 함수의 반환값이 int라거나, FILE 구조체의 이름이 대문자로 되어 있다던가 하는 문제들을 신경쓰는 것은 은근히 피곤하다. 반면 GLib의 경우 일관된 네이밍 규칙을 가지고 있기 때문에 오랜만에 사용하더라도 금방 적응할 수 있다.

 

2.2 GLib에서 제공하는 자료구조들

GLib는 배열, 스트링, 링크드 리스트, 큐, 스택, 트리, 해쉬테이블, 시간데이터 등 웬만한 거의 모든 자료구조를 다룬다. 당연히 이들을 모두 살펴볼 수 는 없고, 여기서는 그 중 많이 사용되는 링크드 리스트, 해쉬테이블에 대해서 다루려고 한다. 각 자료구조의 자세한 사용 방법과 예제는 다음 포스트에서 다룰 예정이다. GLib의 자세한 자료구조들을 알고싶으면 아래 공식 문서에서 확인할 수 있다.

https://docs.gtk.org/glib/#structs

반응형