C언어 구조체 (Structure)
반응형

구조체는 프로그래머가 원하는 대로 여러 데이터 타입을 조합하여 만든 사용자 정의 데이터 타입입니다. 다시 말해 필요한 데이터들을 의미 있는 하나의 데이터로 통합하여 사용할 수 있게 합니다. 예를 들어 학생 정보를 관리하는 프로그램을 작성할 때 학생이라는 정보에는 여러 정보가 포함될 수 있습니다. 이름, 나이, 주소, 성별 등등.

또한 각각의 정보는 숫자가 될 수 있거나 문자가 될 수도 있습니다. 이렇게 학생 하나에 여러 정보가 동반되는데 만약 100명의 학생이 있다고 가정하면 이 모든 정보를 어떻게 저장, 관리해야 할까요? 배열을 사용할 수 있을까요? 배열은 같은 데이터타입만 저장할 수 있는 문제가 있습니다.

이런 경우 구조체를 사용하여 위와 같은 문제를 해결할 수 있습니다. 아래는 학생 정보를 구조체로 표현해 본 예제입니다.

structure 학생 {
    이름,
    나이,
    주소,
    성별
};

학생 honggildong;
학생 gunpilja;

printf("학생1 이름: %s\n", honggildong.이름);
printf("학생2 이름: %s\n", gunpilja.이름);

이렇듯 구조체는 아래의 그림처럼 하나의 데이터에 여러 의미있는 정보를 저장한다고 보시면 됩니다.

구조체 정의

struct 키워드를 사용하여 구조체를 정의합니다.

문법(syntax):

struct [structure_name]
{
    //member variable 1
    //member variable 2
    //member variable 3
    ...
}[structure_variables];

구조체 문법에서 볼 수 있듯이 struct 키워드로 시작하여 작성하고 구조체 이름(선택사항)을 같이 정의할 수 있습니다. 그리고 구조체 내부에 필요한 변수들을 정의합니다. 여기서 변수들은 C에서 지원하는 모든 데이터 타입이 가능합니다. (예: int, float, array 등등) 마지막으로 구조체의 변수를 같이 선언(선택사항)하고 세미콜론(;)으로 마무리합니다.

구조체 작성 예제

아래는 학생(Student) 구조체를 예제입니다. 구조체 이름은 선택 사항이지만 작성한 것을 추천합니다.

struct Student
{
    char name[25];
    int age;
    char address[200];
    char gender;
};

여기서 name, age, address, gender를 구조체의 멤버라고 부릅니다. 각 멤버는 C에서 지원하는 모든 데이터타입이 가능합니다.

구조체 변수 선언

구조체 변수 선언은 다음 두 가지 방법으로 선언할 수 있습니다. 구조체가 정의될 때 같이 선언하거나 구조체를 정의한 후에 선언할 수 있습니다.

1) 구조체를 정의한 후 변수 선언하는 방법

struct Student 
{ 
    char name[25]; 
    int age; 
    char branch[10]; 
    char gender; 
}; 
struct Student S1, S2;  //구조체 변수 선언 

2) 구조체를 정의할 때 같이 변수 선언하는 방법

struct Student
{
    char name[25];
    int age;
    char branch[10];
    char gender;
} S1, S2;

두 번째 방법은 코드의 가독성을 위해 추천되는 않습니다.

구조체 멤버 변수 사용 방법

구조체의 멤버에 값을 할당하거나 가져오기 위해서 멤버 접근 연산자인 . (마침표)를 사용합니다.  기본 구조는 (구조체 변수).(멤버) 형식입니다. 아래는 구조체 멤버의 값을 할당하거나 출력하는 예제입니다.

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

// Student 구조체 정의
struct Student
{
    char name[25];
    int age;
    char branch[10];
    char gender;
};

int main()
{
    // 구조체 변수 s1 선언
    struct Student s1;
    
    /*
        구조체 변수 s1의 멤버 age에 정수값 할당
    */
    s1.age = 18;

    /*
        구조체 변수 s1의 멤버 name에 문자열 할당
    */
    strcpy(s1.name, "Viraaj");
    /*
        구조체 변수 s1의 멤버 출력
    */
    printf("Name of Student 1: %s\n", s1.name);
    printf("Age of Student 1: %d\n", s1.age);
    
    return 0;
}

OUTPUT
Name of Student 1: Viraaj
Age of Student 1: 18


또한 scanf() 함수를 사용하여 구조체 멤버에 값을 저장할 수도 있습니다.

scanf(" %s ", s1.name);
scanf(" %d ", &s1.age);

구조체 초기화

다른 변수들과 마찬가지로 컴파일될 때 구조체 변수를 초기화할 수 있습니다. 아래 예제는 변수 선언과 함께 초기화하는 방법입니다.

struct Patient
{
    float height;
    int weight;  
    int age; 
};

struct Patient p1 = { 180.75 , 73, 23 };

또는, 구조체 변수를 선언한 후에 각 멤버별로 초기화할 수 있습니다.

struct Patient p1;
p1.height = 180.75;     
p1.weight = 73;
p1.age = 23;

구조체 배열

구조체 배열은 구조체 변수들의 집합으로 이루어진 배열입니다.  일반 배열의 선언과 비슷하지만,  배열의 데이터 타입을 작성한 구조체로 사용합니다.

예를 들어 크기가 10인 학생 구조체 배열을 사용하기 위해 아래와 같이 선언하고 각 배열 요소(element)에는 구조체 변수가 들어갑니다.

struct Student student[10];

아래는 Employee 구조체로 이루어진 배열을 사용하는 예제입니다.

#include<stdio.h>

struct Employee
{
    char ename[10];
    int sal;
};

// 구조체 배열 선언
struct Employee emp[5];
int i, j;

void ask()
{
    for(i = 0; i < 3; i++)
    {
        printf("\nEnter %dst Employee record:\n", i+1);
        printf("\nEmployee name:\t");
        scanf("%s", &emp[i].ename); 
        printf("\nEnter Salary:\t");
        scanf("%d", &emp[i].sal);
    }
    printf("\nDisplaying Employee record:\n");
    for(i = 0; i < 3; i++)
    {
        printf("\nEmployee name is %s", emp[i].ename);
        printf("\nSlary is %d", emp[i].sal);
    }
}

void main()
{
    ask();
}

배열 구조체 접근 방법

scanf("%s", &emp[i].ename); 
printf("\nSlary is %d", emp[i].sal);

사이즈가 5인 Employee 구조체 emp 배열은 아래 그림처럼 표현할 수 있습니다. 만약 1번째 인덱스의 ename에 접근하기 위해서는 emp[1].ename로 작성하면 됩니다.

중첩 구조체

구조체 내부에 다른 구조체를 중첩으로 사용한 형식입니다. Student 구조체의 멤버로 Address 구조체를 사용하면 아래와 같이 작성할 수 있습니다.

struct Student
{
    char name[30];
    int age;
    /* Address 구조체 그리고 addr 구조체 변수 동시에 선언 */
    struct Address
    {
        char locality[50];
        char city[50];
        int pincode;		
    }addr;
};

중첩 구조체 초기화 및 접근 방법

void main()
{
    
  struct Student hongildong = {"Hongildong", 20, {"Guro", "Seoul", 777111}};
  
  hongildong.addr.pincode = 123456;

  printf ("Address: %d\n", hongildong.addr.pincode);
  printf ("City: %s\n", hongildong.addr.city);
}

OUTPUT
Address: 123456                                                                      
City: Seoul 

중첩 구조체의 초기화는 물결무늬 괄호안에 또 다른 물결무늬 괄호를 사용하여 작성합니다. 예) {“Hongildong”, 20, {“Guro”, “Seoul”, 777111}}; 

또한 .(마침표)를 이중으로 사용하여 중첩 구조체의 멤버에 접근합니다. 예) hongildong.addr.city

구조체를 매개변수로 사용하기 일반 변수나 배열을 매개변수로 사용한 것과 같이 구조체도 함수의 매개변수로 사용 가능합니다. 다음은 Student 구조체를 매개변수로 받아 출력하는 함수 예제입니다.

#include<stdio.h>

struct Student
{
    char name[10];
    int roll;
};

void show(struct Student st);

void main()
{
    struct Student std;
    printf("\nEnter Student record:\n");
    printf("\nStudent name:\t");
    scanf("%s", std.name);
    printf("\nEnter Student rollno.:\t");
    scanf("%d", &std.roll);
    show(std);
}

void show(struct Student st)
{
    printf("\nstudent name is %s", st.name);
    printf("\nroll is %d", st.roll);
}
<< 다음 혼자 공부하는 C언어 이전 >>
반응형