C - 구조체

2022. 3. 9. 23:53C

구조체란?

다른 자료형들을 하나로 묶어 사용할 수 있게 해주는 것! 변수를 모아둔 박스라고 생각하면 편하다

개인적으로 자바의 객체와 비슷한 것 같다.

struct Person {
    char name[10];
    char id[20];
    int age;
    
};
int main() {
    struct Person person[10];
}

이렇게 

struct 구조체이름 {

         자료형 멤버변수이름1;

         자료형 멤버변수이름2;

         ...

};

이 형식으로 사용하며 중괄호 안에 선언한 변수들을 멤버라고 칭한다.

구조체이름 뒤에 변수까지 사용 해주며 변수명.멤버 형식으로 사용 가능하다

struct Person {
    char name[10];
    char id[20];
    int age;

};
int main() {
    struct Person person;
    printf("이름 : ");
    scanf("%s", person.name);
    printf("ID : ");
    scanf("%s", person.id);
    printf("나이 : ");
    scanf("%d", &person.age);
    printf("%s씨는 %d살이며 학번은 %s 입니다", person.name, person.age, person.id);
    return 0;
}

출력 결과

이름 : inho
ID : 0001025
나이 : 23
inho씨는 23살이며 학번은 0001025 입니다

또 struct가 아닌 좀 더 간단한 방법이 있는데 typedef struct를 사용할 수 있다.

typedef struct 구조체이름 {

        자료형 멤버변수이름1;

        자료형 멤버변수이름2;

} 구조체 별칭;

형식으로 사용하는데 

구조체 변수를 선언할 때 매번 struct를 쓰지 않기 위해 typedef로 별칭을 꼭 지정해줘야한다.

*구조체 이름과 구조체별칭은 같아도 되지만 보통 구조체이름은 "_구조체별칭"으로 사용한다고 한다.

 

구조체 변수는 

구조체별칭 변수이름 = {변수값1, 변수값2, ....);

로 선언할 수 있다.

아까 예제를 typedef를 이용해 다시 작성해보면

typedef struct _Person {
    char name[10];
    char id[20];
    int age;
} Person;

int main() {
    Person person;
    printf("이름 : ");
    scanf("%s", person.name);
    printf("ID : ");
    scanf("%s", person.id);
    printf("나이 : ");
    scanf("%d", &person.age);
    printf("%s씨는 %d살이며 학번은 %s 입니다", person.name, person.age, person.id);
    return 0;
}

출력 결과

이름 : inho
ID : 002013
나이 : 23
inho씨는 23살이며 학번은 002013 입니다

똑같은 결과가 출력 되는 것을 확인할 수 있다.

 

구조체 변수의 멤버에 값을 대입하고, 출력하는 프로그램이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
    struct college {
        char name[10];
        int age;
        char address[20];
        float height;

    } student1, student2;

    strcpy(student1.name, "Kim");
    student1.age = 22;
    strcpy(student1.address,"Seoul");
    student1.height = 173.5;

    strcpy(student2.name,"Choi");
    student2.age = 23;
    strcpy(student2.address,"Anyang");
    student2.height = 176.7;

    printf("student1 : %s %d ", student1.name, student1.age);
    printf("%s %.1f \n", student1.address, student1.height);
    printf("student2 : %s %d ", student2.name, student2.age);
    printf("%s %.1f \n", student2.address, student2.height);
}



출력 결과

student1 : Kim 22 Seoul 173.5 
student2 : Choi 23 Anyang 176.7

역시 자바의 객체와 비슷한것 같다.

구조체를 통해서 복잡하게 여러개의 변수를 선언할 필요 없이 간단히 표현할 수 있다는건 참 좋은것 같다.

 

구조체 변수의 초기화를 통해 얻은 3명의 수학, 영어 성적의 합과 평균을 구하는 프로그램

typedef를 이용했다.

int main() {
    typedef struct _grade{
        int math;
        int eng;
    } grade;
    grade s1 = {89, 93}, s2 = {75, 88}, s3 = {82,92};
    int sum;
    float aver;

    sum = s1.math + s2.math + s3.math;
    aver = sum / 3.0;
    printf("수학 : 합 = %d 평균 = %.2f \n", sum, aver);

    sum = s1.eng + s2.eng + s3.eng;
    aver = sum / 3.0;
    printf("영어 : 합 = %d 평균 = %.2f \n", sum, aver);
}

출력 결과

수학 : 합 = 246 평균 = 82.00 
영어 : 합 = 273 평균 = 91.00

 

구조체 변수를 이용하여 구조체 멤버 전체를 복사하여 출력하는 프로그램

int main() {
    typedef struct _person{
        char name[10];
        int num;
        int age;
    }person;

    person choi = {"choi", 7, 22};
    person kim;

    kim = choi;

    printf("kim.name --- %s \nkim.num --- %d \nkim.age --- %d", kim.name, kim.num, kim.age);
}

출력 결과

kim.name --- choi 
kim.num --- 7 
kim.age --- 22

구조체를 이용한 복사가 가능하다는 결과를 확인할 수 있다.

 

 

'C' 카테고리의 다른 글

C - 문자 입출력 라이브러리  (0) 2022.03.10
C - 문자와 문자열  (0) 2022.03.10
C - 이중 포인터  (0) 2022.03.09
C - 자동변수와 정적변수  (0) 2022.03.08
C - 재귀함수  (0) 2022.03.07