카메라 개발자 공부방(SW)

[18장] 구조체 본문

Langauge/C

[18장] 구조체

luckmart 2021. 10. 7. 23:10
반응형

자 다음은 구조체에 대해 공부해볼 시간입니다. 우리는 앞장에서 data type과 변수에 대해 공부를 했었습니다. 

그런데 코딩을 하다 보면 연관 있는 변수끼리 묶어서 관리하면 굉장히 편할 때가 있는데요. 이럴 때 구조체가 사용될 수 있습니다.
다음 코드를 보겠습니다.

#include <stdio.h>

int main() 
{
    int x = 2 ;
    int y = 4;

    printf("%d, %d\n", x, y);
    return 0;
}

 

x와  y는 좌표를 의미하기 때문에 따로 사용될 때는 전혀 의미가 없는 값들입니다.

구조체를 사용하면 다음과 같이 선언할 수 있습니다.

struct Point
{
    int x;
    int y;
};
#include <stdio.h>

struct Point
{
    int x;
    int y;
};

int main() 
{
    struct Point point;
    point.x = 2;
    point.y = 4;
    printf("%d %d\n", point.x, point.y);
    return 0;
}

// 실행결과 
// 2 4

구조체 메모리

Point란 새로운 data type을 정의했고, int형 data type의 변수로 구성되어있습니다.

이제 Point란 변수를 선언하면 좌표값들을 쉽게 관리할 수 있겠죠?

여기서 정의란 개념이 등장하는데, 정의는 실체가 없는 개념입니다.
어렵죠? 이해가 쉽게 설명해보겠습니다.
사람이란 정의가 있다고 해봅시다. 사람이 존재하나요? 사람이란 추상적인 정의만 있을 뿐 실제론 존재하진 않습니다.
사람의 정의를 빗댄 홍길동이 존재하는 것입니다.

Point 구조체의 정의를 선언할 때도 이와 같습니다.
정의는 실체가 없는 추상적 개념일 뿐입니다.

 

Point p1;

Point란 추상적 정의를 빗대서 생성한 p1이란 메모리가 진짜 존재하는 것입니다. 

그리고 구조체가 새로운 data type이라 해서 기존의 data type 수준의 새로운 자료형을 만드는 것이 아닙니다.
원래 있던 자료형을 조합해서 새로운 자료형을 만드는 것입니다.

 

이번엔 크기를 볼까요?

#include <stdio.h>

struct Point
{
    int x;
    int y;
};

int main() 
{
    struct Point point;
    point.x = 2;
    point.y = 4;
    printf("%d %d size: %d\n", point.x, point.y, sizeof(Point));
    return 0;
}

// 실행결과
// 2 4 8

int형 data type이 2개이기 때문에 메모리 사이즈가 8이 출력된 것입니다. point라는 메모리 공간 안에는 x라는 변수와 y라는 변수가 존재합니다.

x와 y를 멤버 변수라고 하고 이 멤버에 접근하게 하는 . 연산자를 멤버 접근자라고 합니다.

이 멤버 접근자를 통해 멤버 변수에 접근할 수 있습니다. 

 

그리고 struct로 새롭게 정의한 Point 변수도 포인터 변수를 활용해서 사용할 수 있습니다.
다음은 struct를 동적으로 할당해서 사용한 예시입니다.

#include <stdio.h>

struct Point
{
    int x;
    int y;
};

int main() 
{
    struct Point* pPoint = (Point*)malloc(sizeof(Point));
    pPoint->x = 2;
    pPoint->y = 4;
    printf("%d %d size: %d\n", point.x, point.y, sizeof(Point));
    free(pPoint);
    return 0;
}

// 실행결과
// 2 4 8

포인터 형식으로 메모리의 멤버에 접근할 땐 .이 아니라 멤버 접근자 -> 사용해서 접근을 합니다.

그 외에는 똑같답니다!

 

구조체 메모리를 동적으로 할당한 예제

 

나중에 C++ 객체지향 때 또 배우겠지만 이 struct는 상태만 갖고 있습니다.
여기서 상태란 정적인 것을 의미하며 변수에 해당됩니다. 동적인 것에 해당하는 것은 '~해라' 의미가 담긴 함수입니다.

 

struct는 상태 정보만 포함

다음 예제 하나로 전반적인 구조체 사용법을 정리해보겠습니다.

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

struct Person
{
    char name[16];
    char email[32];
    int age; 
};

int main() 
{
    struct Person* pPersonArray= (Person*)malloc(sizeof(Person) * 2);
    /* init */
    strcpy(pPersonArray[0].name, "KimMinSu");
    strcpy(pPersonArray[0].email, "KimMinSu@gmai.com");
    pPersonArray[0].age = 22;
    strcpy(pPersonArray[1].name, "SongMinSu");
    strcpy(pPersonArray[1].email, "SongMinSu@gmai.com");
    pPersonArray[1].age = 17;

   /* print */

   for (int k = 0; k < 2; k++) {
        printf("name: %s email: %s age: %d\n", pPersonArray[k].name, pPersonArray[k].email, pPersonArray[k].age);
   }

    free(pPersonArray);

    return 0;
}

실행결과
// KimMinSu KimMinSu@gmai.com 22
// SongMinSu SongMinSu@gmai.com 17

Person이란 새로운 data type을 정의한 후, 동적으로 메모리를 할당하였습니다.
그리고 실체(메모리)에 상태 값을 초기화한 후에 출력을 하였습니다.

간단하죠?

 

자 오늘은 여기까지~!

'Langauge > C' 카테고리의 다른 글

[20장] void 포인터  (0) 2021.10.09
[19장] 2차원 배열  (0) 2021.10.08
[17장] 동적메모리와 저장소  (0) 2021.10.06
[16장] 아스키 코드(ASCII)  (0) 2021.10.05
[15장] 문자열 라이브러리(string.h)  (0) 2021.10.04
Comments