본문 바로가기

BackEnd/C랑 C++

STRUCT와 UNION을 알아보자

STUCT(구조체)와 UNION(공용체)은 데이터를 묶음으로 사용하는 자료구조다
정의 방법도 비슷하고 사용 이유도 같지만,
둘의 차이점은 메모리 적재 방식이다

메모리에 어떻게 쌓이길래 다른지와 사용 방법에 대해 간단히 정리하겠다


** 메모리 묶음 타입 **
C - STRUCT와 UNION 제공
C++ - Class, STRUCT, UNION 제공



1. STRUCT와 UNION 사용 방법

(1) STRUCT (구조체) 사용

struct라는 단어에 생소해할 필요는 없다
int, char형 등의 데이터 형과 결국에는 같다 ㅇㅇ


STRUCT의 특징
- 데이터를 다채롭게 표현할 수 있다
- 데이터형의 역할이다
- 구조체 이름 지을 때는 C 명명 규칙 사용하면 좋다
- 구조체 확장 개념 → Class (C++에서)


struct는 아래와 같이 사용 가능하다

struct myStruct { int num; char *str; double dnum; };


데이터 타입과 변수를 정의한 목록을
struct라는 키워드를 사용하여 변수들을 묶어줄 수 있다

struct myStruct2 { int num1; }; struct myStruct { int num; char *str; double dnum; myStruct2 my_struct; };


또한 구조체 안에 다른 구조체를 선언하는 것도 가능하다
구조체 멤버에 접근할 때는 .이나 ->같은 접근법을 사용하면 된다

int main(void) { myStruct struct1; struct1.num = 10; cout << struct1.num << endl; struct1.my_struct.num1 = 15; cout << struct1.my_struct.num1 << endl; myStruct *struct2 = new myStruct; struct2->num = 20; cout << struct2->num << endl; return 0; }


myStruct 구조체에 대해 선언과 메모리 할당 두 경우에 대해
구조체 변수에 접근해본 예시이다

구조체 내에 있는 구조체에도 접근할 수 있는 것도 확인해보았다
결과는 아래와 같다


(2) UNION (공용체) 사용


UNION 이름은 뭔가 좀 멀게 느껴지는데 struct와 유사하다


UNION 특징
- 동일 메모리 영역을 여러 멤버 변수가 공유한다
- 모든 멤버 변수가 같은 공간을 공유



↑ 메모리 내용에 대해서는 아래에서 다시 다룰거다
UNION 사용 방법은 아래와 같다

union myUnion { int num; char *str; double dnum; };


struct랑 같은 역할이고, 방법이 비슷한데
키워드만 union으로 바뀐거여서 사용시에는 큰 다른 점이 없다

union은 byte 또는 bit 단위 계산을 할 때 많이 사용한다
일반 데이터형 변수 사용 방법은 struct와 같기 때문에
unsigned 정수형 타입을 사용한 예시를 다루겠다

union myUnion { uint8_t num1; uint16_t num2; uint32_t num3; uint64_t num4; }; int main(void) { myUnion union1; union1.num1 = UINT8_MAX; union1.num2 = UINT16_MAX; union1.num3 = UINT32_MAX; union1.num4 = UINT64_MAX; cout << unsigned(union1.num1) << endl; cout << union1.num2 << endl; cout << union1.num3 << endl; cout << union1.num4 << endl; return 0; }


참고)
** uint8_t를 출력시 unsigned() 사용 이유 **

출력 연산자가 uint8_t은 unsigned char 와 같이 처리하기 때문에
ASCII 코드(가장 일반적인 문자 인코딩 시스템)로 문자를 인쇄
uint8_t는 unsigned char의 별칭일 뿐임


결과 사진 +_+


2. STRUCT와 UNION 메모리 적재 방식


이 글의 첫 머리글에서 STRUCT와 UNION의 차이점은
메모리 적재 방식이라고 하였는데,
사실 이 부분에 대해 정리하기 위해 이 글을 쓴 것이다

바로 위에서 union에서 unsigned형 멤버 변수를 선언한 예제를 봤는데
요 unsigned 형 멤버 변수를 struct에서도 써보겠다

struct myStruct { uint8_t num1; uint16_t num2; uint32_t num3; uint64_t num4; }; union myUnion { uint8_t num1; uint16_t num2; uint32_t num3; uint64_t num4; }; int main(void) { myStruct struct1; myUnion union1; union1.num1 = UINT8_MAX; union1.num2 = UINT16_MAX; union1.num3 = UINT32_MAX; union1.num4 = UINT64_MAX; cout << sizeof(struct1) << endl; cout << sizeof(union1) << endl; return 0; }


결과가 어떻게 나올까?

?

struct와 union의 크기는 다르게 출력된다
왜 그런지를 알아보도록 하자


** 메모리의 구조 **

운영체제가 제공하는 메모리 공간


컴파일된 프로그램을 실행하기 위해선
위와 같은 영역으로 나뉘어 메모리에 로드가 되어야 한다

변수이냐 글로벌 변수냐, 스레드냐 등에 따라서 운영체제는
코드영역/데이터 영역/스택영역/힙 영역으로
메모리를 할당을 해준다

메모리 구조

위의 그림을 보면 (조금 복잡하게 생겼지만 ㅜ)
우리가 사용하는 변수나 전역 변수 그리고 struct 형의 구조체도
각 메모리 영역에 할당이 되는데,
이를 메모리 적재 방식이라고 한다


즉, struct와 union의 메모리 적재 방식이 다르다는건
메모리 영역에 할당될 때의 방법이 다르단 거다

그러면 어떻게 다르냐?

TCPSchool 사랑합니다


STRUCT는 char, short, int 와 같이 각각의 변수들이 공간을 각각 차지한다

char 형(1byte) + short형 (2byte) + int형 (4byte) => 8 byte를 차지하는 것이다
합은 7인데, padding 값이 포함돼서 8byte인데
이는 padding에 대해서 찾아보길 바란다

UNION은 모든 멤버 변수가 같은 공간을 공유한다
그리고, 그 중 가장 큰 자료형 공간을 공유한다
위 그림에서 int형 (4byte)가 가장 크기 때문에 4byte의 공간을 공유한다

이러한 이유로
위에 예시로 든 unsigned 형 예시에서도 struct와 union 자료구조의
크기가 다르게 나온 것이다


UNION은 미리 알 수 없는 데이터 타입에 대한걸 저장할 때 사용한다
같은 크기로 구성된 배열 요소에 다양한 크기를 저장할 수 있다 이 말

struct와 union이 사용은 헷갈리지만
그 용도와 차이점을 생각해서 쓰면
메모리 절약에도 도움이 될 것이다 +_+


[ 참고 자료 ]

https://stackoverflow.com/questions/19562103/uint8-t-cant-be-printed-with-cout

uint8_t can't be printed with cout

I have a weird problem about working with integers in C++. I wrote a simple program that sets a value to a variable and then prints it, but it is not working as expected. My program has only two ...

stackoverflow.com


http://tcpschool.com/c/c_struct_unionEnum

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com