C언어(2020년)

28. union

리더2333 2020. 11. 4. 13:05
반응형
#include <stdio.h>

union Distance
{
    int inch;
    double meter;
};

int main()
{
    union Distance distance = { 20 };
    printf("%d\n", distance.inch);
    printf("%lf\n", distance.meter);

    distance.inch = 20;
    distance.meter = 0.508;
    printf("%d\n", distance.inch);
    printf("%lf\n", distance.meter);
    return 0;
}

union 은 구조체와 비슷하지만, 다른점은 변수를 1개만 사용할 수 있다는 것이다.

위의 예제에서 union 은 int inch 와 double meter 두개를 가지고 있지만,

이중 가장큰 double 의 크기인 8 byte 만큼만 할당된다.

 

이 8 byte 메모리를 int inch 도 쓰고, double meter 도 쓴다.

메모리를 공유 하는 것이다.

 

그렇기 때문에 int inch 를 사용하면, double meter 는 사용할 수 없다.

double meter 를 사용하면 int inch 를 사용할 수 없다.

 

union Distance distance = { 20 }; 이런식으로 초기화를 할 때에는

가장 앞에 있는 것만 초기화 할 수 있다.

이경우 int inch 에 20 이 초기화 된다.

 

printf 문으로  inch 와 meter 를 둘다 찍어보면, inch 는 정상적으로 20이 출력되고,

meter 는 정상적으로 출력이 안된다.

 

meter 에 값을 대입한 후에(distance.meter = 0.508)

다시 printf 문으로 inch 와 meter 를 확인해보면, 이번에는 meter 만 정상적으로 출력되는것을

확인 할 수 있다.

 

이렇게 변수 두개 또는 3개 를 넣고 그중 하나만 쓸 일이 뭐가 있냐 싶겠지만,

그 변수가 사용자 정의 변수인 구조체라고 한다면, 유용할 수 있다.

#include <stdio.h>

struct Human
{
    const char name[128]; // 이름
    const char RR_no[14]; // 주민등록 번호
    char Address[256];    // 주소
    int age;              // 나이    
    int height;           // 키
    int weight;           // 몸무게
};

struct Animal
{
    const char name[128];     // 이름
    const char HostName[128]; // 주인 이름
    const char kinds[128];    // 종류
    int age;                  // 나이
    int weight;               // 몸무게
};

union List
{
    struct Human human;
    struct Animal animal;
};

int main()
{
    int a = sizeof(Human);
    int b = sizeof(Animal);
    int c = sizeof(List);
    printf("%d,%d,%d\n", a, b, c);

    return 0;
}

// 실행결과
// 412,392,412

어떠한 상황에서 사람에 관한 자료도 필요하고, 애완동물에 대한 자료도 필요하다고 하자.

그리고 그것을 관리해주는 프로그램을 작성한다고 했을 때,

Human 을 쓴다면, Animal 은 필요없고, Animal 을 사용한다면 Human은 필요없을 것이다.

이런경우에 Human 과 Animal 을 union 으로 정의하면 둘중 하나만 쓸 수 있게 될 것이다.

반응형

'C언어(2020년)' 카테고리의 다른 글

30. 문자열  (0) 2020.11.04
29. typedef  (0) 2020.11.04
27. 전처리기  (0) 2020.11.04
26. 가변인자 함수 만들기  (0) 2020.11.04
25. Call by Value, Call by reference, Call by Address  (0) 2020.11.04