![[C언어] union으로 공용체 정의하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGLbHY%2FbtsakhKZ0gA%2FTeGbJklQNiFE6USL3hDUt0%2Fimg.jpg)
공용체$_{Union}$는 서로 다른 자료형의 값을 동일한 메모리 공간에 저장하는 사용자 정의 자료형이다.
구조체$_{struct}$와 선언 방식이 유사하지만, 모든 멤버가 같은 메모리 영역을 공유한다는 점에서 차이가 있다.
Union 선언
공용체를 선언하기 위해서는 union
키워드를 사용한다. 선언 방식은 구조체와 유사하다.
union myUnion {
int i;
float f;
char str[20];
};
이 예제에서 Data
라는 이름의 공용체를 선언했다. 이 공용체는 정수형 i
, 실수형 f
, 문자열 str
을 멤버로 가진다.
특징
공용체 변수의 크기는 멤버 중 가장 큰 자료형의 크기로 정해진다. 위 예제에서는 가장 큰 myUnion의 변수 str 멤버가 20바이트 저장공간을 세 멤버가 함께 이용한다. 즉 최소 크기는 20바이트가 된다.
Union 멤버에 접근하기
공용체의 멤버에 접근하기 위해서는 점 .
연산자를 사용한다. 공용체 포인터를 통해 멤버에 접근할 때는 화살표→
연산자를 사용한다.
공용체의 특성상 한 시점에 하나의 멤버만 유효한 값을 가질 수 있다는 점에 주의해야 한다.
#include <stdio.h>
#include <string.h>
union myUnion {
int i;
float f;
char str[20];
};
int main() {
union myUnion u;
union myUnion *ptr = &u;
u.i = 10;
printf("정수: %d\n", u.i);
u.f = 3.14;
printf("실수: %f\n", u.f);
printf("실수 멤버 변경 후 정수 값: %d\n", u.i); // 유효하지 않은 값
strcpy(u.str, "Hello");
printf("문자열: %s\n", u.str);
ptr->i = 20;
printf("포인터를 활용한 정수 값 접근: %d\n", ptr->i);
return 0;
}
위 예제에서는 새로운 멤버에 값을 할당하면 이전 멤버의 값은 더 이상 유효하지 않게 된다. u.f
에 값을 할당한 후 u.i
를 출력하면 아래와 같이 예측할 수 없는 값이 나온다.
한편 구조체와 같이 문자 배열에 문자열을 할당할 때는 strcpy
함수를 사용하면 된다.
Union vs. Struct
C 프로그래밍에서 구조체와 공용체는 모두 사용자 정의 데이터 타입이지만, 메모리 할당과 사용 목적에서 중요한 차이가 있다.
메모리 할당
- 구조체: 모든 멤버에 대해 개별적으로 메모리를 할당한다.
- 공용체: 가장 큰 멤버의 크기만큼만 메모리를 할당하고, 모든 멤버가 이 공간을 공유한다.
메모리 사용
- 구조체: 모든 멤버가 동시에 유효한 값을 가질 수 있다.
- 공용체: 한 시점에 하나의 멤버만 유효한 값을 가질 수 있다.
크기
- 구조체: 크기는 모든 멤버의 크기의 합과 같거나 그보다 크다 (패딩으로 인해).
- 공용체: 크기는 가장 큰 멤버의 크기와 같거나 그보다 크다 (메모리 정렬 요구사항으로 인해).
사용 목적
- 구조체: 관련된 데이터를 그룹화하여 복합적인 데이터 구조를 만들 때 사용한다.
- 공용체: 같은 메모리 공간을 다른 데이터 타입으로 해석해야 할 때 사용한다.
'프로그래밍 언어 > C' 카테고리의 다른 글
[C언어] 문자와 문자열 (0) | 2024.07.14 |
---|---|
[C언어] typedef로 자료형 재정의하기 (0) | 2023.04.14 |
[C언어] struct로 구조체 정의하기 (0) | 2023.04.14 |
[C언어] 배열 포인터와 포인터 배열 (1) | 2023.04.14 |
[C언어] 배열 파라미터와 포인터 파라미터의 차이점 (0) | 2023.04.14 |
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!