열거형(enumerated type)
열거형을 사용하여 정수 상수를 나타내는 기호 이름을 선언할 수 있다.
enum 키워드를 사용하여 새로운 데이텋형을 만들고, 그 데이터형이 가질 수 있는 값들을 지정할 수 있다.
열거형은 프로그램의 가독성을 높이는데 사용한다. 신택스는 구조체와 비슷하다.
ex)
enum spectrum {red, orange, yellow, green, blue, violet};
enum spectrum color;
red ~ violet 처럼 여러된 상수들은 int형이지만 다른 정수형을 사용해도 상관없다.
red ~ violet은 각각 0~5까지의 값을 가진다.
열거된 리스트에 있는 상수들은 기본 설정으로 정수값 0,1,2,3 등으로 대입된다.
열거된 상수들을 사용자가 원하는 값으로 초기화 시킬 수 있다.
enum level {low = 100, medium = 500, high = 2000};
한 상수에만 값을 지정하고 그 다음 상수들에게 지정하지 않으면 그 다음 상수들에는 연속적으로 수가 매겨진다.
ex)
enum feline { cat, lynx = 10, puma, tiger};
일러한 선언에는 cat은 0, lynx = 10, puma = 11, tiger = 12로 초기화된다.
열거형의 목적은 프로그램의 가독성을 높이고 유지하기 쉽게 하는것이다.
typedef
typedef는 어떤 데이터형에 원하는 이름을 부여할 수 있는 데이터관련 고급 기능이다. #define과 비슷하지만, 세가지 차이점이 있다.
1.#define과 달리, typedef는 값이 아니라 데이터형에만 기호 이름을 부여할 수 있도록 제한된다.
2.typedef 해석은 전처리기가 아니라 컴파일러가 수행한다.
3.위 두개의 범위 내에서, typedef가 #define보다 융통성 있다.
typedef를 사용하여 BYTE를 char형 변수인 것 처럼 사용하기.
ex)
typedef char BYTE;
BYTE x,y[10], *z;
typedef 명령문이 어디에 있느냐에 따라 달라진다. typedef문이 함수 안에 들어 있으면, 범위가 지역적으로 그 함수에만 한정된다. 정의가 함수 바깥에 있으면, 범위는 전역적으로 모든 함수에 적용된다.
typedef char * STRING;
char형 포인터를 가리키는 포인터형을 STRING으로 사용할 수 있다. 즉 typedef를 통해 STRING은 char형을 가리키는 포인터를 의미하는 식별자가 된다.
이후 다음과 같은 선언이 가능하다.
STRING name, sign;
위 선언은 다음과 같다.
ex)
char *name, *sign;
typedef가 아닌 #define을 사용할 때
#define STRING char *
STRING name, sign;
위 선언은 char *name, sign;이 된다.
이경우에 name만 포인터가 된다.
typedef를 사용하는 한가지 이유는, 자주 쓰이는 데이터형을 위한 편리하고 쉽게 인식할 수 있는 이름을 만드는 것이다.
typedef를 사용하는 두번째 이유는 복잡한 데이터형을 typedef이름으로 간단하게 표현할 수 있기 때문이다.
ex)
typedef char (*FRPTC())[5];
FRPTC를 char형 5개짜리 배열을 가리키는 포인터를 리턴하는 함수의 데이터형으로 만든다.
복잡한 선언 //어렵다
int board[8][8] //int형 배열의 배열
int ** ptr; //int형을 가리키는 포인터를 가리키는 포인터
int *risks[10]; //int형을 가리키는 포인터 10개짜리 배열
int (*rusks)[10]; //int 10개짜리 배열을 가리키는 포인터
int * oof[3][4]; //int형을 가리키는 포인터들의 3x4 배열
int (*uuf)[3][4]; //int형 3x4배열을 가리키는 포인터
int (*uof[3])[4]; //int형 4개짜리 배열을 가리키는 포인터 3개짜리 배열
1.배열을 나타내는 [ ]과, 함수를 나타내는 ( )는 우선순위가 같다.
이들은 간접 연산자 *보다 우선순위가 높다.
2.[ ]과 ( )는 왼쪽에서 오른쪽으로 결합한다.
ex) int goods[12][50];
int형 50개짜리 배열을 12개 가지는 배열을 만든다.
3.[ ] 와 ( )는 우선순위가 같다.
ex) int (*rusks)[10];
위는 rusksㄹ를 int형 10개짜리 배열을 가리키는 포인터로 만든다.