C/C++에서 공용체(Union)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 설명하겠습니다.
공용체(Union)는 구조체와 유사한 사용자 정의 데이터 타입입니다. 공용체는 여러 멤버를 가질 수 있지만, 모든 멤버가 동일한 메모리 공간을 공유합니다. 즉, 공용체의 모든 멤버는 같은 메모리 주소를 가지며, 한 멤버의 값을 설정하면 다른 멤버의 값이 덮어쓰여집니다.
#include <stdio.h>
// 공용체 선언
union Data {
int i;
float f;
char str[20];
};
int main() {
// 공용체 변수 선언
union Data data;
// 공용체 멤버 접근 및 값 할당
data.i = 10;
printf("data.i: %d\n", data.i);
data.f = 220.5;
printf("data.f: %.1f\n", data.f);
strcpy(data.str, "Hello");
printf("data.str: %s\n", data.str);
// 다른 멤버의 값 출력 (덮어쓰여짐)
printf("data.i: %d\n", data.i);
printf("data.f: %.1f\n", data.f);
return 0;
}
C++에서는 struct 키워드 없이도 공용체 변수를 선언할 수 있습니다.
#include <iostream>
#include <cstring>
// 공용체 선언
union Data {
int i;
float f;
char str[20];
};
int main() {
// 공용체 변수 선언
Data data;
// 공용체 멤버 접근 및 값 할당
data.i = 10;
std::cout << "data.i: " << data.i << std::endl;
data.f = 220.5;
std::cout << "data.f: " << data.f << std::endl;
std::strcpy(data.str, "Hello");
std::cout << "data.str: " << data.str << std::endl;
// 다른 멤버의 값 출력 (덮어쓰여짐)
std::cout << "data.i: " << data.i << std::endl;
std::cout << "data.f: " << data.f << std::endl;
return 0;
}
공용체의 모든 멤버는 동일한 메모리 공간을 공유합니다. 공용체의 크기는 가장 큰 멤버의 크기로 결정됩니다.
공용체 선언:
union Data {
int i; // 4 bytes
float f; // 4 bytes
char str[20]; // 20 bytes
};
메모리 구조:
+------------------+
| 20 bytes |
+------------------+
i: [0-3]
f: [0-3]
str: [0-19]
공용체의 모든 멤버는 동일한 메모리 주소를 가집니다. 한 멤버에 값을 할당하면 다른 멤버의 값이 덮어쓰여집니다.
공용체를 사용하면 메모리 사용을 최적화할 수 있습니다. 여러 데이터 타입 중 하나만 사용해야 하는 상황에서 메모리를 절약할 수 있습니다.
공용체의 메모리 구조와 멤버 접근 방식을 이해하기 쉽게 그림과 표로 표현하였습니다.
공용체 선언:
union Data {
int i;
float f;
char str[20];
};
메모리 구조:
+----+----+----+----+----+----+----+----+----+----+
| i | f | str (20 bytes) |
+----+----+----+----+----+----+----+----+----+----+
0x1000 0x1004 ... 0x1014
공용체 멤버 접근:
data.i -> 0x1000 (4 bytes)
data.f -> 0x1000 (4 bytes)
data.str -> 0x1000 (20 bytes)
다양한 상황에서 공용체를 사용하는 예제를 추가로 제공합니다.
#include <iostream>
#include <cstring>
// 구조체 선언
struct Person {
char name[20];
int age;
};
// 공용체 선언
union Data {
int id;
float salary;
Person person;
};
int main() {
// 공용체 변수 선언
Data data;
// 공용체 멤버 접근 및 값 할당
data.id = 123;
std::cout << "data.id: " << data.id << std::endl;
data.salary = 75000.5;
std::cout << "data.salary: " << data.salary << std::endl;
std::strcpy(data.person.name, "John Doe");
data.person.age = 30;
std::cout << "data.person.name: " << data.person.name << std::endl;
std::cout << "data.person.age: " << data.person.age << std::endl;
return 0;
}
공용체는 여러 멤버가 동일한 메모리 공간을 공유하는 사용자 정의 데이터 타입입니다. 공용체는 메모리 사용을 최적화할 수 있는 장점이 있지만, 한 번에 하나의 멤버만 사용할 수 있는 제약이 있습니다. 공용체의 크기는 가장 큰 멤버의 크기로 결정되며, 모든 멤버는 동일한 메모리 주소를 가집니다. 운영체제는 공용체가 저장되는 메모리의 할당과 해제를 관리하여 프로그램이 효율적으로 공용체를 사용할 수 있도록 돕습니다.
이와 같은 내용을 통해 C/C++의 공용체에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!