구조체
- 여러 개의 변수를 묶어 하나의 객체를 표현하고자 할 때 구조체를 사용할 수 있음(배열과는 성질이 다름)
- 캐릭터, 몬스터, 학생, 좌표 등 다양한 객체를 모두 프로그래밍 언어를 이용해 표현할 수 있음
구조체의 정의와 선언
struct 구조체명 {
자료형 1 변수명 1;
자료형 2 변수명 2;
...
};
* 한 명의 학생에 대한 정보를 담고 있는 구조체
#include <stdio.h>
struct Student {
char studentId[10];
char name[10];
int grade;
char major[100];
};
구조체의 변수의 선언과 접근
- 기본적으로 구조체의 변수에 접근할 때는 온점(.)을 사용함
int main(void){
struct Student s; // 구조체 변수 선언
strcpy(s.studentId, "20201208"); // 구조체 변수에 접근
strcpy(s.name, "khon");
s.grade = 4;
strcpy(s.major, "컴퓨터교육");
}
*학생 구조체를 만들어서 활용하기
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더
struct Student { // 학생 구조체 정의
char studentId[10];
char name[10];
int grade;
char major[100];
};
int main(void){
struct Student s; // 구조체 변수 선언
strcpy(s.studentId, "20201208"); // 구조체 변수에 접근
strcpy(s.name, "khon");
s.grade = 4;
strcpy(s.major, "컴퓨터교육");
printf("학번: %s\n", s.studentId); // 구조체 내용 출력
printf("이름: %s\n", s.name);
printf("학년: %d\n", s.grade);
printf("학과: %s\n", s.major);
system("pause");
return 0;
}
구조체의 정의와 선언
- 하나의 구조체 변수만 사용하는 경우 정의와 동시에 선언을 할 수도 있음
- 이 경우 변수는 전역 변수로 사용됨
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더
struct Student { // 학생 구조체 정의
char studentId[10];
char name[10];
int grade;
char major[100];
} s; // 전역 변수
int main(void){
strcpy(s.studentId, "20201208"); // 구조체 변수에 접근
strcpy(s.name, "khon");
s.grade = 4;
strcpy(s.major, "컴퓨터교육");
printf("학번: %s\n", s.studentId); // 구조체 내용 출력
printf("이름: %s\n", s.name);
printf("학년: %d\n", s.grade);
printf("학과: %s\n", s.major);
system("pause");
return 0;
}
구조체의 초기화
1.
- 구조체의 변수를 한 번에 초기화하기 위해서는 중괄호에 차례대로 변수의 값을 넣음
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더
struct Student { // 학생 구조체 정의
char studentId[10];
char name[10];
int grade;
char major[100];
} s; // 전역 변수
int main(void){
struct Student s = { "20201208", "khon", 4, "컴퓨터교육"};
printf("학번: %s\n", s.studentId); // 구조체 내용 출력
printf("이름: %s\n", s.name);
printf("학년: %d\n", s.grade);
printf("학과: %s\n", s.major);
system("pause");
return 0;
}
2.
- 위쪽에서 구조체를 정의하고 선언하면서 그와 동시에 초기화까지 할 수 있음
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더
struct Student { // 학생 구조체 정의
char studentId[10];
char name[10];
int grade;
char major[100];
} s = { "20201208", "khon", 4, "컴퓨터교육"};
int main(void){
printf("학번: %s\n", s.studentId); // 구조체 내용 출력
printf("이름: %s\n", s.name);
printf("학년: %d\n", s.grade);
printf("학과: %s\n", s.major);
system("pause");
return 0;
}
더 짧게 구조체 정의하기
1.
- typedef 키워드를 이용하면 임의의 자료형을 만들 수 있으므로 선언이 더 짧아짐
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더
typedef struct Student { // 학생 구조체 정의
char studentId[10];
char name[10];
int grade;
char major[100];
} Student;
int main(void){
Student s = {"20201208", "khon", 4, "컴퓨터교육"};
printf("학번: %s\n", s.studentId); // 구조체 내용 출력
printf("이름: %s\n", s.name);
printf("학년: %d\n", s.grade);
printf("학과: %s\n", s.major);
system("pause");
return 0;
}
2.
- 최근에는 익명 구조체의 개념이 등장하여 구조체 이름 부분을 비워놔도 됨
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더
typedef struct { // 학생 구조체 정의
char studentId[10];
char name[10];
int grade;
char major[100];
} Student;
int main(void){
Student s = {"20201208", "khon", 4, "컴퓨터교육"};
printf("학번: %s\n", s.studentId); // 구조체 내용 출력
printf("이름: %s\n", s.name);
printf("학년: %d\n", s.grade);
printf("학과: %s\n", s.major);
system("pause");
return 0;
}
구조체 포인터 변수에 접근하기
- 구조체가 포인터 변수로 사용되는 경우 내부 변수에 접근할 때 화살표(->) 를 사용함
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더
typedef struct { // 학생 구조체 정의
char studentId[10];
char name[10];
int grade;
char major[100];
} Student;
int main(void){
Student *s = malloc(sizeof(Student));
strcpy(s -> studentId, "20201208"); // 구조체 포인터 변수에 접근
strcpy(s -> name, "khon");
s -> grade = 4;
strcpy(s -> major, "컴퓨터교육");
printf("학번: %s\n", s -> studentId); // 구조체 내용 출력
printf("이름: %s\n", s -> name);
printf("학년: %d\n", s -> grade);
printf("학과: %s\n", s -> major);
system("pause");
return 0;
}
- 구조체는 현실 세계의 객체를 소스코드 상에서 매우 쉽게 표현할 수 있도록 해줌