티스토리 뷰

반응형

 

C언어 기초 Chapter 22~23: 구조체와 사용자 정의 자료형


Chapter 22. 구조체와 사용자 정의 자료형 1

22-1. 구조체란 무엇인가?

  • 여러 자료형을 하나로 묶어 새로운 자료형을 정의하는 것
  • 하나의 논리적 단위로 표현 가능
#include <stdio.h>

struct Student {
    char name[20];
    int age;
    double grade;
};

int main(void) {
    struct Student s1 = {"Kim", 20, 3.8};

    printf("이름: %s\n", s1.name);
    printf("나이: %d\n", s1.age);
    printf("학점: %.1f\n", s1.grade);

    return 0;
}

22-2. 구조체 배열 그리고 포인터

구조체 배열

struct Student students[3] = {
    {"Kim", 20, 3.8},
    {"Lee", 22, 4.1},
    {"Park", 21, 3.5}
};

구조체 포인터

struct Student *p = &students[0];
printf("첫 번째 학생 이름: %s\n", p->name);  // -> 연산자 사용

Chapter 23. 구조체와 사용자 정의 자료형 2

23-1. typedef 선언

  • 구조체 이름을 간단하게 만들 수 있음
typedef struct {
    char title[50];
    int price;
} Book;

Book b1 = {"C Programming", 25000};

23-2. 구조체 안의 구조체 (중첩 구조체)

typedef struct {
    int day, month, year;
} Date;

typedef struct {
    char name[20];
    Date birth;
} Person;

int main(void) {
    Person p = {"Kim", {5, 5, 1995}};
    printf("%s의 생일: %d/%d/%d\n", p.name, p.birth.year, p.birth.month, p.birth.day);
    return 0;
}

23-3. 공용체(Union Type)

  • 하나의 메모리 공간을 여러 멤버가 공유
  • 동시에 하나의 멤버만 사용 가능
#include <stdio.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main(void) {
    union Data data;
    data.i = 10;
    printf("정수: %d\n", data.i);

    data.f = 3.14;
    printf("실수: %.2f\n", data.f);

    return 0;
}

👉 주의: 마지막에 대입한 값만 유효


23-4. 열거형(Enumerated Type)

  • 상수들을 이름으로 표현
  • 가독성과 유지보수성 향상
enum Weekday { MON, TUE, WED, THU, FRI, SAT, SUN };

int main(void) {
    enum Weekday today = WED;
    if (today == WED) printf("오늘은 수요일!\n");
    return 0;
}

핵심 정리 ✅

  • 구조체(struct): 다양한 자료형을 묶어 새로운 자료형 정의
  • typedef: 구조체 이름을 간단하게 만들기
  • 중첩 구조체: 구조체 안에 다른 구조체 포함
  • 공용체(union): 하나의 메모리 공간을 공유, 마지막 값만 유효
  • 열거형(enum): 상수에 이름을 붙여 코드 가독성 향상

연습 문제 ✍️

  1. 학생(Student)의 이름, 나이, 점수를 저장하는 구조체 배열을 만들어 3명의 데이터를 입력 후 출력하세요.
  2. 구조체 안에 날짜(Date)를 포함하는 구조체 Person을 작성하고, 특정 인물의 생년월일을 출력하세요.
  3. 공용체를 이용해 같은 공간에 정수와 실수를 저장해보고, 값이 어떻게 덮어써지는지 확인하세요.
  4. 열거형으로 요일을 정의하고, today 변수를 이용해 오늘이 주말인지 평일인지 출력하세요.

 

 

👉 연습문제 정답▼

 

Chapter 22~23 연습문제 풀이


1) 학생(Student)의 이름, 나이, 점수를 저장하는 구조체 배열을 만들어 3명의 데이터를 입력 후 출력

#include <stdio.h>

struct Student {
    char name[20];
    int age;
    double score;
};

int main(void) {
    struct Student students[3];

    for (int i = 0; i < 3; i++) {
        printf("%d번째 학생 이름, 나이, 점수 입력: ", i+1);
        scanf("%s %d %lf", students[i].name, &students[i].age, &students[i].score);
    }

    printf("\n입력된 학생 정보:\n");
    for (int i = 0; i < 3; i++) {
        printf("이름: %s, 나이: %d, 점수: %.1f\n",
               students[i].name, students[i].age, students[i].score);
    }

    return 0;
}

2) 구조체 안에 날짜(Date)를 포함하는 구조체 Person을 작성하고, 특정 인물의 생년월일 출력

#include <stdio.h>

typedef struct {
    int year, month, day;
} Date;

typedef struct {
    char name[20];
    Date birth;
} Person;

int main(void) {
    Person p = {"Kim", {1995, 5, 5}};

    printf("이름: %s\n", p.name);
    printf("생일: %d년 %d월 %d일\n",
           p.birth.year, p.birth.month, p.birth.day);

    return 0;
}

3) 공용체를 이용해 같은 공간에 정수와 실수를 저장하고 값이 덮어써지는지 확인

#include <stdio.h>

union Data {
    int i;
    float f;
};

int main(void) {
    union Data d;

    d.i = 100;
    printf("정수 저장 후: d.i = %d\n", d.i);

    d.f = 3.14;
    printf("실수 저장 후: d.f = %.2f\n", d.f);
    printf("실수 저장 후 정수값 읽기: d.i = %d (의미 없는 값)\n", d.i);

    return 0;
}

👉 마지막에 저장한 d.f 값이 덮어써져서 d.i는 더 이상 의미가 없음.


4) 열거형으로 요일 정의 후 오늘이 주말인지 평일인지 출력

#include <stdio.h>

enum Weekday { MON, TUE, WED, THU, FRI, SAT, SUN };

int main(void) {
    enum Weekday today = SAT;

    if (today == SAT || today == SUN)
        printf("오늘은 주말입니다!\n");
    else
        printf("오늘은 평일입니다.\n");

    return 0;
}

핵심 정리 ✅

  • 구조체 배열 → 여러 명의 데이터 관리
  • 중첩 구조체 → 구조적 데이터 표현
  • 공용체 → 하나의 메모리를 공유, 마지막 값만 유효
  • 열거형 → 상수를 이름으로 표현해 가독성 ↑

 

반응형