C/Chapter10. 구조체

lullaby ·2025년 10월 1일

C언어

목록 보기
10/10
post-thumbnail

1. 구조체 기본 개념

  • 정의: 서로 다른 데이터형의 변수들을 하나로 묶어서 사용하는 기능
  • 목적: 사용자 정의형을 만드는 방법
  • 문법:
struct 태그명 {
    데이터형 멤버1;
    데이터형 멤버2;
    ...
};

2. 구조체 정의와 선언

struct content {
    char title[40];
    int price;
    double rate;
};
  • 구조체 정의는 함수 밖에서, 소스 파일 시작 부분에 정의
  • struct content가 새로운 데이터형이 됨
  • 구조체 변수 선언: struct content c1;

3. 구조체 초기화

// 방법 1: 선언과 동시에 초기화
struct content c1 = {"Avengers", 11000, 8.8};

// 방법 2: 부분 초기화 (나머지는 0으로 초기화)
struct content c2 = {"Movie", 5000};

// 방법 3: 구조체 변수 간 초기화
struct content c3 = c1;

4. 구조체 멤버 접근

  • 멤버 접근 연산자: . (점 연산자)
  • 간접 멤버 접근 연산자: > (화살표 연산자, 포인터용)
c1.price = 10000;        // 점 연산자
ptr->price = 10000;      // 화살표 연산자

5. 구조체 배열

struct content arr[] = {
    {"Movie1", 5000, 7.5},
    {"Movie2", 8000, 8.0},
    {"Movie3", 6000, 6.5}
};
  • 배열 원소 접근: arr[i].member

6. 구조체 포인터

struct content* ptr = &c1;
ptr->price = 9000;        // 포인터를 통한 멤버 접근
(*ptr).price = 9000;      // 동일한 표현
  • const 포인터: 읽기 전용 접근

7. 함수 매개변수로 구조체 전달

값에 의한 호출 (Call by Value)

void print_content(struct content c);
  • 구조체 전체를 복사하여 전달
  • 메모리 낭비, 시간 소모 가능

참조에 의한 호출 (Call by Reference) - 권장

void print_content(const struct content* ptr);  // 입력용
void modify_content(struct content* ptr);       // 수정용

8. 중첩 구조체

struct point {
    int x, y;
};
struct line {
    struct point start, end;
};
  • 멤버의 멤버 접근: ln.start.x

🎯 예상 문제 및 풀이

【문제 1】 구조체 정의 및 메모리 크기 (10점)

다음 구조체의 메모리 크기를 계산하고, 그 이유를 설명하시오.

struct student {
    char name[20];
    int age;
    double gpa;
};

풀이:

  • char name[20]: 20바이트
  • int age: 4바이트
  • double gpa: 8바이트
  • 총 32바이트 (20+4+8)
  • 단, 메모리 정렬에 따라 실제 크기는 더 클 수 있음

【문제 2】 구조체 초기화 및 사용 (15점)

다음 코드의 출력 결과를 예측하고, 오류가 있다면 수정하시오.

struct book {
    char title[30];
    int pages;
    double price;
};

int main() {
    struct book b1 = {"C Programming", 500};
    struct book b2;

    b2 = {"Data Structure", 400, 35.5};  // 오류!

    printf("%s %d %.1f\n", b1.title, b1.pages, b1.price);
    return 0;
}

풀이:

  • b1 초기화: price는 0.0으로 자동 초기화
  • b2 대입문 오류: 선언 후 {}로 직접 대입 불가
  • 수정: strcpy(b2.title, "Data Structure"); b2.pages = 400; b2.price = 35.5;
  • 출력: C Programming 500 0.0

【문제 3】 구조체 배열 검색 (20점)

학생 정보를 저장하는 구조체 배열에서 특정 학생을 찾는 함수를 작성하시오.

struct student {
    char name[20];
    int id;
    double gpa;
};

// 학번으로 학생을 찾는 함수 (반환: 인덱스, 없으면 -1)
int find_student(const struct student arr[], int size, int target_id);

풀이:

int find_student(const struct student arr[], int size, int target_id) {
    for (int i = 0; i < size; i++) {
        if (arr[i].id == target_id) {
            return i;  // 찾은 학생의 인덱스 반환
        }
    }
    return -1;  // 찾지 못함
}

【문제 4】 구조체 포인터 활용 (15점)

다음 코드의 출력 결과를 예측하시오.

struct point {
    int x, y;
};

int main() {
    struct point p1 = {10, 20};
    struct point* ptr = &p1;

    ptr->x += 5;
    (*ptr).y *= 2;

    printf("%d %d\n", p1.x, p1.y);
    printf("%d %d\n", ptr->x, ptr->y);
    return 0;
}

풀이:

  • ptr은 p1을 가리킴
  • ptr->x += 5: p1.x = 10 + 5 = 15
  • (ptr).y = 2: p1.y = 20 * 2 = 40
  • 출력: 15 40 (두 번 동일)

【문제 5】 함수 매개변수 전달 방식 (20점)

다음 두 함수의 차이점을 설명하고, 각각 언제 사용해야 하는지 서술하시오.

// 함수 A
void print_book1(struct book b);

// 함수 B
void print_book2(const struct book* b);

풀이:

  • 함수 A (값에 의한 호출):
    • 구조체 전체를 복사하여 전달
    • 원본 데이터 안전, 메모리/시간 비효율적
    • 작은 구조체에 적합
  • 함수 B (참조에 의한 호출):
    • 구조체 주소만 전달
    • 메모리/시간 효율적, const로 안전성 보장
    • 큰 구조체에 권장

【문제 6】 중첩 구조체 (15점)

다음 구조체에서 사각형의 넓이를 계산하는 함수를 작성하시오.

struct point {
    int x, y;
};

struct rectangle {
    struct point top_left;
    struct point bottom_right;
};

double calc_area(const struct rectangle* rect);

풀이:

double calc_area(const struct rectangle* rect) {
    int width = rect->bottom_right.x - rect->top_left.x;
    int height = rect->top_left.y - rect->bottom_right.y;
    return (double)(width * height);
}

【문제 7】 열거체 활용 (10점)

요일을 나타내는 열거체를 정의하고, 주말인지 평일인지 판단하는 함수를 작성하시오.

풀이:

enum weekday {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
};

int is_weekend(enum weekday day) {
    return (day == SATURDAY || day == SUNDAY);
}

💡 실전 대비 팁

자주 하는 실수들

  1. 구조체 사용 시 struct 키워드 누락

    content c1;  // 오류!
    struct content c1;  // 올바름
    
  2. 선언 후 {} 직접 대입

    struct book b;
    b = {"Title", 300};  // 오류!
    
  3. 구조체 변수 직접 비교

    if (b1 == b2)  // 오류!
    // 멤버별로 비교해야 함
    
  4. 배열 멤버 직접 대입

    b1.title = b2.title;  // 오류!
    strcpy(b1.title, b2.title);  // 올바름
    

0개의 댓글