cCcode

C Language [핵심정리] - 31 본문

C Language Basic

C Language [핵심정리] - 31

cCcode 2021. 6. 21. 23:53

1. 공용체 사용하기

이번에는 공용체를 사용해보겠습니다. 이름만 들어선 공용'체' 와 구조'체' 비슷하게 들리지 않나요? 하지만 공용체정의방법 멤버저장하는 방식구조체와는 전혀 다릅니다. 

구조체와 공용체

공용체union 키워드를 사용해 정의합니다.

공용체 정의

다만 공용체 또한, 구조체처럼 정의만 해선 사용할 수 없고 변수로 선언을 해줘야 사용할 수 있습니다.

◎ union 공용체명 변수명;

union 사용

사용방법이 구조체와 거의 유사합니다. 

결과

다만 결과를 보시면 마지막에 수정한 black_smoke 멤버를 제외한 나머지 멤버들의 이 이상해진 걸 볼 수 있습니다. 그 이유는 공용체는 모두 하나의 공간공유하기 때문인데요. 따라서 어느 한 멤버의 값을 저장하면 나머지 값들이 사용할 수 없는 상태가 되는겁니다.  만약 공용체 멤버를 모두 사용하고 싶다면 한번에 하나의 멤버를 사용하면 해결될 문제입니다.

수정
결과

여기서 한 가지 의문이 들겁니다. 분명히 제일 큰 자료형의 공간을 공유하면 char (1byte) * 10 즉, 공용체의 size가 10이 되어야 하는거 아닌가? 하는 의문 말이죠. 저도 사실 이해가 가지 않는 부분이라 따로 확인해보니 공용체에서도 정렬이 사용되는 거 같더라고요. 

 

멤버의 자료형 변경

이처럼 한 멤버의 자료형을 double로 바꿔준 후 size를 출력하면 

결과

크기가 변합니다. 그래서 저는 여기서 제일 큰 자료형은 (char 자료형의 배열을 하나의 char 자료형으로 생각할 때)은 double 이고, 이 때 8byte로는 char 자료형의 배열모두 담아낼 수 없습니다 . 따라서 8byte 공간을 하나 더 생성했기 때문에 제일 큰 공간 16byte를 출력한게 아닐까 조심스레 추측해봅니다.

 

공용체와 엔디언
결과

공용체 변수 멤버 중 가장 큰 자료형인 int형 즉, num2에 0x12345678이라는 할당했습니다. 그런데 여기서 결과를 보시면 분명히 공간을 공유할 텐데 출력되는 값이 다르네요? 그 이유는 물론 공간을 공유해 할당된 값 또한 공유하지만 값을 가져올 때는 해당 자료형크기만큼만 가져오기 때문이죠. 

 

그런데 어째서 0x12340x12 가 아닌 0x56780x78이 나오는 걸까요? 그 이유는 우리가 사용하는 x64 계열 CPU리틀 엔디언이라는 방식으로 값을 메모리저장하기 때문인데요. (x86은 32bit 입니다.) 간단히 말해 리틀 엔디언은 숫자를 1byte 마다 나눠서 낮은 자릿수가 앞에 오게 배치합니다. 따라서 우리(인간)의 관점에서 보자면 반대로 뒤집힌것처럼 보이게되죠.

리틀 엔디언
빅 엔디언

그림으로 확인하니 이해하기 한결 간단하죠?

 

+ typedef 와 익명 공용체

구조체처럼 공용체 또한 마찬가지로 typedef별칭을 지정하고, 익명 공용체를 정의할 수 있습니다.

별칭
익명 공용체
정의와 동시에 변수 선언

 

구조체와 마찬가지로 공용체포인터선언할 수 있고 또한 malloc 함수로 동적할당 할 수 있습니다.

공용체와 동적할당
결과

공용체 변수의 주소를 그대로 사용할 수도 있죠.

공용체 변수의 주소 사용
결과

결론 : 공용체와 구조체는 공간을 공유한다는 점과 리틀엔디언을 사용한다는 점을 제외한 문법적인 부분은 모두 동일합니다.

 

Ps. 설명이 간략해졌다고 생각하실 수 있지만, 이미 여러분들이 다 배우신겁니다.

'C Language Basic' 카테고리의 다른 글

C Language [핵심정리] - 33  (0) 2021.06.29
C Language [핵심정리] - 32  (0) 2021.06.27
[부록] 산술 연산 계산기 (완성본)  (0) 2021.06.19
C Language [핵심정리] - 29  (0) 2021.06.15
C Language [핵심정리] - 28  (0) 2021.06.15
Comments