๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Programming/C language

14 Structure (๊ตฌ์กฐ์ฒด)

by Dowon Kang 2024. 1. 25.

๊ตฌ์กฐ์ฒด(Structure)๋Š” C ์–ธ์–ด์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. 

๊ตฌ์กฐ์ฒด๋Š” ์„ฑ์งˆ์ด ๋น„์Šทํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ตฌ์กฐํ™”ํ•œ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์ด์ž ์ƒ์ž

๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ณ€์ˆ˜๋“ค์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ์ƒˆ๋กœ์šด ์ž๋ฃŒํ˜•์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๋‹ค๋ฃจ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 

๋”๋ณด๊ธฐ

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

// ํ•™์ƒ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด ์ •์˜
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    // ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”
    struct Student student1;
    strcpy(student1.name, "John Doe");
    student1.age = 20;
    student1.gpa = 3.5;

    // ๋˜ ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”
    struct Student student2;
    strcpy(student2.name, "Jane Smith");
    student2.age = 22;
    student2.gpa = 3.9;

    // ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ•™์ƒ ์ •๋ณด ๊ด€๋ฆฌ
    struct Student students[2] = {student1, student2};

    // ํ•™์ƒ ์ •๋ณด ์ถœ๋ ฅ
    for (int i = 0; i < 2; ++i) {
        printf("ํ•™์ƒ %d\n", i + 1);
        printf("์ด๋ฆ„: %s\n", students[i].name);
        printf("๋‚˜์ด: %d\n", students[i].age);
        printf("ํ‰๊ท  ์„ฑ์ : %.2f\n", students[i].gpa);
        printf("\n");
    }

    return 0;
}

 

์ด์ œ student1๊ณผ student2๋ฅผ ๋ฐฐ์—ด์— ๋„ฃ์–ด์„œ ์—ฌ๋Ÿฌ ํ•™์ƒ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํ•™์ƒ์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

Java์˜ ํด๋ž˜์Šค(class) vs  C์–ธ์–ด์˜ ๊ตฌ์กฐ์ฒด(structure)

Java์˜ ํด๋ž˜์Šค(class)์™€ C ์–ธ์–ด์˜ ๊ตฌ์กฐ์ฒด(structure)๋Š” ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ด์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

Java์˜ ํด๋ž˜์Šค (Class)

  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP): Java๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋ฉฐ, ํด๋ž˜์Šค๋Š” ์ด ๊ฐœ๋…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ(๋ฉค๋ฒ„ ๋ณ€์ˆ˜)์™€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฉ”์„œ๋“œ(๋ฉค๋ฒ„ ํ•จ์ˆ˜)๋ฅผ ํ•จ๊ป˜ ๋ฌถ์–ด๋†“์€ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
  • ์ƒ์†, ๋‹คํ˜•์„ฑ, ์บก์Šํ™”: Java ํด๋ž˜์Šค๋Š” ์ƒ์†, ๋‹คํ˜•์„ฑ, ์บก์Šํ™” ๋“ฑ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์ง•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ , ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • ํž™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น: ๊ฐ์ฒด๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋ฉฐ, ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ์ž์™€ ์†Œ๋ฉธ์ž: ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž(constructor)์™€ ์†Œ๋ฉธ์ž(destructor)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋ฉฐ, ์†Œ๋ฉธ์ž๋Š” ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค: Java์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค(interface)์™€ ์ถ”์ƒ ํด๋ž˜์Šค(abstract class)๋ฅผ ํ†ตํ•ด ์ถ”์ƒํ™”๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

C ์–ธ์–ด์˜ ๊ตฌ์กฐ์ฒด (Structure)

  • ์ ˆ์ฐจ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: C ์–ธ์–ด๋Š” ์ฃผ๋กœ ์ ˆ์ฐจ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋ฉฐ, ๊ตฌ์กฐ์ฒด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ์–ด ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํฌ์ธํ„ฐ ํ™œ์šฉ: ๊ตฌ์กฐ์ฒด๋Š” ์ฃผ๋กœ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ๊ตฌ์กฐ์ฒด์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น: ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜๋Š” ์ฃผ๋กœ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋˜๋ฉฐ, ๊ฐ’์— ์ง์ ‘ ์ ‘๊ทผ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ์ž์™€ ์†Œ๋ฉธ์ž ๋ถ€์žฌ: C ์–ธ์–ด์—๋Š” ๋ช…์‹œ์ ์ธ ์ƒ์„ฑ์ž์™€ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ดˆ๊ธฐํ™”์™€ ํ•ด์ œ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

Keyword typedef

typedef๋Š” C ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์›Œ๋“œ๋กœ, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ๋ณ„์นญ(alias)์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. typedef๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ฑฐ๋‚˜, ์ฝ”๋“œ์˜ ์ด์‹์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

ํฌ์ธํ„ฐ ๊ตฌ์กฐ์ฒด์˜ ์ ‘๊ทผ 

ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ๋•Œ๋Š” -> ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -> ์—ฐ์‚ฐ์ž๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ตฌ์กฐ์ฒด์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ -> ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ

#include <stdio.h>

// ํ•™์ƒ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด ์ •์˜
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    // ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ ์„ ์–ธ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
    struct Student* studentPtr = malloc(sizeof(struct Student));

    // ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„์— ๊ฐ’ ํ• ๋‹น
    strcpy(studentPtr->name, "John Doe");
    studentPtr->age = 20;
    studentPtr->gpa = 3.5;

    // ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„์˜ ๊ฐ’ ์ถœ๋ ฅ
    printf("์ด๋ฆ„: %s\n", studentPtr->name);
    printf("๋‚˜์ด: %d\n", studentPtr->age);
    printf("ํ‰๊ท  ์„ฑ์ : %.2f\n", studentPtr->gpa);

    // ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ
    free(studentPtr);

    return 0;
}

 

์œ„ ์˜ˆ์ œ์—์„œ -> ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ studentPtr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ตฌ์กฐ์ฒด์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ -> ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ตฌ์กฐ์ฒด์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๊ตฌ์กฐ์ฒด ์•ˆ์— ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด

๊ตฌ์กฐ์ฒด ์•ˆ์— ๋‹ค๋ฅธ ๊ตฌ์กฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ "์ค‘์ฒฉ ๊ตฌ์กฐ์ฒด" ๋˜๋Š” "๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์˜ ๊ตฌ์กฐ์ฒด"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์ธต์ ์œผ๋กœ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ

#include <stdio.h>

// ์ฃผ์†Œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด
struct Address {
    char street[50];
    char city[30];
    int zipCode;
};

// ํ•™์ƒ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด
struct Student {
    char name[50];
    int age;
    float gpa;
    struct Address address; // ์ค‘์ฒฉ๋œ Address ๊ตฌ์กฐ์ฒด
};

int main() {
    // ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ์ฒด ์‚ฌ์šฉ ์˜ˆ์ œ
    struct Student student1;

    // ์ฃผ์†Œ ์ •๋ณด ์ž…๋ ฅ
    strcpy(student1.address.street, "123 Main Street");
    strcpy(student1.address.city, "Cityville");
    student1.address.zipCode = 12345;

    // ํ•™์ƒ ์ •๋ณด ์ž…๋ ฅ
    strcpy(student1.name, "John Doe");
    student1.age = 20;
    student1.gpa = 3.5;

    // ์ •๋ณด ์ถœ๋ ฅ
    printf("์ด๋ฆ„: %s\n", student1.name);
    printf("๋‚˜์ด: %d\n", student1.age);
    printf("ํ‰๊ท  ์„ฑ์ : %.2f\n", student1.gpa);
    printf("์ฃผ์†Œ: %s, %s, %d\n", student1.address.street, student1.address.city, student1.address.zipCode);

    return 0;
}

 

์œ„ ์˜ˆ์ œ์—์„œ struct Student ์•ˆ์— struct Address๊ฐ€ ์ค‘์ฒฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์กฐ์งํ™”ํ•˜๊ณ , ๊ด€๋ จ ์žˆ๋Š” ์ •๋ณด๋“ค์„ ๋” ํšจ๊ณผ์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

'Programming > C language' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

15 File input & output  (1) 2024.01.25
13 Array  (0) 2024.01.24
12 Pointer  (1) 2024.01.24
11 function (ํ•จ์ˆ˜)  (0) 2024.01.23
10 string (feat. random ํ•จ์ˆ˜)  (0) 2024.01.23

๋Œ“๊ธ€