86. 학생 구조체 동적 메모리 할당 실습

이번에는 사용자 정의 형식의 데이터를 동적으로 생성하는 기능과 소멸하는 기능을 작성하는 실습이예요.

사용자  정의 형식의 데이터를 동적으로 생성하는 기능은 New_[형식 이름]으로 명명하기로 해요.
소멸하는 기능은 Delete_[형식 이름]으로 정의할게요.
그리고 생성하는 과정에서 초기화하는 기능을 생성자 소멸하는 과정에서 해제화하는 기능을 소멸자라 부를게요.

사용자 정의 형식 실습에 사용한 프로젝트에 필요한 기능을 추가하는 형태로 작성하는 실습이예요.
먼저 Student.h 파일에 필요한 기능을 선언하세요.
여기에서는 동적으로 개체를 생성하는 함수와 소멸하는 함수가 필요하겠죠.

Student *New_Student(const char *name);//동적으로 개체 생성
void Delete_Student(Student *stu);//동적으로 생성한 개체 소멸

그리고 Student.c 파일에서 구체적으로 두 개의 함수를 정의하세요.

Student *New_Student(const char *name)
{
    Student *stu = 0;
 동적으로 개체를 만드는 함수에서는 생성할 형식의 메모리를 할당하세요.
    stu = (Student *)malloc(sizeof(Student));
 그리고 생성자(생성한 개체의 메모리를 초기화) 함수를 호출하세요.
    Student_Student(stu,name);
 생성 작업을 마쳤으면 동적으로 할당한 메모리를 반환해야겠죠.
    return stu;
}

void Delete_Student(Student *stu)
{
 개체 내부에서 동적으로 생성한 메모리가 있으면 해제해야 하는데 Student 형식 내부에서는 없으니 자신만 해제하세요.
    free(stu);
}

이제 Program.c 파일의 main 함수를 변경하세요.

먼저 TestStudent 함수의 입력 매개변수 형식을 변경해야겠죠.
앞에서는 학생 데이터를 관리할 주소와 학생 이름을 입력받아 생성자(초기화) 과정부터 출발했었요.
그런데 동적으로 생성하는 함수에서 생성자(초기화)를 호출하므로 이 부분은 TestStudent 함수를 호출하기 전에 수행해야겠죠.

void TestStudent(Student *stu);
int main()
{
    Student stu1;
    Student *stu2;

사용자 정의 형식을 변수로 선언할 때는 생성자(초기화) 함수를 호출한 후에 테스트를 수행하세요.
    printf("--------------%s 학생 테스트 시작--------------\n","홍길동");
    Student_Student(&stu1,"홍길동");
    TestStudent(&stu1);

이번에 작성한 동적으로 생성하여 테스트하는 함수도 호출하세요.
    printf("--------------%s 학생 테스트 시작--------------\n","강감찬");
    stu2 = New_Student("강감찬");
    TestStudent(stu2);
 동적으로 생성하여 사용할 때는 소멸의 책임은 개발자에게 있어요.
    Delete_Student(stu2);
    return 0;
}
void TestStudent(Student *stu)
{
    Student_View(stu);
    Student_Study(stu);
    Student_View(stu);
 ...중략...
    printf("--------------%s 학생 테스트 종료--------------\n",name);
}