typedef
type define의 줄임말로 새로운 type을 define 정의한다. 사용자 정의 타입이라고 불리며, 즉, 기본 자료형을 확장시키는 역할을 하며, 별명을 붙여주는 것으로 이해해도 좋다. 이런 typedef를 사용하면 복잡한 데이터 형식도 새로운 자료형으로 만들 수 있다. 사용법은 아래와 같다.
typedef 진짜자료형 별명
예) typedef int INT
typedef는 특히 struct 구조체에서 유용하게 사용되는데, 다음의 예시를 이해하면 도움이 될 것이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct point {
char a;
int b;
double c;
}
int main(void) {
struct point p = { 'A', 2, 4.5 };
printf("%c %d %lf\n", p.a, p.b, p.c);
typedef struct point POINT;
POINT q = {'a', 2, 4.5};
printf("%c %d "lf", q.a, q.b, q.c);
}
enum
변수가 가질 수 있는 값들을 미리 열거해놓은 자료형이다. enumerate. 즉, 열거하다의 줄임말인데, 요일은 저장하는 변수는 {일요일, 월요일, 화요일, .. , 토요일} 중 하나를 값으로 가지는 것이다. 이렇게 값이 될 수 있는 값들을 열거하여 이 것을 열거형으로 선언하면 된다.
다음 예시에서는 keyword가 enum이고, tag는 days이고, values는 sun, .. ,mon인 열거형을 선언한 것이다.
enum days {
sun, mon, tues, wed, thu, fri, sat
};
여기서 주의깊게 볼 점은 값들을 나열할 때, 문자형이라도 '', ""을 쓰지 않는다는 점이다.
그리고 열거형 days는 위치에 따라서 컴파일러에 의해 숫자 값이 설정된다. 따라서 다른 정의가 없다면 0부터 1씩 커지는 값을 배정받는다.
sun=0, mon=1, tues=2 ..
물론 다음과 같이 사용자가 변경할 수 도 있다.
sun=20, mon=30, tues=40 ..
이렇게 열거형을 선언하고, 정의하려면 다음과 같이 정의하면 된다.
enum days today;
물론 선언 후 열거형 변수에 값을 대입해 줄 있는데, 이때 조심할 점은 열거형 태그에 정의된 값들만을 가질 수 있다는 점이다.
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
enum days {
sun, mon, tues, wed, thu, fri, sat
};
int main(void) {
enum days today;
today = fri;
char* days_name[] = {"sun", "mon", "tues", "wed", "thu", "fri", "sat"};
printf("%s\n", days_name[today]);
}
위 코드의 실행 결과는 fri 문자열이 출력된다.
union
공용체 union은 같은 메모리 영역을 여러 개의 변수들이 공유하는 기능이다. 덕분에 메모리를 절약할 수 있다.
다음 예시에서는 keyword가 union이고, union tag가 example이고, union member가 c, i인 공용체를 정의한 것을 확인할 수 있다. 구조체와 생김새가 별다르게 없어서 헷갈릴 수 있는데, 구조체는 멤버 변수마다 각각의 메모리를 할당해주지만, 공용체는 멤버 변수 중 가장 메모리 할당량이 큰 변수 하나의 공간만 할당되어 그 메모리 공간을 서로 공유한다. 즉, 공용체 멤버 변수 c, i는 같은 메모리를 공유하며, 어떤 순간에는 이 둘 중 하나만 존재할 수도 있다. 이렇게 메모리공간을 공유하기 때문에 union은 멤버 변수를 한번에 하나씩만 사용할 수 있다.
이런 union을 사용하는 이유는 메모리가 부족할 때 많이 사용했지만, 요즘에서는 잘 사용되어지지 않는게 현실이다. 워낙 하드웨어 기술이 좋아서 우리가 충분히 사용하고도 남을 정도로 메모리를 제공해주기 때문이다.
union을 사용하려면 공용체 변수를 정의해야 사용할 수 있는데, 이때 union a의 크기는 멤버 중 메모리를 가장 많이 요구하는 멤버의 크기와 같다. 예컨데 example 멤버 i, c 중 i가 int형 4바이트이므로, a의 크기도 4바이트가 된다.
union example a;
이런 union 멤버에 접근할 때는 멤버 연사자인 . 을 사용하는데, 선택된 멤버에 따라 저장된 값을 다르게 해석하므로 사용시 유의해야 한다.
인용
https://olivia-blackcherry.tistory.com/457