1. 헤더파일이란?
헤더파일: c프로그램에서 .h가 붙는 파일들로, 여러 소스코드 파일에 공통적으로 필요한 것을 저장하는 파일이다.
#include를 통해 .c파일에서 헤더파일의 내용을 가져다 쓸 수 있다.
헤더파일의 필요성: 유지보수와 재사용에 용이하다. 겹치는 내용은 한 번 적어서 include해서 공통적으로 쓸 수 있고, 유지보수할 때도 보기 편하다.
컴파일 시 헤더파일을 따로 처리할 필요는 없으며 .c파일을 처리하면서 처리된다.
2. 코드 살펴보기
hacker.h
//hacker.h
#pragma once
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
//hacker 구조체 정의
typedef struct hacker{
char name[50];
unsigned int age;
char** skill_list;
int skill_num;
int level;
}hacker;
int input_name(hacker*);
int input_age(hacker*);
int input_new_skill(hacker*);
//new_hacker함수
hacker* new_hacker() {
hacker* new_ptr = (hacker*)malloc(sizeof(hacker));
memset(new_ptr->name, '\0', sizeof(new_ptr->name));
new_ptr->skill_num = 0;
new_ptr->level = 1;
new_ptr->skill_list = (char**)malloc(sizeof(char*));
input_name(new_ptr);
input_age(new_ptr);
input_new_skill(new_ptr);
return new_ptr;
}
//input_name함수
int input_name(hacker* ptr){
write(1,"Input the name : ",17);
return scanf("%s",ptr->name);
}
int input_age(hacker* ptr){
printf("Input the age : ");
return scanf("%u",&ptr->age);
}
void increase_size(char***);
int input_new_skill(hacker* ptr){
write(1, "Input new Skill : ", 18);
char buf[50] = {0,};
scanf("%s",buf);
char* tmp = (char*)malloc(strlen(buf)+1);
strcpy(tmp,buf);
ptr->skill_num++;
increase_size(&(ptr->skill_list));
ptr->skill_list[ptr->skill_num-1] = tmp;
return ptr->skill_num;
}
void increase_size(char*** skill_list) {
if (*skill_list == NULL) {
*skill_list = (char**)malloc(sizeof(char*));
(*skill_list)[0] = NULL;
return;
}
int org_size = sizeof(*skill_list) / sizeof(char*);
char** new_ptr = (char**)malloc(sizeof(char*) * (org_size + 1));
for (int i = 0; i < org_size; i++) {
new_ptr[i] = (*skill_list)[i];
}
free(*skill_list);
*skill_list = new_ptr;
}
헤더파일 hacker.h의 전체 코드는 위와 같다.
저 부분들을 하나하나 떼어서 보자면
header files
#pragma once
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
- #pragma once: 컴파일러에게 해당 헤더파일이 한번만 빌드되도록 하는 역할. 여러 곳에서 include되면 정의가 추가되어 중첩될 수 있는데 이를 방지한다.
hacker 구조체
typedef struct hacker{
char name[50];
unsigned int age;
char** skill_list;
int skill_num;
int level;
}hacker;
new_hacker 함수
//new_hacker함수
hacker* new_hacker() {
hacker* new_ptr = (hacker*)malloc(sizeof(hacker));
// 해커 구조체 크기만큼 메모리 동적 할당
memset(new_ptr->name, '\0', sizeof(new_ptr->name));
//new_ptr->name배열의 모든 바이트를 널로 초기화
new_ptr->skill_num = 0;
new_ptr->level = 1;
new_ptr->skill_list = (char**)malloc(sizeof(char*));
// 스킬 목록을 저장할 포인터 배열을 동적 할당, 초기에는 스킬이 없으므로 char*
input_name(new_ptr);
input_age(new_ptr);
input_new_skill(new_ptr);
// input함수들을 통해 사용자의 정보 입력
return new_ptr;
// 초기화된 해커 구조체 포인터를 반환
}
입력 함수들
hacekr 구조체 포인터를 받아 스킬 입력
input_name
input_age
input_new_skill
int input_new_skill(hacker* ptr){
write(1, "Input new Skill : ", 18);
// write함수를 사용해 위 메시지를 표준출력
char buf[50] = {0,};
// 임시 저장 버퍼를 50바이트 크기로 선언, 모든 바이트를 0으로 초기화
scanf("%s",buf);
// 입력을 버퍼에 저장
char* tmp = (char*)malloc(strlen(buf)+1);
// 입력받은 기술명의 길이만큼 메모리 동적 할당
strcpy(tmp,buf);
// buf에 저장된 기술명을 동적 할당된 메모리 공간 tmp에 복사
ptr->skill_num++;
// 기술 개수 증가
increase_size(&(ptr->skill_list));
// 함수 호출, 하단에 있음
ptr->skill_list[ptr->skill_num-1] = tmp;
// 새로운 기술명을 기술 목록 배열의 마지막 위치에 추가
return ptr->skill_num;
// 기술 개수 반환
}
increase_size 함수
void increase_size(char*** skill_list) {
if (*skill_list == NULL) {
*skill_list = (char**)malloc(sizeof(char*));
(*skill_list)[0] = NULL;
return;
}
int org_size = sizeof(*skill_list) / sizeof(char*);
char** new_ptr = (char**)malloc(sizeof(char*) * (org_size + 1));
for (int i = 0; i < org_size; i++) {
new_ptr[i] = (*skill_list)[i];
}
free(*skill_list);
*skill_list = new_ptr;
}
위 헤더파일의 내용을 받아서 쓰면
//다음과 같은 코드를 이해하고, 작성해봅시다.
//main.c
#include "hacker.h"
int main(){
hacker* qwertyou = new_hacker();
printf("%s's age is %d\n",qwertyou->name, qwertyou->age);
printf("%s's level is %d\n",qwertyou->name, qwertyou->level);
printf("\n\n-----qwertyou's skill list-----\n");
for(int i=0;i<qwertyou->skill_num;i++){
printf("%s's skill%d : %s\n",qwertyou->name, i, qwertyou->skill_list[i]);
}
}
메인함수에 위 함수들과 다른 헤더파일들도 따로 더 적을 필요가 없다.
'knockon' 카테고리의 다른 글
[2주차 TIL] KnockOn Bootcamp 탐색 알고리즘 (0) | 2024.08.13 |
---|---|
[2주차 TIL] KnockOn Bootcamp 정렬 알고리즘 (0) | 2024.08.13 |
[1주차 TIL] KnockOn Bootcamp 트리 (0) | 2024.08.06 |
[1주차 TIL] KnockOn Bootcamp 스택&&큐 (0) | 2024.08.06 |
[1주차 TIL] KnockOn Bootcamp 연결리스트 (0) | 2024.08.06 |