본문 바로가기
Language&Framework&Etc/C

구조체와 사용자 정의 자료형2(23-3) 구조체의 유용함에 대한 논의와 중첩 구조체

by 머리올리자 2020. 12. 13.

구조체는 프로그램 구현에 있어서 중요한 위치를 차지하고 있음

 

구조체를 정의하는 이유

"구조체를 통해서 연관 있는 데이터를 하나로 묶을 수 있는 자료형을 정의하면,

데이터의 표현 및 관리가 용이해지고, 그만큼 합리적인 코드를 작성할 수 있게 된다."

 

단순히 편의를 위한 것으로 들리겠지만, 구조체의 정의는 프로그램 구현에 있어서 절대적인 위치를 차지

 

예제.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

typedef struct student
{
	char name[20];      // 학생 이름
	char stdnum[20];    // 학생 고유 번호
	char school[20];    // 학교 이름
	char major[20];     // 전공
	int year;           // 학년

}Student;

void showstudentinfo(Student* sptr)
{
	printf("학생 이름: %s\n", sptr->name);
	printf("학생 고유번호: %s\n", sptr->stdnum);
	printf("학교 이름: %s\n", sptr->school);
	printf("선택 전공: %s\n", sptr->major);
	printf("학년: %d\n", sptr->year);

}

int main(void)
{
	Student arr[7];

	for (int i = 0; i < 7; i++)
	{
		printf("이름: "); scanf("%s", arr[i].name);
		printf("번호: "); scanf("%s", arr[i].stdnum);
		printf("학교: "); scanf("%s", arr[i].school);
		printf("전공: "); scanf("%s", arr[i].major);
		printf("학년: "); scanf("%d", &arr[i].year);
	}

	for (int i = 0; i < 7; i++)
		showstudentinfo(&arr[i]);
	return 0;
}

학생정보를 받기 위해 Student가 정의

구조체를 정의하지 않는다면 다수의 배열이 필요하다.

그리고 12행에 정의된 함수의 매개변수 선언도 이렇듯 간단해질 수 없음.

 

출력할 데이터의 종류만큼 매개변수가 선언되어야 하기 때문.

 

그래서 구조체의 정의가 필요한 상황에서 구조체를 정의하지 않으면, 합리적인 코드 작성이 불가능

 

중첩된 구조체의 정의와 변수의 선언

배열이나 포인터 변수가 구조체의 멤버로 선언될 수 있듯이, 구조체 변수도 구조체의 멤버로 선언될 수 있다.

#include <stdio.h>

typedef struct point
{
	int xpos;
	int ypos;

}Point;

typedef struct circle
{
	Point cen; // 구조체의 변수를 멤버로 선언
	double rad;
}Circle;

void showcircleinfo(Circle* cptr)
{
	printf("[%d, %d] \n", (cptr->cen).xpos, (cptr->cen).ypos);
	printf("radius : %g \n\n", cptr->rad);
}

int main(void)
{
	Circle c1 = { {1, 2}, 3.5 }; // 구조체 변수가 멤버로 존재할 경우, 중괄호를 이용해서 멤버의 초기화 구분 가능
	Circle c2 = { 2, 4, 3.9 };  // 중괄호를 이용해서 구조체 변수의 초기화를 구분 짓지 않으면 순서대로 초기화 된다.

	showcircleinfo(&c1);
	showcircleinfo(&c2);
}

 

 

 

참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.