본문 바로가기
c언어

c언어 공용체에 대하여 알아보기

by 개발자 L 2023. 1. 30.
반응형

c언어 공용체에 대하여 알아보기

네 안녕하세요, 이번 포스팅에서는 공용체에 대하여 알아보도록 하겠습니다.

c언어에서는 같은 메모리 영역을 여러 개의 변수들이 공유할 수 있도록 하는 기능이 있는데,

이것을 공용체라고 부릅니다.

그리고 이를 하는 이유는 메모리를 절약하기 위해서 사용을 합니다.

실제로 c언어에서 쓰이는 메모리의 크기는 꽤 큰 편이라서,

다 쓴 소스파일 역시 꽤 크게 저장이 되는 편입니다.

그래서 메모리를 공유해도 되는 경우라 한다면 공용체를 쓰는 것을 권장합니다.

그럼 지금부터 공용체를 어떻게 쓰는지 알아보도록 하겠습니다.

 

1. 공용체 생성 방법

공용체를 생성하는 방법은 구조체를 생성하는 방법과 매우 비슷합니다.

사용 방법은 이렇습니다.

union sample
{
    int i;
    char c;
}; // i, c : 같은 메모리 공간 공유

이런 식으로 씁니다.

사용되는 키워드는 'union'이고, 형태는 구조체와 똑같습니다.

그리고 구조체와 다른 점이 있다면, 어떤 때에는 문자나 정수 둘 중 하나만 존재할 수도 있다는 점입니다.

 

1 - 1. 공용체 변수 선언하기

그리고 공용체는 구조체와 마찬가지로,

위에서 보여드린 코드는 공용체의 틀만 잡아둔 것이라서,

공용체 변수를 선언할 때는 이렇게 해야 합니다.

union sample a;

공용채 변수의 특징이 있다면,

공용체 변수는 공용체 안에 있는 멤버들 중 메모리가 할당되는 용량이 가장 큰 멤버의 크기와 일치합니다.

위의 코드에서는 문자형 자료형 보다 정수형 자료형의 크기가 크므로, 4바이트로 공용체 변수의 크기가 정해진 겁니다.

 

1 - 2. 공용체 멤버 초기화 하기

공용체 역시 구조체처럼 초기화가 가능합니다.

하지만 한 가지 다른 점이 있다면, 공용체는 구조체 처럼 한 번에 다수를 초기화할 수 없고,

한 번에 하나의 멤버만 사용이 되기 때문에 첫 번째 멤버만 초기화가 됩니다.

이런 식으로 말이죠.

union sample a = {'A'};
반응형

 

1 - 3. 공용체 멤버에 접근하기

공용체 멤버에 접근하는 방법 역시 구조체 멤버에 접근하는 것처럼 구조체 멤버 연산자인 온점(.)을 사용하여 접근하면 됩니다.

그럼 이를 이용해서 공용체에 저장한 값을 출력하는 프로그램을 한 번 작성을 해보도록 하겠습니다.

#include <stdio.h>

union sample
{
    int i;
    char c;
};

int main()
{
    union sample a;

    a.c = 'A';

    printf("a.c = %c, a.i: %d\n", a.c, a.i);

    a.i = 1000;

    printf("a.c = %c, a.i: %d\n", a.c, a.i);

    return 0;
}

이렇게 한 번 작성을 해봤습니다.

그럼 결과를 한 번 보도록 하겠습니다.

a.c = A, a.i: 4194369
a.c = , a.i: 1000

결과가 나오긴 했는데,

각각의 결과가 이상하게 나왔죠?

그 이유는 공용체에서 초기화를 하기 위해 선택한 멤버에 따라 저장한 값이 다 다르게 해석이 되기 때문입니다.

그렇기 때문에 개발자는 값을 올바르게 저장을 하고 사용을 해야만 공용체를 쓰면서 오류를 범하지 않을 수 있습니다.

그리고 공용체는 어떤 멤버를 통해 값을 받았는지 기억을 하지 않기 때문에 개발자가 기억을 하고 있어야 합니다.

따라서 공용체에는 어떤 값을 받았는지 기억시키기 위한 변수를 따로 추가하여 작성을 합니다.

그리고 이러한 특성 때문에 동일한 메모리 영역에 대하여 여러 가지 해석을 요구하는 응용 프로그램을 만들 때 쓰입니다.

그럼 공용체 멤버를 기억시키는 변수를 넣어서 하나의 간단한 코드를 짜보도록 하겠습니다.

#include <stdio.h>
#include <string.h>

#define STUDENT_NUMBER 1
#define RESIDENT_NUMBER 2

struct student
{
    int type; // 공용체가 사용하는 변수 저장

    union
    {
        int student_number;
        char resident_number[15];
    } id;

    char name[20];
};

void info(struct student s)
{
    switch(s.type) 
    {
        case STUDENT_NUMBER:
        {
            printf("학번 : %d\n", s.id.student_number);
            printf("이름 : %s\n", s.name);

            break;
        }

        case RESIDENT_NUMBER:
        {
            printf("주민등록번호 : %s\n", s.id.resident_number);
            printf("이름 : %s\n", s.name);

            break;
        }

        default:
        {
            printf("타입 오류\n");

            break;
        }
    }
}

int main()
{
    struct student s1, s2;

    s1.type = STUDENT_NUMBER;
    s1.id.student_number = 20230001;
    strcpy(s1.name, "홍길동");

    s2.type = RESIDENT_NUMBER;
    strcpy(s2.id.resident_number, "970615-1928493");
    strcpy(s2.name, "이성계");

    info(s1);
    info(s2);

    return 0;
}

이렇게 한 번 작성을 해봤습니다.

여기서 학번과 이름은 구조체 안에서 같이 공유되어 사용이 될 수 있기 때문에 공용체로 한 번 더 묶어서 나타냈습니다.

그럼 결과를 한 번 보도록 하겠습니다.

학번 : 20230001
이름 : 홍길동
주민등록번호 : 970615-1928493
이름 : 이성계

결과 역시 잘 나옵니다.

이렇게 무언가 공유가 가능한 경우에는 공용체를 쓰면 메모리 절약도 되고,

가독성이 향상됩니다.

 

여기까지 공용체에 대하여 알아보았습니다.

다음 포스팅에서는 열거형에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글