본문 바로가기

볼봇의 코딩 생활/C++

[C++] 공유체 union 과 구조체 struct

전설적인 그가 강림 하였다.

 

C++ 에는 묶음 타입으로 class, struct, union 이렇게 세가지를 제공 하고 있다.

 

우리가 프로그래밍을 하면서 (필자는 특히 게임 쪽이다) 클래스와 구조체는 많이 들어와 봤을 것이라고 생각 한다.

 

그렇다면, union 은 무엇이고, 이름도 비슷한 구조체와는 또 뭐가 다를까? 생각해본다.

 

유니온? 유니콘 같네요.

(이 글을 쓰면서 자꾸 유니콘이라 써서 곤란한 1人)

 

공유체의 정의는, "하나의 메모리 저장소를 여러개의 데이터 타입을 가진 멤버들이 공유 하는것" 이다.

 

필자도 그려봤지만 모르겠다.

 

구조체의 경우 각각의 멤버 변수마다 메모리를 알맞게 할당하는 반면

공유체는 하나의 메모리에 여러 변수가 사용된다.

 

그렇기 때문에, 당연히 해당 변수의 바이트 값이 다르면 에러가 발생하게 된다.

 

 

 

union Data1 {
	int		v_int;
	float	v_float;
	char	v_string[4];
};

 

위 코드를 보도록 하자. Data1 을 공유체로 선언 하였다.

저 멤버 변수들의 공통점은 무엇일까? 바로- 크기가 4byte 라는 것 이다.

즉, 저 공유체의 크기는 4Byte 가 된다. 

만약 union 키워드를 struct 로 바꾼다면, 12byte 가 될 것이다 (4 * 3 = 12)

 

 

맞는지, 같은 모양의 구조체를 하나 만들고 사이즈를 출력해보겠다.

 

 

#include "pch.h"
#include <iostream>

union Data1 {
	int		v_int;
	float	v_float;
	char	v_string[4];
};

struct Data2 {
	int		v_int;
	float	v_float;
	char	v_string[4];
};

int main() {
	std::cout << "UNION : " << sizeof(Data1) << std::endl;
	std::cout << "STRUCT : " << sizeof(Data2) << std::endl;
}

 

 

마지막으로, 메모리를 정말로 공유하고 있는지 확인 해보겠다.

 

새로운 코드를 다시 작성해본다.

#include "pch.h"
#include <iostream>

union Data1 {
	float	v_int;
	float	v_float;
	char	v_string[4];
};

int main() {
	Data1 d1;
	d1.v_int = 3.14;

	std::cout << d1.v_float << std::endl;
}

코드를 보면, 공유체 하나를 만들고, v_int 멤버 변수에 값을 지정 한다.

하지만, 출력에서는 v_float 변수를 사용 한다.

 

만약 구조체라면, 절때로 v_int 의 값이 나오지 않을것이다.

 

하지만, 공유체는 앞서 말했듯 메모리를 공유 하고 있기 때문에, v_float 변수에서도 같은 값이 나와야 한다.

 

실행 결과

 

물론 어떤 사람도 이렇게 프로그램을 짜지 않는다.

 

공유체는 주로 C 언어로 제작한 공유체와 호환을 하기 위해 사용한다고 한다.

 

여러 프로그래밍 책을 봐 왔지만 공유체의 설명이 많이 부족하도 생각해서 개인적으로 정리 해보았다.

포스팅에 오류가 있다면 댓글로 제보 부탁 드립니다!

'볼봇의 코딩 생활 > C++' 카테고리의 다른 글

[C++] 이중 포인터 사용 예  (0) 2019.12.15
[C++] auto 와 decltype 의 차이  (0) 2019.08.26