C 프로그래밍 입문/구조체와 유니온 데이터: 두 판 사이의 차이

내용 삭제됨 내용 추가됨
Joshuajh (토론 | 기여)
Joshuajh (토론 | 기여)
198번째 줄:
 
====== 구조체의 비트필드 ======
 
C 구조체가 갖는 매력중의 하나는 메모리를 비트 단위로 잘라서 액세스 할 수 있다는 점이다. 이렇게 비트 단위로 분할해서 사용하는 구조체 멤버함수를 '비트필드'라고 부른다. 실제 비트필드는 일반 개인용 컴퓨터와 같이 풍부한 메모리를 제공하는 환경에서는 그다지 큰 매력이 없을 수 도 있으나, 작은 메모리 내에 프로그램과 데이터를 함께 밀어넣어야 하는 임베디드 환경이나 전송되는 속도가 상대적으로 느린 네트워크 환경에서 실제로 사용하지 않는 메모리 공간의 줄일 수 있다는 장점을 갖는다. 실제로 위의 예에서 한 학생의 정보를 저장하기 위해 사용된 데이터 공간의 크기는 대략 40바이트 정도 이다. 그러나 실제로 따져보면 그렇게 큰 메모리 공간을 필요로 하지 않는다. 예를 들자면, 학년은 외국의 학제를 따른다고 해도 12학년 까지 뿐 일 것 이므로 12 ≈ 2^4, 즉 4바이트만 있으면 된다. 반의 갯수 역시 20반, 30반 이렇게 많은 학급이 있을 수 는 없으므로, 최대 30반으로 치더라도 30 ≈ 2^5, 5비트 정도로도 표현이 가능하다. 마지막으로 번호 역시 100번이 넘는 경우는 생각하기 어려우므로 100 ≈ 2^7, 약 7비트로 표현이 된다. 결국 16비트, 즉 2바이트로 최소 3바이트, 최대 12바이트를 대신 할 수 있게 된다. 최선의 경우를 생각한다 해도 학년, 반, 번을 표현하는데 한 명의 학생당 한 바이트를 절약하게 되는 셈인데 2011 예상 고 3 수험생의 수가 70만명대 인 것으로 예측되고 있는 상황이니, 이 학생들의 학년, 반, 번호만을 전송하는데에도 70만 바이트를 모의고사 볼 때 마다 더 전송해야 되는 셈이 된다.<ref>실제로 이런 데이터를 옮기는 것 때문에 늘어나는 데이터의 양 보다는 네트워크를 통해 전달하기 위해 사용되는 데이터 헤더에 사용되는 정보들을 비트 필드단위로 압축하지 않은 경우에 늘어나는 양이 훨씬 더 많습니다. 그렇기 때문에 실제 비트필드의 의의는 일반적인 프로그램 보다는 하위단에서 프로그래밍을 하는 경우에 있다고 할 수 있겠습니다.</ref> 위에서 사용한 구조체를 비트 필드를 이용해 데이터를 압축하도록 재 구성하면 다음과 같다.
#include <sys/types.h>
struct score_card_type {
uint16_t year:3, grade:5, seq:7;
struct articles_type {
uint32_t korean:7, english:7, math:7;
uint32_t total:9;
} scores;
double average;
};
 
위의 구조체에서 사용된 uint16_t와 uint32_t는 네트워크 프로그래밍 시에 많이 사용되며 부호없는 16비트 정수와 부호없는 32비트 정수 타입을 의미한다. 이 타입들에 대한 정의는 sys/types.h 파일에 기록되어 있으므로, 이 타입들을 사용하기 위해서는 #include <system/types.h>를 이용해서 해당 파일을 사용하겠다고 지정해 주어야 한다.
 
위의 변수들을 보면 끝에 콜론(:)과 함께 숫자가 추가 되어진 것을 볼 수 가 있을 것이다.이 숫자가 몇 비트의 데이터를 사용하겠다는 의미로 사용된다는 것을 쉽게 눈치 챌 수 있을 것이다. 그리고, 변수 total은 메모리 공간을 더 줄이기 위해 articles_type의 정의 안으로 옮겼다. 이렇게 비트 단위로 줄인 데이터는 16바이트로, 처음의 40바이트의 절반 이하로 줄어들었다.
 
===== 유니온 (Union) =====