카메라 개발자 공부방(SW)

[27장] union 본문

Langauge/C

[27장] union

luckmart 2021. 10. 20. 21:34
반응형

오늘은 union에 대해 공부해볼 시간입니다.

union도 struct와 마찬가지로 기존에 있던 data type을 조합해서 새로운 data type을  정의할 수 있는 사용자 정의 data type입니다.

union의 정의는 아래와 같이 합니다.

union Point {
    int x;
    int y;
};
#include <stdio.h>

union Point {
    int x;
    int y;
};

int main()
{
    union Point point;
    point.x = 4;
    point.y = 4;
    
    printf("%d %d\n", point.x, point.y);
    return 0;
}

// 실행결과
// 4 4

union을 사용해본 예제입니다. 참 간단하죠?

union의 메모리 그림

struct와 사용하는 같은 것 같아도 차이점은 있습니다.
struct의 멤버 변수는 변수마다 메모리가 독립적으로 존재하였지만,
union의 멤버 변수는 메모리를 서로 공유합니다.

#include <stdio.h>

union Point {
    int x;
    int y;
};

struct Person {
    int age;
    int cm;
};

int main()
{
    union Point point;
    point.x = 4;
    point.y = 8;
    
    struct Person person;
    person.age = 32;
    person.cm = 180;
    
    printf("%d %d\n", point.x, point.y);
    printf("%d %d\n", person.age, person.cm);
    return 0;
}

// 실행결과
// 8 8
// 32 180

Point는 union으로 선언되었기 때문에 Point의 멤버 변수 x와 y는 메모리가 서로 공유가 됩니다. 그렇기 때문에 나중에 변경된 y 값인 8로 출력이 되었습니다. 반면, Person의 멤버 변수 age와 cm은 메모리가 독립적이기 때문에 저장된 값 별로 각각 출력되었습니다.

union의 메모리 크기는 멤버 변수 중에서 가장 큰 data type의 크기를 넘지 않습니다

#include <stdio.h>

union Point {
    int x;
    int y;
    short dx;
    short dy;
};

struct Person {
    int age;
    int cm;
};

int main()
{
    union Point point;
    struct Person person;

    printf("%d\n", sizeof(Point));
    printf("%d\n", sizeof(Person));

    return 0;
}

// 실행결과
// 4
// 8

Point의 멤버 변수 중에서 int의 data type이 제일 크기 때문에 4가 출력되고, Person은 멤버 변수의 메모리가 독립적으로 존재하니 8이 출력됩니다.

union과 struct의 메모리 차이

union에서 point와 point.x의 크기는 같지만 data type은 다릅니다!
point의 data type은 union data type이고, point.x는 int data type입니다. 크기가 같다고 절대로 같은 data type이 아니란 걸 주의해주세요.

union을 사용하는 이유는 1) 주로 메모리 절약하기 위해서,
2) 같은 메모리 공간에 이름을 하나 더 붙여 사용하고 싶을 때 주로 사용합니다.

다음 예제를 보면서 마무리하겠습니다.

#include <stdio.h>

union data {
    char data[4];
    int n;
};

int main()
{
    union data d;
    d.data[0] = 'A';
    d.data[1] = 'B';
    d.data[2] = 'C';
    d.data[3] = 'D';

    printf("%X\n", d.n);
    return 0;
}

// 실행결과
44434241

1byte마다 'A' 'B' 'C' 'D'를 16진수 형태로 저장을 하였습니다.
8bit마다 해당 비트가 16진수로 형태로 저장이 되어 있으니깐 44434241이 출력되었네요!

메모리 그림

자 오늘은 여기까지!

'Langauge > C' 카테고리의 다른 글

[28장] 비트필드  (0) 2021.10.22
[25장] main 함수의 인자전달  (0) 2021.10.18
[26장] 가변인자  (0) 2021.10.17
[24장] const  (0) 2021.10.13
[23장] 파일 입출력  (0) 2021.10.12
Comments