티스토리 뷰

C, C++

[ C언어 ] 19. 구조체

RiKang 2018. 1. 5. 21:36
반응형

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.12.2};
    printf("%s\n",s2.name);
    printf("%f\n",s2.height);
    printf("%f\n",s2.weight);
    return 0;
}
cs

출력

ace

1.100000

2.200000


 선언과 동시에 초기화를 하는 것은 배열과 비슷한 형식으로 가능합니다. {첫 번째 멤버의 초기값, 두 번째 멤버의 초기값, ... } 입니다.

반응형

'C, C++' 카테고리의 다른 글

[ C언어 ] 18. 함수  (0) 2018.01.04
[ C언어 ] 17. 문자열 관련 함수  (0) 2018.01.03
[ C언어 ] 16. 포인터  (0) 2018.01.02
[ C언어 ] 15. 형 변환  (0) 2017.12.07
[ C언어 ] 14. 문자열  (0) 2017.12.04