Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags more
Archives
Today
Total
관리 메뉴

냥집사의 개발일지

C언어 - 구조체 (struct) 본문

C언어

C언어 - 구조체 (struct)

깅햄찌 2022. 9. 23. 20:12
반응형

안녕하세요 오늘은 구조체에 대해 알아보겠습니다~

지금까지는 기본 자료형(int, double, char etc.)등으로만 코드를 구성했다면

오늘은 사용자 정의 자료형 즉, user의 필요에 따른 자료형을 struct를 이용해 만들어 보겠습니다.  

 

1. 구조체 선언 과 멤버 접근 연산자 사용 방법

구조체 선언 하는 법은 아래와 같습니다. 

예약어(struct) + 구조체 이름 {구조체 멤버 변수}

ex. struct s1{

      int i1;

      char c1;

      double d1;

}

구조체를 선언하고 멤버 변수에 접근하여 출력하는 예제를 살펴보겠습니다. 

#include <stdio.h>

struct Earth{
    char *continents; // "Asia", "Africa", "North_America", "South_America", "Antarctica", "Europe", "Australia"
    int countries_num;
};

int main(){
    struct Earth earth;

    earth.continents = "Asia";
    earth.countries_num = 48;

    printf("continents      : %s\n", earth.continents);
    printf("countries_num   : %d\n", earth.countries_num);

    return 0;
}

1. Earth라는 struct를 만들고 멤버 변수로는 contirnents(문자 포인터형), countries_num(정수형)을 선언했습니다. 

2. main 함수에서 Earth 구조체 변수 earth를 선언합니다. 

3. earth에 멤버 접근 연산자('.')를 이용해 Earth 구조체 멤버에 접근합니다. (ex. earth.continents)

4. 아래 결과 처럼 멤버 접근 연산자를 이용해 구조체 멤버에 할당한 변수가 정상 출력된 것을 확인했습니다. 

TIPS 구조체는 실행 효율을 위해 padding byte를 넣어서 byte 정렬을 합니다!

ex 1. 

struct s1{

   int i;

   double d;

}

위와 같은 구조체가 있다면 구조체 중 가장 큰 자료형을 기준으로 메모리 공간을 할당합니다. 

위의 구조체에서는 double이 가장 크기 때문에 int형 멤버 변수는 4 byte padding byte를 더해 8byte로 할당되게 됩니다!

ex 2. 

struct s1{

   int i;

   double d;

   char c;

}

위의 구조체에서도 가장 큰 자료형은 double입니다.

따라서 int형 멤버 변수는 4byte padding byte를 char형 멤버 변수는 7byte padding byte가 할당됩니다!

그런데 이때 padding byte가 너무 많이 할당되는 것 같지 않나요?

아래 예제에서 최적화 시켜보아요~

ex 3. 

struct s1{

   int i;

   char c;

   double d;

}

예제 2번과 비교해서 char형 멤버 변수와 double형 멤버 변수의 위치가 바꿨습니다.

역시 위의 구조체에서도 가장 큰 자료형은 double입니다.

다만, char형 자료형의 크기가 int형의 padding byte 4보다 작기 때문에

char 형이 padding byte 쪽에 할당된 것을 확인할 수 있습니다. 

이렇게 멤버 변수 선언 위치만 바꾸어도 코드 최적화를 시킬 수 있다는 점!!

TIP 안에 TIP

unsigned type은 data 확장 시 무조건 zero expansion (padding byte에 0이 할당)

signed type은 data 확장 시 무조건 sign bit expansion (padding byte에 기존 data가 음수면 1이 할당, 양수 면 0이 할당)

 

 

오늘은 구조체에 대해 간단히 알아보았습니다

이번 포스팅을 통해 구조체의 선언, 멤버 변수 이용 방법, 구조체의 구조를 이해하는데 도움이 됐으면 좋겠습니다.

그럼 다음에 만나요~

Comments