C언어 - 공용체,열거형,typedef (union,enum,typedef)
안녕하세요 오늘은 공용체, 열거형 typedef에 대해 정리해보겠습니다.
3가지 모두 하나의 포스팅으로 하기에 양이 너무 적은 거 같아서 한꺼번에 모아서 알아보아요~
1. 공용체 union
저도 실무하면서 잘 못 보는 문법인데요.
임베디드 프로그래밍에서 가끔 쓰이는 경우가 있으니 알아두시면 좋을 것 같습니다.
공용체의 선언 방식은 struct와 같습니다.
아래 포스팅을 참고해주세요~
2022.09.23 - [C언어] - C언어 - 구조체 (struct)
#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에 대해 정리해보았습니다.
도움이 되셨길 바라며 다음 포스팅에서 만나요~
좋은 하루 보내세요~