C/Basic

[C] 구조체(Structure)

HYEOKJUN 2022. 9. 17. 20:00
반응형


구조체 (Structure)

구조체서로 다른 자료형을 갖는 데이터들을 하나로 묶어 놓은 자료형으로 내부 데이터는 사용자가 직접 필요한 것만 필요한 만큼 서로 다른 데이터를 지정하여 사용할 수 있습니다.


예를 들어, 사람에 대한 정보를 담는 데이터에는 char배열의 이름, int형의 나이, float형의 키와 몸무게 등의 여러 데이터가 필요합니다.

char name[10] = "Hyeok Jun";
int age = 20;
float height = 175;
float weight = 65;

다음과 같이 사람 정보를 담는 데이터를 하나씩 선언할 수 있지만  10개, 100개, 그 이상의 여러 사람 데이터를 생성한다고 하면 프로그램이 복잡해질 것입니다.

char name[100][10];
int age[100];
float height[100];
float weight[100];

위와 같이 한 자료형의 배열을 이용하여 표현할 수도 있습니다. 하지만 각 데이터들의 관계가 불명확하고 프로그래머가 코드를 읽는 데에도 좋지 않아 보입니다.

struct Person {
	char name[10];
	int age;
	float height;
	float weight;
};

struct Person person_ary[100];

이런 문제점들은 구조체를 사용함으로써 해결할 수 있습니다. 


구조체 정의와 선언

struct 구조체_이름 {
	// 맴버 변수...
};

구조체는 키워드 'struct'를 사용하여 멤버 변수들과 함께 선언합니다.

struct 구조체_이름 변수_이름;

또한 선언한 구조체를 사용할 때에는 일반 변수들과 비슷하게 'struct + {자료형이 지정한 구조체 이름}'인 자료형 변수를 선언합니다.

'struct'와 '구조체이름'은 한 묶음으로 반드시 붙여 사용합니다. 

struct Student {
	char name[10];
	int age;
	int grade;
};

struct Student student1, student2;

구조체의 재정의 (typedef)

struct 구조체_이름 {
	// 맴버_변수...
};

typedef struct 구조체_이름 재정의_이름;

재정의_이름 변수_이름;

일반적으로 구조체 변수를 선언할 때는 키워드 'struct'를 붙여 사용하지만 키워드 'typedef'를 사용하면 위와 같이 더 편리하게 구조체 변수를 선언할 수 있습니다.  또한 재정의한 이름으로 구조체 자료형을 사용할 수 있습니다.

typedef struct 구조체_이름 {
	// 맴버_변수...
} 재정의_이름;

재정의_이름 변수_이름;

또는 구조체의 선언과 동시에 재정의할 수 있습니다.

(이때 재정의 이름으로 구조체 자료형이 존재하기 때문에, 선언시 구조체 이름은 지정하지 않아도 됩니다.)

typedef는 구조체 이름이 긴 경우키워드 'struct'를 일일이 쓰고 싶지 않을 때 사용합니다.

typedef struct {
	char name[10];
	int age;
	int grade;
} Student;

Student std1;

구조체 초기화

struct 구조체_이름 변수_이름 = { /* 멤버 변수 초기화 */ };

구조체의 멤버 변수는 중괄호 '{'와 '}'사이에 순서대로 콤마(,)를 기준으로 구분하여 초기화합니다.


struct Student {
	char name[10];
	int age;
	int grade;
};

struct Student std1 = { "James", 21, 80 };

구조체 접근

도트 연산자(.)

구조체_변수_이름.멤버_변수_이름

구조체의 멤버 변수는 도트 연산자(.)를 사용하여 접근할 수 있습니다.


struct Student {
	char name[10];
	int age;
	int grade;
};

struct Student std1 = { "James", 21, 80 };

printf("이름 : %s\n", std1.name);
printf("나이 : %d\n", std1.age);
printf("점수 : %d\n", std1.grade);

화살표 연산자 (->)

(*구조체_포인터_변수_이름).멤버_변수_이름

포인터 구조체의 경우에는 다음과 같이 멤버 변수에 접근할 수 있지만

구조체_포인터_변수_이름->멤버_변수_이름

다음과 같이 화살표 연산자(->)를 사용하여 접근할 수도 있습니다.


struct Student {
	char name[10];
	int age;
	int grade;
};

struct Student std1 = { "James", 21, 80 };

struct Student* pstd1 = &std1;

printf("이름 : %s\n", pstd1->name);
printf("나이 : %d\n", pstd1->age);
printf("점수 : %d\n", pstd1->grade);

 

반응형