Ch06. 복합데이터 - 06. 공용체(union)

2025. 4. 2. 23:24Programming Language/C++

반응형

특정 변수에 대해서 값은 하나만 필요한데 그 하나의 값이 여러개의 자료형일 경우에는 어떻게 해야할까?

예를 들어 어떤 품의 ID가 정수형일 수도 문자열일 수도 있는 경우는 어떻게 해야할까?

struct Produce {
    int idGubun; // 어떤 타입으로 값을 받을지 지정하는 멤버변수
    int idInt;
    char idChar[100];
};

Product p1 = {0, 15};

if(p1.idGubun == 0){
    std::cout << p1.idInt << std::endl;
}else{
    std::cout << p1.idChar << std::endl;
}

이렇게 사용하면 id가 int인지 char[]인지를 구분할 idGubun이라는 멤버 변수를 만들어줄 필요가 생기고 각 타입마다 메모리 공간을 차지하는 비효율적인 상황이 발생한다.

 

이런경우에 공용체라는 타입을 사용하면 된다

1. 공용체(union)

여러 개의 멤버를 같은 메모리 공간에 겹쳐서 저장하는 사용자 정의 자료형으로 구조체(struct)는 모든 멤버가 각각의 메모리 공간을 가지나 공용체(union)는 모든 멤버가 하나의 메모리 공간을 공유한다.

 

다시말해 공용체는 여러 개의 타입 중 "하나만" 사용할 때 메모리 절약을 위해서 사용하면 된다

2. 공용체의 정의, 선언 및 초기화

공용체의 정의는 union이라는 키워드를 통해서 정의한다

union 공용체명 {
    int mem1;
    float mem2;
    char mem3;
};

이때 mem1과 mem2와 mem3은 같은 메모리 공간을 공유하고 그렇기에 한번에 하나의 값만 저장이 가능하다.

 

예를 들어 Product라는 공용체를 선언했다고 하자

union Product {
    int idInt;
    char idChar[2];
    short idShort;
}

이렇게 선언되었을 경우 

Product p;

구조체와 동일한 방법으로 선언을 하고 

p.idInt = 10;

멤버를 구조체를 부를 때와 동일한 방법으로 불러 값을 초기화할 수 있다.

물론 공유체의 경우는 모든 멤버변수에 값을 한번에 할당하는 것은 불가능하다.

 

만약에 공용체에 순서대로 

p.idInt = 10;
p.idChar = "AI";
p.idShort = 30;

을 넣는다면 

넣어질때 마다 덮어 써지게 된다.

그래서 최종적으로 마지막에 저장한 

p.idShort = 30;

이 변수만 유효하게 되고 idInt와 idChar는 손상되게 된다.

 

3. 공용체의 메모리 구조

공용체의 크기는 가장 큰 멤버의 크기로 결정된다.

멤버로 

union Product {
    int idInt;
    char idChar[2];
    short idShort;
}

이렇게 존재한다면 가장 큰 타입인 int의 크기인 4바이트로 구성된다.

그런데 여기서도 만약에 구조체와 동일하게 정렬과 패딩의 개념이 추가 되어 만약 

union Product {
    int idInt;
    char idChar[10];
    short idShort;
}

이런식으로 공용체가 정의되었다면 가장 큰 타입은 4바이트의 배수로 크기가 지정될 것인데 공용체 자체는 가장 큰 타입인 char [10]배열을 기준으로 형성 되기에 10바이트로 구성이되고 거기에 4의 배수인 12 바이트로 만들기 위해서 패딩을 추가해준다.

그래서 공유체가 12바이트로 구성되게 된다.

 

 

반응형