Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

냥집사의 개발일지

C언어 - 공용체,열거형,typedef (union,enum,typedef) 본문

C언어

C언어 - 공용체,열거형,typedef (union,enum,typedef)

깅햄찌 2022. 9. 26. 21:12
반응형

안녕하세요 오늘은 공용체, 열거형 typedef에 대해 정리해보겠습니다. 

3가지 모두 하나의 포스팅으로 하기에 양이 너무 적은 거 같아서 한꺼번에 모아서 알아보아요~

 

1. 공용체 union

저도 실무하면서 잘 못 보는 문법인데요.

임베디드 프로그래밍에서 가끔 쓰이는 경우가 있으니 알아두시면 좋을 것 같습니다.

 

공용체의 선언 방식은 struct와 같습니다.

아래 포스팅을 참고해주세요~

2022.09.23 - [C언어] - C언어 - 구조체 (struct)

 

C언어 - 구조체 (struct)

안녕하세요 오늘은 구조체에 대해 알아보겠습니다~ 지금까지는 기본 자료형(int, double, char etc.)등으로만 코드를 구성했다면 오늘은 사용자 정의 자료형 즉, user의 필요에 따른 자료형을 struct를

leggo-fire.tistory.com

#include<stdio.h>

union robot{
    char name;
    int serial_num;
    
};

int main(){
    union robot robot_A = {'A'};
    printf("robot_A's name : %c\n",robot_A.name);
    robot_A.serial_num = 1;
    printf("robot_A's name : %c\n",robot_A.name);
    printf("robot_A's serial_num : %d\n",robot_A.name);
    printf("\n");
    union robot robot_B;
    robot_B.serial_num = 2;
    printf("robot_B's serial_num : %d\n",robot_B.serial_num);
    robot_B.name = 'B';
    printf("robot_B's name : %c\n",robot_B.name);
    printf("robot_B's serial_num : %d\n",robot_B.name);
    
    return 0;
}

공용체는 여러 멤버 변수가 같은 메모리를 사용하기에 하나의 멤버 변수만 초기화하여 씁니다. 

따라서 공용체를 선언과 동시에 초기화하려면 첫 번째 멤버를 초기화합니다. 

 

아래 결과를 보면 처음 초기화 했던 멤버 변수 이외에 다른 멤버 변수를 초기화하게 되면

처음 초기화 했던 멤버 변수에 영향을 끼쳐 데이터가 손상됩니다. 

 

ex) 1. robot_B의 serial_num 2로 초기화

2. robot_B의 name B로 초기화 (이때 serial_num data 손상)

3. robot_B의 serial_num 출력 시 손상된 data 출력되는 것을 확인할 수 있습니다.  

 

2. 열거형 enum

열거형 enum의 선언 방법은

enum + 열거형 이름 + {열거형 멤버들}

ex. enum e {a,b,c}

열거형의 멤버는 열거형 변수에 저장될 값들을 나열합니다.

#include<stdio.h>

enum robot {Ameca, Sophia, Alpago, DALL_E};

int main(){
    enum robot mr;
    
    mr = Ameca;

    switch(mr){
        case Ameca:
            printf("Hello Ameca\n");
            break;
        case Sophia:
            printf("Hello Sophia\n");
            break;
        case Alpago:
            printf("Hello Alpago\n");
            break;
        case DALL_E:
            printf("Hello DALL_E\n");
            break;
        default:
            printf("...");
            break;
    }
    
    return 0;
}

enum 변수에 enum 멤버 중 하나를 할당합니다. 

아래 결과 처럼 Ameca가 mr에 잘 할당되었음을 확인할 수 있었습니다.  

TIPS

1. 열거형 변수들은 초기화하지 않으면 0부터 순서대로 됩니다. 

ex. enum e {a,b,c}  이때 a = 0, b = 1, c = 2로 치환됩니다. 

2. 열거형 변수 중 초기화 된초기화된 멤버 뒤 멤버 변수는 초기화된 값+1으로 치환됩니다. 

ex. enum e{a = 2, b, c} 이때 a = 2, b = 3, c = 4로 치환됩니다. 

ex. enum e{a, b = 7, c} 이때 a = 0, b = 7, c = 8로 치환됩니다. 

 

3. typedef

struct 쓸 때 항상 struct를 붙여줘야 해서 불편하지 않으셨나요?

typedef를 이용해 새로운 자료형을 재정의하면 훨씬 편해집니다. 

typedef 이용 방법

typedef + struct + 구조체 이름 + 새 자료형 이름

ex. typedef struct robot ROBOT

#include <stdio.h>

struct robot{
    char *name;
    int num;
};
typedef struct robot ROBOT;

void print_struct(ROBOT *r){
    printf("robot name : %s\n",r->name);
    printf("robot num  : %d\n",r->num);
}


int main(){
    ROBOT r = {"Sophia", 12};
    print_struct(&r);

    return 0;
}

struct robot을 ROBOT으로 재정의하여 정상적으로 출력하는 것을 확인할 수 있습니다. 

오늘은 공용체, 열거형 typedef에 대해 정리해보았습니다. 

도움이 되셨길 바라며 다음 포스팅에서 만나요~

좋은 하루 보내세요~

Comments