ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1066) N
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (179) N
      • Unreal (69)
      • Unity (99) N
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 함수
  • string
  • Unity
  • 그래픽스
  • 프로그래머스
  • C++
  • 언리얼
  • 파이썬
  • c#
  • 백준
  • 클래스
  • 티스토리챌린지
  • C
  • 포인터
  • 배열
  • 알고리즘
  • 유니티
  • SQL
  • 문자열
  • 오블완

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

C++ 공용체(union) 개념과 통신에서의 사용 이유
프로그래밍 언어/C++

C++ 공용체(union) 개념과 통신에서의 사용 이유

2022. 11. 10. 16:23

union 정의

union은 struct와 유사하지만 union의 변수 중 가장 큰 변수의 메모리를 모든 변수가 공유한다는 점에서 다르다.

같은 변수를 가지는 struct와 union의 size를 출력해보면 아래와 같이 결과가 다른것을 확인할 수 있다.

typedef struct sizeTest_struct
{
    int a;	// 4byte
    double b;	// 8byte
}sizeTest_struct;

typedef union sizeTest_union
{
    int a;
    double b;
}sizeTest_union;

int main()
{
    sizeTest_struct s;
    sizeTest_union u;
    printf("struct size : %d\r\n", sizeof(s));	// 16
    printf("union size : %d\r\n", sizeof(u));	// 8
}

구조체는 가장 큰 변수를 기준으로 메모리를 할당한다. 따라서 위 sizeTest_struct는 double이 8바이트, int도 double을 따라서 8바이트로 할당되어 총사이즈는 16바이트가 출력된다.

그러나 sizeTest_union은 가장 큰 변수인 b가 double이므로 8바이트를 모든 변수가 공유하게 되어 총 사이즈는 8바이트가 출력된다.

 

변수들이 메모리를 공유하는건 변수들에 값을 넣어보면 바로 확인이 가능하다.

아래와 같이 union의 변수 a와 b에 0을 쓰면 둘 다 0을 출력함을 볼 수 있다.

#include <stdio.h>

typedef union test_union
{
    int a;
    int b;
}test_union;

int main()
{
    test_union u = {0, 0};
    printf("u.a : %d, u.b : %d\r\n", u.a, u.b);	// u.a : 0, u.b : 0
}

그리고 a에 10을 쓰면 a는 물론 b도 10을 출력함을 볼 수 있다.

#include <stdio.h>

typedef union test_union
{
    int a;
    int b;
}test_union;

int main()
{
    test_union u = {0, 0};
    printf("u.a : %d, u.b : %d\r\n", u.a, u.b);	// u.a : 0, u.b : 0
    
    u.a = 10;
    printf("u.a : %d, u.b : %d\r\n", u.a, u.b);	// u.a : 10, u.b : 10
}

 

다시 b에 20을 쓰면 a와 b 모두 20을 출력함을 볼 수 있다.

#include <stdio.h>

typedef union test_union
{
    int a;
    int b;
}test_union;

int main()
{
    test_union u = {0, 0};
    printf("u.a : %d, u.b : %d\r\n", u.a, u.b);	// u.a : 0, u.b : 0
    
    u.a = 10;
    printf("u.a : %d, u.b : %d\r\n", u.a, u.b);	// u.a : 10, u.b : 10
    
    u.b = 20;
    printf("u.a : %d, u.b : %d\r\n", u.a, u.b);	// u.a : 20, u.b : 20
}

union 활용

union은 변수들이 메모리를 공유한다는 특징 때문에 통신에서 아주 편리하게 이용된다. 

 

* 실제 동작하지 않는 예제코드

typedef union comm
{
    char buffer[4];
    struct {
        char version;
        char header;
        char length;
        char address;
    }segment;
}comm;

int main()
{
    MessageSend(comm.buffer[0]);
    MessageReceive(comm.segment.version, comm.segment.header, comm.segment.length, comm.segment.address);
}

통신을 위해서는 데이터를 주고받아야 한다. 그리고 데이터는 패킷 단위로 묶어서 보내게 되는데, 단순히 보내는 건 쉽지만 받는 입장에서는 덩어리로 온 데이터를 받아서 분해하고 다시 묶어서 보내기가 여간 까다롭다. 정확히는 까다롭다기보다는 귀찮다. 그런데 위와 같이 공용체를 사용한다면 보낼 때는 buffer로 한 번에 보내고 받을 때는 struct의 변수들로 각각 받을 수 있어서 편리하다. 이때문에 통신에서 union을 접할 수 있다.

 

출처 : [C, C++] 공용체(union) 개념과 통신에서의 사용 이유 - 코드 다이어리 (tistory.com)

저작자표시

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ call by value, call by reference  (0) 2022.11.17
C++ (template, auto, decltype) 타입 추론 Universal reference  (0) 2022.11.14
C++ struct(구조체), union(공용체) 크기에 대한 정리  (0) 2022.11.10
C++ 함수 객체 (Functor) / () 연산자 오버로딩  (0) 2022.11.08
C++ 클래스 접근제한자 관련 보충 내용  (0) 2022.11.07
    '프로그래밍 언어/C++' 카테고리의 다른 글
    • C++ call by value, call by reference
    • C++ (template, auto, decltype) 타입 추론 Universal reference
    • C++ struct(구조체), union(공용체) 크기에 대한 정리
    • C++ 함수 객체 (Functor) / () 연산자 오버로딩
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바