구조체는 C와 몇몇 언어에만 있는 것으로 파이썬의 리스트 중 다른 타입들을 모아둔 것을 말한다.
즉 다시 말해
{이름, 최고 점수, 최저 점수, 평균} 이렇게 나타내 보자면
{char, int, int, double} 이러한 값을 가지게 되는 것이다.
여타 다른 언어에서는 그냥 나타나면 되지만 C에서는 이를 구조체라 부르고 한 번에 묶는다.
또한 구조체 선언 코딩은 다음과 같이 한다.
struct student {
char name[20];
int max_score, min_score;
float avg_score;
};
구조체 선언은 안에 들어가는 것들을 정의해주는 작업이다.
여기서 student는 '구조체 태그'
안에 char, int, float 들은 '구조체 멤버'라 부른다.
name [20]인 이유는 최대 20자까지 설정한다는 뜻이다.
구조체 변수 선언은 또 다른 말이다.
struct student abc;
이렇게 변수 abc가 student 구조체를 가진다고 선언해주는 것이다.
변수 abc안에 값을 집어넣을 때는
struct student abc = {'Kim min soo', 89, 56, 67.54};
이런 식으로 표현한다. 물론 student를 먼저 정의해주고 나서!!
구조체 참조
이러한 구조체를 나타내기 위해서는 일반적인 배열 포인터와 다른 방법을 써야 한다.
먼저 구조체 내의 변수를 변환하는 방법이다.
struct student abc;
strcpy(abc.name, "yoo min soo")
abc.max_num = 90
abc.avg_grade = 46.25
여기서 문자열을 수정할 때만 strcpy라는 함수를 써준다.
이외에 호출할 때는 그냥
abc.name
abc.max_num
abc.avg_grade
요런 식으로 써주면 된다.
*같은 student 구조체라 할지라도 구조체 간 비교는 불가능하다.
struct student abc, def
abc == def
이렇게 하면 컴파일 오류를 볼 수 있다.
대신
abc.name == def.name
와 같이 구조체 내 변수 비교에만 쓸 수 있다.
그렇다면 실제로 두 구조체의 연산 예시를 보자
구조체 연산 예시
두 점 사이 거리를 구해내는 함수를 써보자
#include <stdio.h>
#include <math.h>
struct point {
int x; int y;
}; //이렇듯 구조체 선언은 main함수 앞쪽에서 해준다
int main(void) {
struct point A;
struct point B;
double xdiff, ydiff, dist;
printf("점1의 좌표(x y): ");
scanf("%d %d", &A.x, &A.y); //구조체 내의 변수로 받아주는 모습
printf("점2의 좌표(x y): ");
scanf("%d %d", &B.x, &B.y);
xdiff = B.x - A.x;
ydiff = B.y - A.y;
dist = sqrt (xdiff * xdiff + ydiff * ydiff);
printf("두 점 사이의 거리 : %.2f\n", dist);
return 0;
}
쉽쥬?
구조체를 멤버로 가지는 구조체
배열 안에 배열이 있을 수 있듯(2차원 배열) 구조체 안에도 구조체가 있을 수 있다! 그럼 구조체 안에 구조체안에 구조체안에 구조체도...?
다음 예시는 student 학생 구조체 안에 scores 구조체를 넣은 모습이다.
struct scores {
int max_score
int min_score
struct student {
char name[20];
struct scores a;
float avg_score;
};
struct student s;
여기서 max_score을 알고 싶으면
s.a.max_score 을 입력해야 알 수 있다.
구조체 배열
한 학생의 이름과 성적을 알려주는 것이 구조체의 시작이었다.
그렇다면 우리는 전교 학생의 이름과 성적을 알아보는 작업도 필요할 것이다. 당근
따라서 구조체를 여러 개 모은 구조체 배열에 대해 알아보자.
연세대학교 3명의 이름과 성적 수치를 알려주는 구조체 배열 yonsei를 만들어보자.
struct student yonsei[3]
안에 데이터를 넣는 방법은 쉽다.
struct student { char name[20]; double grade; };
struct student yonsei[3] = { {"안두익", 4.1}, {"배지훈", 3.3}, {"유연호", 3.9} };
손쉽게 구조체 안에 여러 구조체가 들어간다는 것을 알 수 있다.
구조체는 여타 파이썬이나 C++에서는 잘 다뤄지지 않는 분야라 생소할 수도 있다. 파이썬의 class 개념을 생각하고 따라오면 될 것이다. 오늘은 여기까지!!
'Data Structure [C] > 문돌이도 할 수 있는 [C언어 자료구조]' 카테고리의 다른 글
#16 [C 자료구조] 열거형(enum)과 공용체(union) (0) | 2019.04.20 |
---|---|
#15 [C 자료구조] 포인터와 구조체 (0) | 2019.04.20 |
#13 [C 자료구조] 배열과 포인터의 혼종 (0) | 2019.04.19 |
#12 [C 자료구조] 2차원 배열: 행렬이 된 배열 (0) | 2019.04.19 |
#11 [C 자료구조] 이중 포인터: 나를 가르키는 너를 가르키는 타인 (0) | 2019.04.19 |