[열혈C프로그래밍] chapter 20. 구조체와 사용자 정의 자료형2
chapter 20
구조체와 사용자 정의 자료형2
typedef
- typedef 선언은 기존에 존재하는 자료형의 이름에 새이름을 부여하는 선언을 말한다.
## include <stdio.h>
typedef char* string; //자료형 char * 을 string으로 새이름을 부여하였다. 이로써 char* 와 string은 차이가 없다.
int main(void){
string str = "hello";
printf("%s \n", str);
return 0;
}
구조체의 정의와 typedef 선언
typedef struct point Point; // 자료형 struct point에 Point라는 이름을 부여.
or
typedef struct point
{
int xpos;
int ypos;
}Point; // 자료형 struct point에 Point라는 이름을 부여.
=> 이로써 struct point pos;라고 구조체 변수를 선언하지 않아도 되고, Point pos;라고 구조체 변수를 선언할수 있다.
구조체의 이름 생략
=>아래의 예시와 같이 생략할 수 있다.
typedef struct
{
char* name;
char* phoneNum;
int age;
}Person;
struct person man; // 불가능한 선언 (이름을 생략했으니깐)
Peson man; //가능한 선언.
함수로의 구조체 변수 전달과 반환
함수의 인자(Argument)로 구조체 변수가 전달될 수 있으며,
이러한 인자를 전달 받을수 있도록 구조체 변수가 매개변수(Parameter)의 선언으로 올수 있다.
그리고 구조체 변수를 보낼 때 call by value, call by reference 모두 할 수 있다.
그리고 구조체 변수는 반환형으로서 역할도 할 수 있다.
## include <stdio.h>
typedef struct{
int xpos;
int ypos;
}Point;
Point getPoint(Point pos){
printf("현재 좌표를 입력하세요.\n");
scanf("%d %d", &pos.xpos, &pos.ypos);
return pos;
}
void showPoint(Point pos){
printf("현재 좌표는 <%d,%d>입니다. \n", pos.xpos, pos.ypos);
}
int main(void){
Point pox;
pox = getPoint(pox);
showPoint(pox);
return 0;
}
중첩된 구조체
- 다른 type이 구조체의 멤버로 선언될 수 있듯이, 구조체도 구조체의 멤버가 될 수 있는데 이를 ‘구조체의 중첩’이라 한다.
## include <stdio.h>
typedef struct{
int xpos;
int ypos;
}Point;
typedef struct{
Point cen;
double rad;
}Circle;
int main(void){
Point current = {10,20};
Circle cir = { current , 4.5};
printf("현재 위치: %d %d \n", cir.cen.xpos, cir.cen.ypos);
printf("반지름: %f \n", cir.rad);
return 0;
}
Union type (공용체)
- 공용체는 구조체와 상당히 유사하다. ```c typedef struct sbox // 구조체 sbox의 정의 { int mem1; int mem2; double mem3; }
typedef struct ubox // 공용체 sbox의 정의 { int mem1; int mem2; double mem3; }
=> 다만, 메모리에서의 할당방식이 차이가 있다.<br>
구조체 변수는 구조체의 멤버들을 메모리에 각각 할당하지만, 반면 union 변수가 선언되면 <br>
공용체를 구성하는 멤버는 각각 할당하지 않고, 그 중 크기가 가장 큰 멤버의 변수만 할당되어 이를 공유한다.<br>
union의 멤버 중 가장 큰 멤버의 크기로 메모리가 할당되고 이를 모든 멤버가 공유한다.<br>
또, 멤버중 정수형 변수가 할당되면 실수형 변수의 값은 0.0이 되고,<br>
실수형 변수가 할당되면 정수형 변수의 값은 0이 된다. <br>
### Enumerated type (열거형)
* 열거형 변수는 저장이 가능한 값 자체를 정수의 형태로 결정하고, 이 값들을 열거하여 열거형(enumerated type)이라 한다.
```c
enum syllable
{
Do=1,Re=2,Mi=3,Fa=4,So=5,La=6,Ti=7
};
- 열거형의 유용함은 둘 이상의 연관이 있는 이름을 상수로 선언함으로써 프로그램의 가독성을 높이는데 있다.
ex) 연산자들을 enum으로 표현.
typedef enum priority{ plus='+', minus = '-' , multiple = '*' , divide ='/' }Priority;