나의 IT일지
구조체 내 구조체 본문
구조체란 여러가지 자료형을 가진 변수의 집합을 가진 틀로, 자료형으로 구분되며, 구조체형을 정의하고, 구조체 변수를 정의해서 사용한다.
구조체형 정의 | 구조체변수 정의 |
struct 구조체명{ 자료형 변수명1; 자료형 변수명2; }; |
struct 구조체명 변수명; |
구조체 내 구조체
구조체변수는 변수이기에 구조체의 필드로 사용할 수 있다. 즉, 새로운 구조체에 다른 구조체를 넣어서 사용할 수 있다.
구조체 밖에서 구조체 정의 | 구조체 내에서 구조체 구현 |
struct 구조체1{ 자료형 변수명3; 자료형 변수명4; }; struct 구조체2{ 자료형 변수명1; 자료형 변수명2; struct 구조체1 구조체변수명 }; |
struct 구조체1{ 자료형 변수명1; 자료형 변수명2; struct 구조체2{ 자료형 변수명3; 자료형 변수명4; }구조체변수명; }; |
첫번째 구조는 두번째 구조체 밖에서 첫번째 구조체의 형태를 정의한 뒤, 첫번째 구조체형을 가진 변수를 두번째 구조체의 필드로 사용하는 방식으로, 첫번째 구조체를 다른 곳에서도 사용할 때 사용하는 방식이다.
#include<stdio.h>
struct drivingPermit {
char issuedAt[20]; //발급장수
long dateofissue; //발급년월일
long permitNo; //면허번호
};
struct person {
char name[20];
char birth[12];
long number;
struct drivingPermit driving;
};
int main() {
struct person per1;
per1.driving.dateofissue = 20190110;
per1.driving.permitNo = 1029312;
printf("%d, %d\n", per1.driving.dateofissue, per1.driving.permitNo);
return 0;
}
위의 코드는 첫번째 구조를 사용하여 구조체 내에 구조체를 넣은 코드로, "drivePermit" 구조체를 정의한 뒤에, "person" 구조체에 "drivePermit" 구조체형을 가진 변수를 만들고 "person" 구조체를 정의하는 것을 볼 수 있다.
두번째 구조는 구조체 내에서 구조체를 정의한 뒤, 구조체 변수를 만드는 방식으로, 구조체 내에서만 사용할 때 사용하는 방식이다.
#include<stdio.h>
struct person {
char name[20];
char birth[12];
long number;
struct drivingPermit {
char issuedAt[20]; //발급장수
long dateofissue; //발급년월일
long permitNo; //면허번호
}driving;
};
int main() {
struct person per1;
per1.driving.dateofissue = 20190110;
per1.driving.permitNo = 1029312;
printf("%d, %d\n", per1.driving.dateofissue, per1.driving.permitNo);
return 0;
}
위의 코드는 두번째 구조를 사용하여 구조체 내에 구조체를 넣은 코드로, "person" 구조체를 정의하는 도중에, "drivingPermit" 구조체를 정의하면서 변수를 생성하는 것을 볼 수 있다.
구조체 내 구조체 초기화
변수는 생성하면서 초기값을 저장하는 초기화가 가능하다. 그렇다면 구조체 내 구조체형을 가진 변수는 어떻게 초기화를 할까?
1번 방법 | 2번 방법 |
struct 구조체명 구조체변수명 = { .필드1=값1 .필드2=값2 {.필드3=값3 .필드4=값4...} }; |
struct 구조체 구조체변수명 = {값1,값2,{값3,값4}}; |
구조체형 변수를 포함하고 있는 구조체형 변수는 위와 같이 2가지 방법으로 초기화 할 수 있다. 필드와 값을 함께 적는 방법과 값만 적는 방법이 존재하는데, 두 방법의 공통점은 구조체형 변수의 필드는 중괄호로 구분하여 초기화한다는 점이다.
#include<stdio.h>
struct person {
char name[20];
char birth[12];
long number;
struct drivingPermit {
char issuedAt[20]; //발급장수
long dateofissue; //발급년월일
long permitNo; //면허번호
}driving;
};
int main() {
struct person per1 = {
.name = "김민호",
.birth= "19990120",
.number = 9271281,
{
.issuedAt="대한민국 서울",
.dateofissue=20190313,
.permitNo=192311
}
};
struct person per2 = { "박민우","19951202",9212371,
{"대한민국 부산",20190218,291310}
};
printf("per1.name=%s\n", per1.name);
printf("per2.name=%s\n", per2.name);
printf("per1.driving.issuedAt=%s\n", per1.driving.issuedAt);
printf("per2.driving.issuedAt=%s\n", per2.driving.issuedAt);
return 0;
}
위의 코드는 구조체 내에서 구조체를 정의한 방식을 사용하며, "per1"변수는 값과 필드명을 이용한 초기화방법을 "per2"변수는 값만을 이용한 초기화방법을 사용한다.
그리고 "per1"변수에서 중괄호 내부의 필드명을 보면 구조체 내에서 정의하는 구조체의 필드명과 같은것을 확인 할 수 있다. 이는 중괄호의 값은 구조체 내에서 정의하는 구조체형을 가진 변수의 초기값인 것을 알 수 있다.
번외) 자료형의 재정의 typedef
"typedef"함수는 자료형을 재정의하는 함수로 자료형의 이름을 재정의할 때 사용한다.
typedef 자료형 바꿀이름;
구조체 또한 자료형을 정의하여 사용하기에 "typedef"함수를 이용하여 이름을 변경 할 수 있다.
typedef struct 구조체명{ 자료형 변수명; 자료형 변수명; ...}구조체별명; |
#include<stdio.h>
typedef struct person {
char name[20];
char birth[12];
long number;
struct drivingPermit {
char issuedAt[20]; //발급장수
long dateofissue; //발급년월일
long permitNo; //면허번호
}driving;
}person; //구조체형의 재정의
int main() {
person per1 = {
.name = "김민호",
.birth = "19990120",
.number = 9271281,
{
.issuedAt = "대한민국 서울",
.dateofissue = 20190313,
.permitNo = 192311
}
};
person per2 = { "박민우","19951202",9212371,
{"대한민국 부산",20190218,291310}
};
printf("per1.name=%s\n", per1.name);
printf("per2.name=%s\n", per2.name);
printf("per1.driving.issuedAt=%s\n", per1.driving.issuedAt);
printf("per2.driving.issuedAt=%s\n", per2.driving.issuedAt);
return 0;
}