자료실/C언어

C언어 - 공용체

자료수집중 2020. 7. 1.
반응형

공용체는 얼핏 보면 구조체와 비슷하지만 메모리를 사용하는 게 다릅니다.

구조체는 멤버들이 각각 메모리를 할당해주지만, 공용체는 멤버 변수 중 메모리 크기가 가장 큰

만큼만 할당됩니다.

할당된 메모리를 모든 멤버 변수가 공유를 하기때문에 모든 멤버 변수들의 값을 저장할 수 없는 경우도 있습니다.

 

정의 및 선언방법, 사용방법은 구조체와 비슷합니다.

대신 공용체는 struct가 아니라 union을 사용합니다. 

union 공용체이름 { 
//멤버 자료형 이름; 
    자료형 이름; 
    자료형 이름; 
    자료형 이름; 
    .
    .
    .
};
union 구조체이름  변수이름;

그러면 구조체와 공용체의 차이점을 예제를 통해 보겠습니다.

#include <stdio.h>

union uni_1 {
    char st[30];
    int num;
    float num2;
	
};
struct str_1 {
    char st[30];
    int num;
    float num2;
};
int main(void) {

    union uni_1 u;
    struct str_1 s;
    printf("u의 크기 = %d \n",sizeof(u));
    printf("s의 크기 = %d \n", sizeof(s));

    return 0;
}

union uni_1 u;의 크기는 32 struct str_1 s;의 크기는 40이 나왔습니다.

자세히 보면 union의 가장큰 크기와 struct의 메모리의 합의 크기가 다른 점 이 있습니다.

여기서 하나 알고 넘어갈 점이 패딩입니다.

구조체나 공용체는 정렬을 할 때 가장 큰 메모리 크기의 기준으로 정렬을 합니다.

int num;이 4byte로 가장 크기 때문에 4byte 기준으로 정렬을 하면 char st[30];가 2byte만큼 사용하지 않는 공간이 발생하는데 여길 채워주는 값을 패딩이라고 합니다. 그래서 구조체나 공용체는 sizeof()를 사용했을 때 크기가 더 크게 표시되는 경우가 있습니다.

 

이제 공용체가 메모리를 공유하는지를 예제를 통해 확인해보겠습니다.

#include <stdio.h>

union uni_1 {
    int num1;
    int num2;
    int num3;
	
};
int main(void) {

    union uni_1 u;
    u.num1 = 4;
    printf("%d \n", u.num1);
    printf("%d \n", u.num2);
    printf("%d \n", u.num3);

    return 0;
}

공용체 선언 후 첫 번째 멤버 변수만 값을 대입했지만

모든 멤버 변수들이 값이 같은걸 볼 수 있습니다.

구조체에서 이런 식으로 출력을 하면 에러가 발생합니다. 하지만 공용체는 메모리를 공유하기 때문에 한 멤버 변수에 저장하면 다른 멤버 변수들도 영향을 받게 됩니다.

 

공용체는 메모리를 효율적으로 관리하기 위해서 많이 사용합니다.

 

'자료실 > C언어' 카테고리의 다른 글

C언어 - typedef  (0) 2020.07.02
C언어 - 열거형  (0) 2020.07.02
C언어 - 문자열 변환  (0) 2020.06.30
C언어 - 문자,문자열의 입력, 출력  (0) 2020.06.30
C언어 - 문자열과 포인터  (0) 2020.06.29

댓글