4월 17, 2024

C 언어 구조체 쉽게 이해하기, struct 올바른 사용법

1. C 언어 구조체란

C 언어에서 구조체란 영어로 struct, 즉 정형화된 structure (구조) 라고 생각하면 편하다. 

정해진 멤버들이 있고, 해당 멤버가 포함된 한마디로 해당 멤버들이 묶인 그룹이라고 생각하면 된다. 

 

가령 모든 사람에게는 공통적으로 '이름' 과 '나이' 라는 속성이 있다. 

그러면 우리는 '이름'과 '나이'라는 멤버를 가지는 '사람'이라는 구조체를 가지고 있는 것이다. 구조체는 이처럼 동일한 구조를 가진 객체라고 생각하면 된다. 하지만 자바의 객체와는 다른 점이 있으니 동일 규격으로 구성된 하나의 구조라고 생각하는 것이 더 정확할 것 같다. 


2. struct 키워드 

구조체를 사용할 때는 "struct" 라는 키워드를 사용한다.

 

struct 구조체이름{
 자료형 멤버이름1;
 자료형 멤버이름2;
 자료형 멤버이름3;
};

구조체의 기본적인 골격은 위와 같다. 구조체 { } 안에 원하는 멤버들을 자료형, 이름 순서대로 기입해주면 된다.

들어갈 수 있는 멤버의 수에는 제한이 없지만 멤버들이 많아질 수록 구조체도 방대해지는 것이라고 생각하면 된다.

 

위에서 말한 "사람"으로 구조체를 만들어보도록 하겠다. 사람 구조체의 멤버에는 나이와 이름이 있을 수 있고, 다른 attribute들이 추가적으로 있을 수 있으나, 공통적으로 존재하는 attribute여야 구조체의 활용도가 높아지므로 일단 나이와 이름이라는 멤버에만 국한하여 구조체를 만들어보겠다.

 

struct Person {   // 구조체 Person
   int age;              // 구조체 멤버 1: 나이
   char name[20];        // 구조체 멤버 2: 이름
};

이런식으로 구조체를 구성해보았다. 구조체를 선언한 뒤에는 반드시 세미콜론을 붙여주어야 한다는 점을 잊지 말자.

 

나이는 int형으로, 이름은 char[] 형으로 구성하여 멤버 두 개로 구성된 구조체 Person이 만들어졌다.

 

하지만 이렇게 선언만 했다는 것은 Person이라는 모형 (틀) 이 생겼다는 것이고 실제 사람 실체를 만들기 위해서는 구조체를 사용해 만들어주고 멤버들의 내용을 채워주어야 한다. 위에서 볼 수 있듯이 struct의 경우에는 대체로 main () 함수 밖에 정의하며, main 함수에서 변수를 선언하여 사용하는 형식이다. 

 

C언어 main 함수에서 객체를 생성해주고 멤버 정보를 채워보자.

int main()
{
    struct Person person1;     // 구조체에 해당되는 변수 선언
    
    person1.age = 50; //나이 할당
    // 이름에 해당하는 값 strcpy() function 통해 할당
    strcpy(person1.name, "김철수");

    
    //구조체에 정보가 잘 들어갔는지 프린트를 통해 확인
    printf("나이: %d\n", person1.age);        // 나이: 50
    printf("이름: %s\n", person1.name);       // 이름: 김철수
    return 0;
}

멤버 정보를 할당 할때 우리는 선언해준 구조체 변수에 . 을 붙이고 그 안에 member 이름을 붙여 접근을 하게 된다. 

즉 사람의 이름에 접근할때는 person1.name, 나이 값을 알고 싶다면 person1.age로 해서 접근을 하는 것이다. 

 

int 형의 자료형 같은 경우에는 

person1.age = 50

 이런 식으로 선언을 해줄 수 있지만,

 

char [] 형의 경우에는 할당 연산자를 사용할 수 없기 때문에 strcpy() 를 사용한 것이다. 

strcpy(person1.name, "김철수");

이런식으로 적어주면 되고, strcpy() import를 위해서는 

#include <string.h>

를 맨 위에 적어주면 된다.

 


3. 최종 예시 코드

이렇게 완성된 최종 코드는 아래와 같다.

#include <stdio.h>
#include <string.h>    // strcpy function import를 위해 
#define _CRT_SECURE_NO_WARNINGS   // strcpy 보안 경고 방지

struct Person {   // 구조체 Person
   int age;              // 구조체 멤버 1: 나이
   char name[20];        // 구조체 멤버 2: 이름
};

int main()
{
    struct Person person1;     // 구조체에 해당되는 변수 선언
    
    person1.age = 50; //나이 할당
    // 이름에 해당하는 값 strcpy() function 통해 할당
    strcpy(person1.name, "김철수");

    
    //구조체에 정보가 잘 들어갔는지 프린트를 통해 확인
    printf("나이: %d\n", person1.age);        // 나이: 50
    printf("이름: %s\n", person1.name);       // 이름: 김철수
    return 0;
}

 

이런식으로 C 언어에서 struct 구조체를 사용하는 방법을 알아보았다. 

간단하지만 모르면 C 언어 코드를 이해하기 어려운 경우가 많으니 잘 알아두자.