본문 바로가기
IT/C

C언어 공용체, 열거형 , 형정의

by -_-* 2021. 1. 16.
반응형

우리는 지난 포스트에서 C언어 구조체에 대해서 살펴보았습니다. 

 

오늘은 C언어의 공용체와 열거형에 대해서 알아보도록 하겠습니다. 

 

 

공용체 

공용체는 다수의 멤버들이 동일한 메모리 공간을 공유할 수 있는 자료형입니다. 따라서 C언어의 공용체의 멤버들은 하나의 메모리 공간을 공동으로 사용할 수 있습니다. 

 

 

공용체의 특징 

- 메모리공간을 할당할 때, 공용체의 멤버들 중에서 가장 큰 크기의 공간을 메모리에 할당합니다. 

- 공용체의 멤버들은 하나의 기억공간을 같이 공유하기 때문에 동시에 사용될 수 없습니다. 

 

 

공용체 형식

union 공용체명
{
    멤버자료형 공용체멤버명 ; 
    ....
};

union 공용체명 공용체변수명; 

 

공용체의 형식은 구조체와 동일하고 구조체에서 사용하는 struct를 대신해 공용체임을 알려주는 키워드 union을 사용합니다. 위의 공용체 형식은 공용체를 정의하고, 공용체 변수를 별도로 선언하고 있습니다. 

 

union
{
    멤버자료형 공용체멤버명 ; 
    ....
} 공용체변수명; 

 

위의 형식처럼, 공용체도 정의와 동시에 공용체 변수를 선언할 수 있습니다. 

 

공용체 예제

 

#include <stdio.h>

int main(void) {

    //공용체 정의

    union test{

        char c;

        int i;

        double d;

    };

    union test x; //공용체변수 선언

    
    //공용체변수 사용_char
    x.c = 'a'; 

    printf("x.c : %c " , x.c);

    
    //공용체변수 사용_int

    x.i = 1; 

    printf("x.i : %d " , x.i);

    
    //공용체변수 사용_double
    x.d = 12.1;

    printf("x.d : %f \n" , x.d);

    //공용체변수 이전의 값은 없어짐

    printf("x.c after : %c " , x.c);
    printf("x.i after : %d \n" , x.i);
    
    //공용체 변수 크기
    printf("union x size : %d \n", sizeof(x));

    return 0;

}

 

위의 예제에서 공용체를 정의하고 있습니다. 공용체 이름은 test이고, 공용체 변수를 문자형 c, 정수형,i, 실수형 d를 가집니다. 

공용체도 구조체와 마찬가지로 도트연산자에 의해서 공용체멤버에 접근이 가능하고, 이를 이용해서 각각의 값을 할당했습니다. 

 

위의 예제에서 알 수 있듯이 공용체멤버는 메모리공간을 함께 공유하기 때문에 공용체멤버를 사용하여 값을 변경하면 기존의 저장된 값은 보관되지 않습니다. 공용체 멤버들은 메모리공간을 공유하기 때문에 가장 큰 자료형인 double형 만큼의 메모리 공간을 할당받아 위의 예제의 공용체의 크기는 8byte로 할당됩니다. 

위의 예제코드의 실행결과는 다음과 같습니다. 

 

 

 

공용체와 구조체의 비교 

 

#include <stdio.h>

int main(void) {

    //구조체 정의 및 구조체변수 선언

    struct s {

        int a,b,c;

    } struct_x;

   
    //공용체 정의 및 공용체변수 선언
   
    union u {

        int a,b,c;

    } union_y;

    
    //구조체변수 값의 할당
    
struct_x.a = 1;

    struct_x.b = 2;

    struct_x.c = 3;


    //구조체변수 값 출력 

    printf("struct_a:%d struct_b:%d struct_c: %d \n", struct_x.a, struct_x.b, struct_x.c);


     //공용체 값의 할당

    union_y.a = 1;

    union_y.b = 2;

    union_y.c = 3;

     
    //공용체변수 값 출력

    printf("union_a:%d union_b:%d union_c: %d \n", union_y.a, union_y.b, union_y.c);

 

    printf("struct size :%d, union size : %d \n", sizeof(struct_x), sizeof(union_y));

 

return 0;

}

 

구조체와 공용체는 정의하는 법과 사용하는 법이 동일해 비슷해 보일 수 있으나 가장 큰 차이점은 구조체는 구조체멤버들이 메모리 공간을 연속적으로 각각 할당받지만 공용체는 공용체멤버들 간의 메모리공간을 공유한다는 점입니다. 

 

위의 예제에서 알 수 있듯이 구조체의 경우 각 멤버의 값을 1,2,3 으로 할당하여 출력했을 때 각각의 구조체 멤버는 1, 2,3의 각자의 값을 가지고 있습니다. 이유는 간단하게도 메모리 공간을 별도로 가지기 때문입니다. 

그러나 공용체의 경우 각 멤버가 하나의 메모리 공간을 가지고 이를 공유하기 때문에 각 멤버의 값을 1,2,3으로 할당하여 출력하여도 가장 마지막에 할당된 3의 값만 가지게 됩니다. 

 

따라서 구조체변수의 크기는 메모리에 정수형 4byte의 3개의 공간을 가지므로 12byte를 할당받게 되고, 

공용체변수의 경우 메모리에 정수형 4byte 1개의 공간을 할당받습니다. 

 

위의 예제에 대한 실행 결과는 다음과 같습니다. 

 

 

열거형

기호 상수들의 집합으로, 임의의 코드를 부여할 때 편리하게 사용할 수 있습니다. 

 

enum 열거형이름 {기호상수1,기호상수2,..., 기호상수n};
enum 열거형이름 열거형변수1, ..., 열거형변수n; 

 

사용하고자 하는 상수의 집합을 중괄호 {} 로 묶어준 뒤 enum 키워드를 이용하여 사용하고자 하는 열거형 이름을 붙여주면 됩니다. 

열거형이름을 붙여서 기호상수집합을 정의했다면, 이를 하나의 자료형처럼 사용하여 열거형 변수를 정의할 수 있습니다. 

 

enum 열거형이름 {기호상수1,기호상수2,..., 기호상수n} = 열거형변수1, ..., 열거형변수n; 

 

위의 형식처럼, 열거형도 정의와 동시에 열거형 변수를 선언할 수 있습니다. 

 

 

열거형 예제

#include <stdio.h>
enum days {MONDAY, TUESDAY, WEDNSEDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY}; //열거형 정의

 

int main(void) {

    enum days x, y; //열거형 변수 선언


    //열거형 변수 값 할당

    x= MONDAY;

    y=x+1; 

 

    printf("monday:%d tuesday: %d \n", x, y);

 

    return 0;

}

 

기호상수 요일에 대하여 days 라는 이름으로 열거형으로 묶어주면, 이를 열거형변수로 선언하여 활용할 수 있습니다. 

위의 예제코드에서 열거형 변수 x, y를 선언하여 x에 값을 MONDAY로 할당했습니다. 

열거형의 경우 {} 의 나열된 순서에 따라 0, 1 , .... ,N의 값을 가집니다. 따라서 %d 형식지정자를 이용하여 열거형변수x를 출력하면 0의 값을 가집니다. 

따라서 열거형 변수 y에 x+1 은 기호상수 값 0+1 이므로 열거형에 정의되어진 1에 해당되는 값이 저장됩니다. 

 

위의 예제에 대한 실행 코드는 다음과 같습니다. 

 

 

타입정의 (형정의) 

형정의라고도 하며 typedf 키워드를 이용해서 자료형에 새로운 자료형 이름을 사용자가 임의로 부여할 수 있습니다. 

 

typedef 기존자료형이름 새로운자료형이름

 

타입정의 예제

 

#include <stdio.h>
//타입정의
typedef int INTEGER;


int main(void) {

    INTEGER a=1, b = 2; //타입정의 사용하여 변수선언

    printf("a:%d b: %d \n", a, b);

    return 0;

}

 

데이터타입 즉 자료형을 우리가 사용하고자하는 이름으로 식별자 규칙에 의해 붙여서 사용하는 방법이 타입정의라고 했습니다. 위의 경우 자료형 int를 우리는 INTEGER 라고 타입정의를 하여 아래의 main함수에서 int 자료형의 위치에 대신하여 INTEGER라고 사용하고 있습니다. 

 

위의 예제코드에 대한 실행 결과는 다음과 같습니다. 

 

 

 

오늘은 공용체가 무엇인지 알아보고 공용체와 구조체를 비교해보았습니다. 그리고 열거형과 타입정의에 대하여 같이 살펴보았는데요. 다음 포스트에서는 포인터에 대해서 알아보도록 하겠습니다. 감사합니다. 

반응형

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

C언어 포인터  (0) 2021.01.21
C언어 구조체  (0) 2021.01.14
c언어 배열  (0) 2021.01.13
C언어 분기문 break /continue /goto / return  (0) 2021.01.12
C언어 반복문  (0) 2021.01.11

댓글