본 포스트는 C언어를 중심으로 작성되었음을 알려드립니다.
구조체(struct)이 C에서는?
1. 구조체
java나 c#을 먼저 접해 보신 분이라면 구조체에 대해서 어느정도 알고 계실 거라 생각합니다. 하지만 그 시작점인 c에서의 구조체를 알아야겠죠?
구조체 또한 앞서 포스팅한 배열처럼 여러 데이터를 그룹으로 묶어 자료형으로 정의 사용하는 자료형 중 하나 입니다.
하지만, 차이점은 배열은 자료형이 같아야만 묶을 수 있는 반면 구조체는 어떤 자료형이든 그룹으로 묶어 유용하게 사용가능하다는 장점이 있습니다.
자료를 체계적으로 관리할 때 단위형식으로 구성되는데, 이를 레코드라 하고 레코드를 구성하는 하위 항목을 필드라 합니다. 또한 이러한 레코드가 모여 파일을 형성합니다. 이해하기 조금 복잡하시죠?^^;
위의 테이블을 파일이라고 가정합니다.
파란색 셀을 필드(field)라고 합니다. 핑크색 셀을 레코드(record)라고 합니다.
간단하죠?
2. 구조체 선언
그렇다면 이 구조체는 어떻게 선언될지 한번 살펴보겠습니다!
구조체는 위에서 언급했듯이 여러 복잡한 자료형들을 하나의 그룹으로 묶어 하나의 자료형 처럼 사용하는 것이라고 했습니다. 구조체는 구조체변수의 이름, 각각 변수에 속하는 자료형으로 구성됩니다.
코드상에서는 어떻게 선언될까요?
1
2
3
4
5
6
7
8
9
10
11
12
|
##include <stdio.h>
struct 구조체변수 이름{
자료형 데이터 항목이름(변수이름);
자료형 데이터 항목이름(변수이름);
자료형 데이터 항목이름(변수이름);
}
|
cs |
위와 같은 방식으로 구조체 변수를 선언하여 사용해주시면 됩니다! 이해하기 쉽게 한글로 적었습니다.
3. 구조체 변수 선언 및 초기화
구조체 변수의 선언 방식은 2-1 코드를 참조하여 만들어볼때,
struct 구조체이름 구조체 변수이름; <--- 형식
으로 사용할 수 있습니다.
예를 들어, 학생들을 관리하는 코드를 작성한다고 가정했을 때,
구조체 사용을 위해서,
struct student {
char name[10];
int age;
int grade;
int point;
};
선언 후 main 함수 내에서 struct student kim, jin, hong; 이라고 선언을 하면 사용이 가능합니다.
후 각 kim, jin, hong에 따른 구조체가 생성되며 메모리가 할당됩니다.
변수의 선언 방법에는
구조체형을 선언한 후 변수 선언
struct student {
char name[10];
int age;
int grade;
int point;
};
struct student kim;
구조체형과 변수를 연결하여 선언
struct student {
char name[10];
int age;
int grade;
int point;
} kim;
구조체형 변수이름 생략후 구조체 변수 선언
struct {
char name[10];
int age;
int grade;
int point;
} kim;
초기화 과정은 초깃값만 전달해주면 되겠죠? 하지만 각 구조체형 내 선언된 자료형 만큼 선언해주셔야 사용가능하며 각 값에 대응됩니다.
예를 들어,
sturct student kim = {"gildong", "17", "4", "92"}; 이런 방식으로 말입니다.
구조체 연산자 참조!!
사실 위 부분까지 이해하면 어느정도 구조체변수에 대해 이해를 한것이지만, 유용하게 사용하기 위해선 연산자를 알아야할 것 같아 추가 포스팅하겠습니다! 그냥 난 개념만 알아도 상관없다 하시는 분은 안보셔도 괜찮습니다.
실제 코드를 활용하여 설명하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include <stdio.h>
#include <string.h>
sturct student {
char name[20];
int age;
int grade;
int point;
};
int main(){
int a;
struct student hatnim[4] = {//구조체형에서 구조체 변수를 main내에서 선언하여 재사용 합니다. 이때 구조체 배열의 크기는 4개를 담습니다.
{"김길동" , 18, 1,92},
{"김진동" , 18, 2,91},
{"김동동" , 18, 3,90},
{"김상동" , 18, 4,89}//각 이름,나이,석차,성적에 값을 대입합니다.
};
for (i =0; i<4; i++){//구조체 배열의 크기만큼 반복을 하며 넣었던 값을 출력합니다.
printf("\n이름 : %s", hatnim[i].name);// .(점)연산자를 활용하여 데이터 항목을 참조합니다.
printf("\n나이 : %s", hatnim[i].age);
printf("\n석차 : %s", hatnim[i].grade);
printf("\n성적 : %s", hatnim[i].point);
}
return 0;
}
|
cs |
점 연산자를 사용한 구조체 변수 참조접근 방식입니다!
다음으로 화살표 연산자입니다.
포인터는 모든 자료형에 사용할 수 있으므로 구조체형에서도 물론 사용할 수 있습니다. 포인터가 가리키는 구조체 변수의 데이터 항목을 화살표 연산자를 사용하여 지정합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#include <stdio.h>
#include <string.h>
sturct student {
char name[20];
int age;
int grade;
int point;
};
int main(){
sturct student kim;
sturct student *jin = &kim;//포인터변수로 선언된 jin은 kim의 메모리주소를 저장합니다.
strcpy(jin->name,"gildong");
jin->age = 18;// 점연산자(참조)를 사용한 방법은 (*jin).name = "gildong"; 으로 사용하면됩니다.
jin->grade = 1;
jin ->point = 92;
printf("\n 이름 : %s", jin->name);
printf("\n 나이 : %s", jin->age);
printf("\n 석차 : %s", jin->grade);
printf("\n 성적 : %s", jin->point);
return 0;
}
|
cs |
이로써 설명드리고 저 또한 많은 보충이 되었습니다.ㅎㅎ
이해가 안가거나 하는 부분은 댓글주시고, 피드백 환영합니다!
읽어주셔서 감사합니다~
'C' 카테고리의 다른 글
연결리스트(순차/연결자료구조)어떻게 이해하죠?[1] (0) | 2020.02.17 |
---|---|
재귀함수는 언제, 어떻게 사용하죠?(on c) (0) | 2020.02.14 |
배열과 포인터(array , pointer) 천천히~ (0) | 2020.02.14 |
알고리즘은 삶아먹는건가요?(on c) (0) | 2020.02.14 |
자료구조 먹는건가요? (on c) (0) | 2020.02.14 |
댓글