C/C++ 학습 · 4 min read · Oct 10, 2025
C/C++ 단계별 학습 - 페이지 11
11. 단계별 C/C++ — C 프로그래밍 - 유니온
유니온
| | 1. 소개
- 유니온에 대하여
- 유니온의 선언
- 유니온 변수 정의
- 구조체와 유니온의 차이
- 유니온에 대한 작업
- 유니온의 범위 |
1. 소개
| | / 81_union.c /
#include
struct s_emp
{
int eno;
char name[20];
float sal;
};
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
struct s_emp se;
union u_emp ue;
printf(“\n직원 구조체의 크기 : %d”, sizeof(se));
printf(“\n직원 유니온의 크기 : %d”, sizeof(ue));
return 0;
} | | | 출력: 직원 구조체의 크기 : 26
직원 유니온의 크기 : 20 |
2. 유니온에 대하여
프로그램에서 많은 수의 변수를 요청할 때, 이들은 많은 메모리를 차지합니다. 유니온은 교체 기술을 사용하여 메모리를 절약하는 가장 쉬운 방법을 제공합니다. 모든 유형의 변수를 위해 동일한 메모리 위치를 사용합니다.
유니온은 C의 데이터 유형으로, 동일한 메모리 영역에 여러 변수를 오버레이할 수 있게 해줍니다.
유니온의 특성:
| | 1. 유니온은 메모리의 단일 위치에 서로 다른 유형의 값을 저장합니다.
- 유니온은 여러 다른 유형의 값을 포함할 수 있지만 한 번에 하나만 저장됩니다.
- 유니온은 하나의 데이터 유형에 대해서만 값을 보유합니다. 새 할당이 이루어지면 이전 값은 유효하지 않습니다.
- 유니온 멤버는 아무 수나 존재할 수 있습니다. 그러나 유니온 유형 변수는 그 멤버가 차지하는 가장 큰 메모리를 사용합니다. |
3. 유니온의 선언
유니온은 서로 다른 유형과 크기의 객체를 서로 다른 시간에 저장할 수 있는 데이터 유형입니다. 유니온의 정의는 구조체와 동일합니다. 선언에서의 유일한 변화는 키워드 struct 대신 키워드 union을 사용하는 것입니다.
| |
|
예:
| | union ddate
{
int day;
int month;
int year;
}; | union student
{
int sno;
char name[20];
int marks;
float avg;
}; |
4. 유니온 변수 정의
유니온 변수를 정의하는 것은 구조체와 동일하며, int와 같은 내장 데이터 유형을 정의하는 것과 같습니다.
| | int a; / 유효 /
union date d; / C와 C++ 모두에서 유효 / |
유니온 크기 계산
C/C++의 모든 데이터 유형은 지정된 크기를 가지고 있습니다. 즉, int는 2바이트, float는 4바이트의 크기를 가집니다. 유니온 변수의 크기를 찾는 방법은 다음과 같습니다.
sizeof:- 이 함수는 주어진 변수의 크기를 찾는 데 사용됩니다.
| | printf(“%d”, sizeof(int)); / 2 /
printf(“%d”, sizeof(float)); / 4 /
printf(“%d”, sizeof(union emp)); / emp 유니온의 크기를 표시 / |
5. 구조체와 유니온의 차이
구조체와 유니온의 차이는 다음과 같습니다.
| 구조체 | 유니온 ** |
| 1. 단일 위치에 서로 다른 유형(변수)을 보유할 수 있습니다. | 1. 서로 다른 위치에 서로 다른 유형(변수)을 보유할 수 있습니다. |
| 2. 한 번에 하나만 저장되지만 여러 유형(변수)을 포함할 수 있습니다. | 2. 한 번에 모두 메모리에 저장될 수 있는 여러 유형(변수)을 포함할 수 있습니다. |
| 3. 유니온 멤버는 아무 수나 존재할 수 있습니다. 그러나 유니온 유형 변수는 그 멤버가 차지하는 가장 큰 메모리를 사용합니다. | 3. 모든 멤버의 크기만큼의 메모리가 필요합니다. |
| 4. 처리 중에 한 번에 하나의 멤버만 접근할 수 있습니다. | 4. 처리 중에 모든 멤버에 언제든지 접근할 수 있습니다. |
| 5. 유니온의 범위는 함수이며, 그 멤버의 범위도 유니온 자체와 동일합니다. (프로그램에서 직접 접근할 수 있습니다). | 5. 구조체의 범위는 함수에만 해당합니다. 구조체 멤버는 프로그램에서 직접 접근할 수 없습니다. |
6. 유니온에 대한 작업
유니온은 구조체와 유사하며 구조체와 같은 모든 작업을 수행할 수 있습니다. 유니온에 대한 작업은 다음과 같습니다.
| | • 유니온 변수를 다른 유니온 변수에 할당할 수 있습니다.
• 유니온 변수를 매개변수로 함수에 전달할 수 있습니다.
• 주소 연산자(&)를 사용하여 유니온 변수의 주소를 추출할 수 있습니다.
• 함수는 유니온 또는 유니온에 대한 포인터를 수용하고 반환할 수 있습니다. |
| | / 82_union.c /
#include
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
union u_emp ue;
printf(“직원 번호 입력 : “); scanf(“%d”, &ue.eno);
printf(“직원 이름 입력 : “); scanf(“%s”, ue.name);
printf(“직원 급여 입력 : “); scanf(“%f”, &ue.sal);
printf(“\n\n직원 세부정보는 다음과 같습니다… “);
printf(“%d %s %f “, ue.eno, ue.name, ue.sal);
return 0;
} |
| | 출력은 무엇인가요?
오직 ue.sal만 정확합니다. 나머지 변수는 어떻게 되나요? |
어떤 순간에도 유니온 변수 중 하나만 의미 있는 값을 가집니다. 마지막으로 기록된 멤버만 읽을 수 있습니다. 이 시점에서 다른 변수는 쓰레기 값을 포함합니다. 활성 변수를 추적하는 것은 프로그래머의 책임입니다(즉, 마지막으로 접근한 변수).
직원의 기록을 수용하고 표시하는 가장 좋은 방법은 다음과 같습니다.
| | / 83_emp.c /
#include
union u_emp
{
int eno;
char name[20];
float sal;
};
int main()
{
union u_emp ue;
printf(“\n직원 번호 입력 : “); scanf(“%d”, &ue.eno);
printf(“\n%d”, ue.eno);
printf(“\n직원 이름 입력 : “); scanf(“%s”, ue.name);
printf(“\n%s”, ue.name);
printf(“\n직원 급여 입력 : “); scanf(“%f”, &ue.sal);
printf(“\n%f”,ue.sal);
return 0;
} |
7. 유니온의 범위
유니온의 범위는 구조체와 다릅니다. 구조체 변수는 그 함수에서만 접근할 수 있습니다. 반면 유니온과 그 멤버는 그 함수에서 접근할 수 있습니다.
| | / 84_scope.c /
#include
int main()
{
union
{
int i;
char c;
float f;
};
i = 10; c = ‘a’; f = 4.5; / 유니온 멤버 /
printf(“c의 값은 : %c”, c);
return 0;
} |
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.