78. 사용자 정의 형식 실습 – 형식 정의

먼저 학생 구조체와 상수를 정의하세요.
소스 파일을 분리하여 개발할 때 다른 소스에서 접근할 수 있는 형식과 기능은 헤더 파일에 작성하세요.
그리고 구체적인 함수 정의문을 소스 파일에 작성하세요.

학생 형식을 정의할 헤더 파일은 Student.h 라고 정할게요.

학생은 이름, 학번, 체력, 지력, 스트레스, 연속으로 공부한 횟수를 멤버로 가져야겠죠.

#define MAX_NAME_LEN    20
typedef struct _Student Student;
struct _Student
{
    char name[MAX_NAME_LEN+1];//이름
    int num; //번호
    int hp; //체력
    int iq; //지력
    int stress; //스트레스
    int scnt; //연속으로 공부한 횟수
};

그리고 체력, 지력, 스트레스, 연속으로 공부한 횟수는 값의 범위가 있어요.
여기에서는 이 부분을 열거형으로 정의할게요.
물론 매크로 상수로 정의할 수도 있어요.

enum _StuConst
{
   MIN_HP=0, MAX_HP=100, DEF_HP=100,
   MIN_IQ=0, MAX_IQ=200, DEF_IQ=100,
   MIN_STRESS=0, MAX_STRESS=100, DEF_STRESS=0,
   MIN_SCNT=0, MAX_SCNT=5, DEF_SCNT=0
};

다른 소스 파일에서 학생의 기능을 호출하여 사용할 수 있게 함수를 선언하세요.

프로그램에 여러 개의 형식이 있을 때 어떤 형식에 관한 함수인지 판별하기 쉽게 함수 이름을 정하세요.
여기에서는 함수 이름의 앞 부분은 사용자 정의 형식 이름을 추가하기로 할게요.
예를 들어 “학생이 공부하다.” 기능은 Student_Study로 정의하는 것이죠.
즉 언더바 앞쪽은 형식 이름이고 뒤쪽은 기능으로 볼 수 있겠죠.

학생 데이터를 사용하기 위해 초기 설정하는 함수를 생성자라 부를게요.
그리고 생성자 함수는 Student_Student처럼 기능 부분도 형식 이름으로 정의할게요.
시나리오에 학생을 생성할 때 이름을 전달받아 설정하는 것으로 나와있네요.
이에 맞게 생성자의 함수 원형을 결정하세요.

void Student_Student(Student *stu,const char *name); //생성자

그리고 학생에 관한 기능은 언제나 첫번째 인자는 어느 학생 데이터가 있는 메모리 주소를 전달받게 하세요.
즉 Student 포인터 형식을 받는 것이죠.

“공부하다.”, “강의받다.”, “휴식하다.”, “잠자다.”, “음료를 마시다.”, “노래하다.” “정보 출력” 기능이 필요하죠.

void Student_Study(Student *stu);//공부하다.
void Student_ListenLecture(Student *stu);//강의받다.
void Student_Relax(Student *stu);//휴식하다.
void Student_Sleep(Student *stu);//잠자다.
void Student_Drink(Student *stu);//음료를 마시다.
void Student_Sing(Student *stu);//노래하다.
void Student_View(Student *stu);//자신의 정보를 출력하다.

◈ Student.h

#pragma once
 
#define MAX_NAME_LEN    20
typedef struct _Student Student;
struct _Student
{
    char name[MAX_NAME_LEN+1];//이름
    int num; //번호
    int hp; //체력
    int iq; //지력
    int stress; //스트레스
    int scnt; //연속으로 공부한 횟수
};
enum _StuConst
{
    MIN_HP=0, MAX_HP=100, DEF_HP=100,
    MIN_IQ=0, MAX_IQ=200, DEF_IQ=100,
    MIN_STRESS=0, MAX_STRESS=100, DEF_STRESS=0,
    MIN_SCNT=0, MAX_SCNT=5, DEF_SCNT=0
};
 
void Student_Student(Student *stu,const char *name); //생성자
void Student_Study(Student *stu);//공부하다.
void Student_ListenLecture(Student *stu);//강의받다.
void Student_Relax(Student *stu);//휴식하다.
void Student_Sleep(Student *stu);//잠자다.
void Student_Drink(Student *stu);//음료를 마시다.
void Student_Sing(Student *stu);//노래하다.
void Student_View(Student *stu);//자신의 정보를 출력하다.