[ C언어 ] 19. 구조체
Table of Contents
1. 개요
지금까지 저희는 변수와 배열을 사용하여 자료를 저장해 왔습니다. 하지만 C언어에서 지원하는 변수들의 종류는 많지 않기 때문에, 복잡한 자료를 저장하기엔 효율적이지 않습니다. 예를 들면, 고등학교 한 반에 있는 학생들의 이름, 키, 몸무게를 저장해야하는 상황이 있습니다. 이름은 문자열, 키와 몸무게는 실수형 변수로 저장한다고 해보면 아래와 같이 됩니다.
1 2 3 4 5 6 7 8 9 10 | //code by RiKang, weeklyps.com #include <stdio.h> char student_name[55][21]; // 이름 float student_height[55]; // 키 float student_weight[55]; // 몸무게 int main() { return 0; } | cs |
한 학생의 정보임에도 불구하고 따로따로 저장하게 되지요. 이러면 프로그래밍을 할 때 불편할 수 있습니다. 따라서 C언어는 구조체라는 문법을 지원하여, 이런 자료들을 체계적으로 관리할 수 있도록 해줍니다.
2. 구조체 정의
구조체 정의의 기본 형식은 struct 구조체의_이름 { 변수형 변수_이름 }; 입니다. 이를 통해 개요에 나왔던 학생 정보를 저장하기 위해 구조체를 정의해보면 아래와 같이 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 | //code by RiKang, weeklyps.com #include <stdio.h> struct student{ char name[21]; // 이름 float height; // 키 float weight; // 몸무게 }; int main() { return 0; } | cs |
이렇게 하면 구조체 student 는 문자열 name, 실수형 변수 height와 weight를 하나로 묶은, 커다란 자료형이 됩니다.
하지만 이렇게 정의된 상태만으로는 구조체를 사용할 수 없습니다. 구조체의 정의는 마치 'int는 4byte의 정수형 변수이다!' 라고 컴파일러에게 알려주는 역할 정도이기 때문입니다. 구조체를 사용하려면 'int a;'처럼 구조체의 선언이 필요합니다.
3. 구조체 선언
구조체 정의의 기본 형식은 struct 구조체의_이름 ; 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //code by RiKang, weeklyps.com #include <stdio.h> struct student{ char name[21]; // 이름 float height; // 키 float weight; // 몸무게 }s1; // 이렇게 하면 정의와 동시에 선언 int main() { struct student s2; // 구조체 기본 선언법 struct student s3[100]; // 구조체 배열을 선언 return 0; } | cs |
Line 11에 있는 내용이 기본 형식대로 구조체 선언한 것입니다. int a; 가 형식이 int인 자료 a를 메모리에 할당한 것이라면, struct student s2; 는 형식이 student인 자료 s2를 메모리에 할당한 것이라고 볼 수 있습니다.
Line 8처럼, 정의와 동시에 선언을 할 수 있는 방법도 있으며, Line 12처럼 배열도 적용 가능합니다.
4. 구조체 사용
구조체안에 있는 변수를 사용하기 위한 기본 형식은 구조체_이름.변수_이름 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //code by RiKang, weeklyps.com #include <stdio.h> #include <string.h> struct student{ char name[21]; // 이름 float height; // 키 float weight; // 몸무게 }s1; int main() { struct student s2; s2.height = 123.123; // 앞에 s2. 만 붙이면 기존에 변수를 쓰던 것과 동일한 방법으로 쓸 수 있습니다. printf("%f\n",s2.height); strcpy(s2.name,"ace"); printf("%s\n",s2.name); s2.name[0] = 'b'; printf("%s\n",s2.name); return 0; } | cs |
출력
123.123001
ace
bce
사용법은 간단합니다. 앞에 구조체_이름.만 붙이면 기존의 변수와 같은 방법으로 사용할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //code by RiKang, weeklyps.com #include <stdio.h> #include <string.h> struct student{ char name[21]; // 이름 float height; // 키 float weight; // 몸무게 }s1; int main() { struct student s2[101]; s2[0].height = 123.123; printf("%f\n",s2[0].height); return 0; } | cs |
구조체를 배열로 선언했을 경우엔 위의 예시처럼 사용할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //code by RiKang, weeklyps.com #include <stdio.h> #include <string.h> struct student{ char name[21]; // 이름 float height; // 키 float weight; // 몸무게 }s1; int main() { struct student s2={"ace", 1.1, 2.2}; printf("%s\n",s2.name); printf("%f\n",s2.height); printf("%f\n",s2.weight); return 0; } | cs |
출력
ace
1.100000
2.200000
선언과 동시에 초기화를 하는 것은 배열과 비슷한 형식으로 가능합니다. {첫 번째 멤버의 초기값, 두 번째 멤버의 초기값, ... } 입니다.