본문 바로가기

Data Structure [C]/문돌이도 할 수 있는 [C언어 자료구조]

#14 [C 자료구조] 구조체: 다른 타입들의 배열

구조체는 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 개념을 생각하고 따라오면 될 것이다. 오늘은 여기까지!!