Qaupot Blog
Software Engineering, Trip

409. 구조체

🕐 Sat, 08 Feb 2014 09:00:00 GMT 🕓 Tue, 24 Aug 2021 07:44:00 GMT

구조체(Structure)

기본적으로 지원되는 자료형은 몇 종류 되지 않습니다.

"사람"에 대한 자료를 만들어 정리한다고 해 보겠습니다.
이름, 나이, 키 등의 정보가 있고, 이를 표현하기 위해 최소 3개의 변수가 필요합니다.

사람이 많아지면 많아질 수록 이러한 변수 관리 방법은 프로그램의 유지보수를 복잡하게 만듭니다.
위와 같은 방법 대신에, 자료들을 모아서 표현할 방법으로 구조체를 사용할 수 있습니다.

구조체의 선언

#include <stdio.h>

struct Person
{
    char Name[10];
    int Age;
    int Height;
};

int main(int argc,char** argv)
{
    struct Person SecondNewPerson = {"Tom",10,140};

    printf("Name : %s\n",SecondNewPerson.Name);
    printf("Age : %d\n",SecondNewPerson.Age);
    printf("Height : %d\n",SecondNewPerson.Height);
    return 0;
}

struct 새로운 구조체 이름
{
   변수들
};

위의 경우는 이 구조체의 이름은 Person 입니다. 포함된 Name, Age, Height 는 구조체의 멤버변수입니다.

이렇게 정의한 이후에는 변수선언식에서 자료형 자리에 이 구조체를 대입할 수 있습니다.
NewPerson 은 Person 구조체 자료형의 변수 이름입니다.

구조체의 초기화 및 접근

struct Person SecondNewPerson = {"Tom",10,140};

구조체는 생성과 동시에 초기화가 가능하며, { } 사이에 해당자리에 들어갈 값을 대입해 줄 수 있습니다.
C 언어 에서의 구조체의 사용은 위의 예제처럼 struct 까지 명시하여 사용하여야 합니다.

Person SecondNewPerson = {"Tom",10,140};

C++ 에서의 구조체는 모든 멤버변수가 public 인 class 가 되고, struct 키워드를 생략할 수 있습니다.

SecondNewPerson.Age = 20;
SecondNewPerson.Height= 180;
printf("Name : %s\n",SecondNewPerson.Name);
printf("Age : %d\n",SecondNewPerson.Age);
printf("Height : %d\n",SecondNewPerson.Height);

멤버변수들을 접근하기 위해서는 구조체 변수이름에 .을 붙이고 멤버 이름을 사용할 수 있습니다.

구조체와 메모리 구조

메모리상의 데이터는 위와 같은 형태가 됩니다. Person 은 18Byte 의 자료형입니다. 내부는 멤버변수들의 크기인 10Byte, 4Byte, 4Byte 로 이루어져 있으며 메모리에 일렬로 존재합니다.

구조체와 포인터

#include <stdio.h>

struct Person
{
    char Name[10];
    int Age;
    int Height;
};

int main(int argc,char** argv)
{
    Person NewPerson = {"Billy",19,170};

    NewPerson.Age = 20;
    NewPerson.Height = 180;

    Person* PersonPtr = &NewPerson;

    printf("Name : %s\n",(*PersonPtr).Name);
    printf("Age : %d\n",(*PersonPtr).Age);
    printf("Height : %d\n\n",(*PersonPtr).Height);

    printf("Name : %s\n",PersonPtr->Name);
    printf("Age : %d\n",PersonPtr->Age);
    printf("Height : %d\n",PersonPtr->Height);

    return 0;
}

PersonPtr 은 Person 구조체 포인터형이며, NewPerson 의 주소 값을 대입 받습니다.

구조체를 가르키는 포인터를 이용해 멤버변수를 접근하려면, 다음 방법 중 한 가지를 택할 수 있습니다.

첫 번째는, {(*포인터).멤버변수} 의 방식으로, 기본적인 포인터의 사용법을 통한 방법입니다.
먼저, 포인터를 따라간 뒤 구조체 멤버에 접근합니다.

  • 예) (*PersonPtr).Name

두 번째는, {포인터->멤버변수} 의 방식으로, 하는 일은 위와 동일합니다.
일종의 축약 형태라고 보시면 되며, 모양이 화살표 형태이기 때문에 직관적입니다.

  • 예) PersonPtr->Name

일반적으로 후자의 방법이 선호됩니다.

이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.