본문 바로가기

무언가 만들기 위한 지식/C,C++,Embedded C

[C, Embedded C] Union의 활용

예전 Structure에 대해 포스팅할시에서 Union에 대해서 살짝 언급한 적이 있다.

Struct 및 Union 이전 포스팅 : http://shinlucky.tistory.com/233

사실 필자는 예전 Structure에 대해 다시 살펴보기 전가지 Union이 그냥 공용체라는 사실만 알았고,
그때 Structure에 대해 공부할때 같이 하면서도 가장큰 Type의 크기만큼 메모리 공간을 잡아놓고 같이 사용한다라고 알고 있었다.
최근 책의 예제들을 보다가 Union이 어떤식으로 사용되는지 볼 수 있었다.

Union은 Structure와 구조 및 선언이 비슷하다. 그러나 공용메모리에 잡힌 공간을 각 변수가 같이 사용하게 된다. 구조체에 비하면 그렇게 많이 사용되고 있지는 않는다고 한다. (필자도 실제로 쓴적은 거의 없다. -.,-;)

Union은 데이터를 쪼개거나 데이터의 순서를 바꿀때 유용하다.
대표적으로 바이트의 순서를 바꿔줄때, 즉 엔디언 모드의 변경시 사용된다.


엔디언(Endian) 모드가 다른 디바이스들이 서로 통신하기 위해서는 하나로 통일해서 사용되어야 한다.
메모리에 데이터가 저장될때 대부분 바이트 단위로 저장이 된다. 이때의 저장 방법이 바로 빅-엔디언리틀-엔디언 이다.
(비트단위 접근과는 다르다. - 최상위 비트우선, 최하위 비트우선// 비트순서는 덜 중요하다. - 아키텍쳐에 중립적.)

엔디언(Endian) 관련 설명된 포스팅 : http://shinlucky.tistory.com/284

Union을 이용한 엔디언 변경 코드를 작성해 보자.

[작성환경 : Window XP   작성툴 : Visual Studio 6.0   컴파일러 : Visual Studio 6.0    사용언어 : C]

3~12 Line은 예전에 이진출력을 위한 printf 함수이다. 32bit를 모두 출력하도록 살짝 바꾸어 놓았다.
14~17 Line은 union을 선언 및 정의한 모습이다. char [4]와 int 모두 32bit이므로 총 4byte의 공간이 할당되게 되며, 할당된 메모리 공간을 공용하여 data변수와 byteAry변수가 사용하게 된다.
20 Line에서 초기화를 해준후 source 에서 target으로 엔디언 모드를 변경하였다. 변경하는 코드는 24 Line 한줄이다. 그냥 단순하게 배열을 역순으로 정리하면 된다.
int나 char이나 메모리에 저장되는 bit 구조는 같으므로, 변경된 bit구조를 해석해보면 8bit단위로 같은 모습을 볼 수 있다.
일렬된 bit 구조를 int(32 bit), char(8 bit) 단위로, 하나의 공용체 내부에서 같은 메모리 공간을 사용한 것이다.

위의 유니온 데이터 구조를 이용하여 엔디언 모드를 효과적으로 변경할 수 있다.
결과는 다음과 같다.


<결과 값, 8bit 단위로 바뀐 bit구조를 확인해 볼 수 있다.>



※ 문자열의 경우 1byte로 하나하나 분리가 가능하다. 그래서 이 경우 빅/리틀엔디언 모두 같은 방법으로 저장된다고 한다.