Search
Duplicate
👨‍👩‍👧

[C 기초]공용체입니다.

간단소개
너무나도 매력적인 공용체, 배워봅시다.
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Scrap
태그
c언어
자료형
공용체
구조체
9 more properties

공용체(Union type)?

구조체는 사용자 정의 자료형을 만들 수 있는 친구였다. 공용체와 열거형 역시 일종의 자료형이라고 이해할 수 있다. 다만 고유한 특징들이 구조체와는 다른 결과를 만들어 낸다. 오늘은 공용체의 기본적인 특징들을 배워보자.

구조체와 공용체

구조체와 공용체 모두 사용자 정의 자료형이다. 사용자 정의 자료형이라는 범주에 같이 속해있기 때문에, 구조체와 공용체를 비교하면 쉽게 공용체를 이해할 수 있다.
//구조체 정의 typedef struct s_42struct { int n1; size_t n2; unsigned int n3; } t_42struct; //공용체 정의 typedef union u_42union { int n1; size_t n2; unsigned int n3; } t_42union;
C
복사
위의 코드를 살펴보면, 구조체와 공용체의 선언이 굉장히 흡사하다는 것을 알 수 있다. 두 정의방식의 차이는 struct 선언과 union선언 뿐이다. 그러나, 이를 통해 정의된 구조체와 공용체의 결과는 굉장히 다르다. 메모리 공간을 사용하는 방식에 많은 차이가 있는 것이다.
위의 구조체와 공용체를 대상으로 자료형의 사이즈를 측정해보자.
printf ("%lu \n", sizeof(t_42struct)); -> 24출력 printf ("%lu \n", sizeof(t_42union)); -> 8출력
C
복사
값이 다르다! 구조체는 16의 값을, 공용체는 8의 값을 가지고 있는 것을 알 수 있다.
이번에는 각 멤버들의 주소를 출력해보자(실제로 해보자)
//구조체 주소출력 printf ("%p \n", &t_42struct); //구조체 멤버 주소 출력 printf ("%p %p %p\n", &t_42struct.n1, &t_42struct.n2 &t_42struct.n3); //공용체 주소 출력 printf ("%p \n", &t_42union); //공용체 멤버 주소 출력 printf ("%p %p %p\n", &t_42union.n1, &t_42union.n2 &t_42union.n3);
C
복사
어떤 결과값이 나왔을까? 직접 해보자.
실행결과:
공용체를 구성하는 멤버들의 주소 값이 동일하다는 것을 알 수 있다. 바로 우리는 여기서 공용체의 메모리 할당 특성을 알 수 있다!
구조체와 공용체의 메모리 구조 차이. 구조체안에는 각각의 변수가 담겨있지만, 공용체는 멤버중 가장 큰 변수 하나만 할당된다.
만약 구조체를 선언한다면, 구조체를 구성하는 멤버 변수들은 각각의 메모리를 따로 할당받게 된다.
반면 공용체를 선언한다면, 공용체는 공용체의 멤버들 중 가장 큰 메모리 사이즈를 가지고 있는 멤버의 사이즈만큼만 할당되어, 이를 공유하게 된다.

마치면서_

우리는 과제를 진행할 때 구조체에 온갖 수많은 데이터를 가지고 다닌다. 그러나 구조체안에 데이터가 늘어날 수록 사용되는 메모리의 크기도 늘어난다.(물론 현대 CPU에게는 의미가 없는 작은 수일 수 있다.) 독립적이여야하는 데이터가 있는 반면, 메모리공간을 공유해도 괜찮은 데이터도 있기 마련이다. 공용체는 메모리블럭을 모든 멤버가 공유한다는 특성을 통해 같은 2진데이터를 다양한 자료형으로 저장하고 뽑아낼 수 있다. 한번 사용해보자