안녕하세요! 오늘은 구조체 기본 구조, 구조체 malloc, free, 구조체 size에 대해서 알아보도록 하겠습니다.
저번 시간에는 malloc(), free()함수가 구조체에 적용시킨 것이 아니라 일반 자료형을 가진 변수에 적용을 시켰습니다.
그래서 이번에 구조체 배우는 김에 malloc(), free()함수를 적용시켜봤습니다.
일단 구조체는 왜 필요할까요? 구조체를 사용한다면 자료들을 효율적으로 관리할 수 있고 알아보기도 쉽습니다.
그렇다면 구조체는 언제 사용할까요? 예를 들면 대학교에 입학한 학생들이 있습니다. 그 학생들에 대한 정보를 저장하고 싶을 때 필요합니다. 그들은 외모나 내적으로 같은 사람이 없지만 특징할 수 있는 것은 있습니다. 학번, 이름, 핸드폰번호, 학년 등이 있습니다. 이러한 특징할 수 있는 것들을 묶어서 하나의 구조체로 만들게 됩니다.
한번 소스코드부터 보실까요?
Line 3~8 : Line 3과 같은 모양으로 구조체를 선언합니다. 중괄호 내부에는 int, char형 배열 등 자료형을 가진 변수를 선언할 수 있습니다. 즉, struct 구조체 이름 { 구조체에서 필요한 변수들 }; 구조가 될 수 있겠습니다. 그런데 만약 아래 소스를 보시면 struct student 이런 식으로 변수에 자료형을 써야하는데 만약 그러고 싶지 않으시다면 typedef struct _student { 들어갈 내용 }student; 라고 사용하시면 별칭으로 사용하는겁니다. 그러면 struct를 생략하셔도 됩니다.
Line 13~14 : 저번 시간에 배웠다시피 동적할당을 하기 위해서 몇개를 할당 받아야 하는지 입력을 받습니다.
Line 15 : 구조체를 동적 할당 받을 때에는 위와 같이 받습니다. 말로 풀어보면 '구조체 student를 가리키는 포인터 stu2에 구조체 student의 크기 * 입력받은 값(N)만큼 메모리에 할당해라.' 입니다.
Line 16 : 출력창은 아직 안보셨겠지만 사이즈가 40으로 나옵니다. 그 이유는 구조체는 할당할 때 4byte간격으로 저장을 하는데 int num은 4byte, int grade도 4byte, char phone[20]는 20byte가 나오는데 char name[10]은 12byte를 할당하여 줍니다. 그렇다면 남은 2byte는 뭘까요? 2byte는 빈공간으로 남게 됩니다. 기억하셔아할 것은 '만약 4byte의 배수 크기가 안된다면 나머지는 빈공간으로 남지만 그 공간도 구조체의 사이즈에 포함이 된다.' 입니다.
아래 내용은 출력내용을 먼저 보시겠습니다.
직관적으로 출력창 한번 보실게요. 먼저 총원이 4명이라고 입력을 했고, Line 16내용을 토대로 구조체 사이즈는 40인 것이 출력이 되었습니다.
총원이 4명이라고 했으니 학생 1~4까지의 입력을 받고, 출력이 되도록 만들었습니다. 그리고 그 다음에는 정적 메모리 할당을 통해서 struct student stu[100] -> 즉, 100개의 student 구조체 배열을 가진 stu 변수를 선언했습니다. 딱 보기만 해도 구조체 student의 크기 40을 100개 선언 했으니 메모리에는 총 4000의 공간을 차지하겠습니다. 그런데 위 프로그램에서는 2명의 학생만 입력을 받았습니다. 다음과 같이 될 경우 98명 더 입력을 받을 수 있는 공간이 있습니다. 그러면 매우 비 효율적이겠죠? 그래서 동적할당을 이용하는 것입니다. 딱 필요한 만큼만 할당을 해서 사용하고 메모리 해제를 해주면 됩니다. 나중에는 좀 더 효율적으로 메모리 관리를 하기 위해서 자료구조를 배울겁니다.
그리고 구조체 안에 있는 변수를 사용하시려면 stu.num과 같이 사용하시면 됩니다.
.이라는 기호를 통해서 접근할 수 있도록 visualstudio 내부 프로그램 상에서 정의를 한 것입니다.
그러니 그냥 그렇게 사용한다~ 라고 생각해주시면 됩니다.
코드를 직접 한번 짜보시고 출력창 보면서 잘 프로그램이 동작 하는지, 구조체랑 malloc(),free()함수에 대해서 잘 이해가 되었는지 꼭 확인하시고 넘어가시기 바랍니다. 만약 그렇지 않으면 나중에 좀 더 심화된 예제를 풀 때에 혹은 실무에서도 응용하기 어려우실거에요! 화이팅하세요~~
'IT > C언어' 카테고리의 다른 글
C언어 예제 - 프로젝트 회사 프로그램 만들기(1) (1) | 2020.04.05 |
---|---|
C언어 기초 문법 - 포인터에 대해서 이해하기 (0) | 2020.04.04 |
C언어 기초 문법 - malloc, free, 메모리 동적할당을 담당하는 함수 (0) | 2020.03.31 |
C언어 기초 문법 - 아스키코드, 배열, 문자열 입력 출력, 알파벳 대소문자 변경에 대해서 배우기! (0) | 2020.03.29 |
C언어 기초 문법 - 이중반복문, 함수, if-else문, 논리연산을 도와주는 &&, || 에 대해서 알아보기 (0) | 2020.03.27 |