C 언어에서 안전하고 유연한 자료 구조 만들기
1. 이게 뭔가요?
이 기사는 오랜 역사를 지닌 프로그래밍 언어인 C 언어에서 여러 종류의 데이터를 유연하게 담는 자료 구조를 만들면서도, 잘못된 데이터가 들어오는 것을 컴퓨터가 미리 감지해 막을 수 있는 독창적인 기법을 소개합니다. 여기서 자료 구조란 컴퓨터 메모리에 데이터를 효율적으로 담고 꺼내 쓰는 방식을 뜻하며, C 언어는 운영체제나 장치 제어에 널리 쓰이는 기본 프로그래밍 언어입니다.
2. 왜 화제인가요?
C 언어는 원래 다양한 데이터를 유연하게 다루기가 까다로워 예전에는 같은 코드를 자료형마다 복사하거나 범용 포인터를 써야 했습니다. 하지만 전자는 코드가 비대해지고, 후자는 잘못된 데이터를 넣어도 컴퓨터가 미리 알지 못해 큰 오류로 이어집니다. 이 글은 프로그램 실행 속도를 늦추지 않으면서도 메모리를 아끼고 컴파일 시점에 철저하게 자료형을 검사할 수 있는 우회로를 제시하기 때문에 중요합니다.
3. 핵심 내용
C 언어에서 여러 자료형을 다루는 제네릭 자료 구조를 안전하게 구현하는 첫 번째 방법은 헤더 파일을 여러 번 불러오는 방식이지만, 코드가 중복되어 프로그램 파일 크기가 커지고 빌드 시간이 늘어나는 단점이 있습니다. 두 번째 방법은 모든 종류의 데이터 주소를 담을 수 있는 범용 포인터를 사용하는 방식이지만 자료형 안전성이 보장되지 않습니다. 또한 마디와 데이터를 따로 할당하면 메모리 사용과 성능 관점에서 비효율적이기 때문에, 구조체 마지막에 크기가 정해지지 않은 배열을 두어 데이터 공간을 함께 할당하는 유연한 배열 멤버를 사용해 데이터와 마디를 나란히 붙여서 저장하는 인라인 저장 방식을 쓸 수 있습니다. 가장 중요한 세 번째 방법인 자료형 검사 기능은, 여러 데이터 중 하나만 담을 수 있는 C 언어 상자인 공용체와 반복되는 코드를 짧은 단어로 치환하는 전처리 기능인 매크로를 함께 사용하여 구현합니다. 목록을 나타내는 매크로 안에는 실제 목록의 시작점을 가리키는 포인터와 특정 자료형을 가정하는 가상의 변수를 함께 두어, 프로그램이 실행되기 전 단계인 컴파일 시점에 삼항 연산자를 활용하여 함수에 전달하는 항목의 자료형이 목록이 가정하는 자료형과 정확히 일치하는지 강제로 확인하게 만듭니다. 여기서 가상의 변수는 프로그램을 실행하는 동안에는 전혀 사용되지 않으며 오직 컴파일할 때 자료형 정보를 확인하기 위한 용도로만 존재하고, 공용체 구조를 사용했기 때문에 실제 메모리 공간을 전혀 차지하지 않습니다. 또한 주요 컴파일러들이 지원하는 확장 기능을 사용하여 반환하는 자료형을 기본 데이터 주소 형태에서 목록이 지정한 실제 데이터 자료형으로 깔끔하게 바꿀 수 있습니다. 한편 C 언어 컴파일러는 완전히 똑같이 생긴 변수 정의라도 각각 따로 정의되었다는 이유로 서로 다른 자료형으로 인식해 오류를 내뿜는데, 별칭을 만들어주는 기능을 사용하면 이 문제를 해결할 수 있습니다. 결론적으로 이 기법은 해시 맵처럼 키와 값처럼 연관된 자료형이 여러 개 있는 구조를 포함하여 어떤 종류의 데이터 구조에도 적용할 수 있습니다.
4. 나에게 어떤 영향이 있나요?
일반 독자 입장에서는 당장 눈에 보이는 변화를 찾기 어렵지만, C 언어로 프로그램을 만드는 개발자들에게는 유용한 참고 자료가 됩니다. 이 기법을 적용하면 개발 과정에서 실수로 다른 종류의 데이터를 집어넣었을 때 컴퓨터가 컴파일 단계에서 곧바로 오류를 알려주기 때문에, 프로그램이 실행되기 전에 미리 문제를 바로잡을 수 있습니다. 다만 C 언어의 특수한 문법과 매크로를 복잡하게 얽어 쓰는 방식이므로 프로젝트의 성격과 팀의 코딩 스타일에 따라 장단점을 따져보고 신중하게 도입해야 합니다.