Menu
Coddy logo textTech

요약 - 학생 기록 시스템

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 39번째.

이제 캡슐화 지식을 실제로 적용해 볼 시간입니다! 이 도전 과제에서는 접근 지정자, 정보 은닉, 중첩 class의 올바른 사용을 보여 주는 Student Records System을 구축합니다.

여러분의 시스템은 다음과 같은 캡슐화 원칙을 사용하여 학생 데이터를 관리합니다.

  • 성적과 학생 ID 같은 민감한 정보를 보호하기 위한 Private 데이터 멤버
  • getter와 제어된 setter를 사용하는 Public 인터페이스
  • 개별 강좌 성적을 나타내는 중첩 class로, 이 구현 세부 사항을 student class 내부에 포함

구현할 구조는 다음과 같습니다.

class Student {
public:
    class Grade {    // 과목 성적을 위한 중첩 클래스
        // ...
    };
    
    // 학생 데이터와 상호작용하기 위한 공개 인터페이스
    
private:
    std::string name;
    int studentId;
    // 성적 컬렉션
};

이 도전 과제에서는 이 장에서 배운 모든 내용을 결합합니다. 적절한 접근 수준을 선택하고, 깔끔한 인터페이스 뒤에 구현 세부 사항을 숨기며, 관련 타입을 구성하기 위해 중첩 class를 사용하는 것입니다. 무엇에 접근할 수 있어야 하고 무엇을 숨겨 두어야 하는지 신중하게 생각해 보세요.

challenge icon

챌린지

쉬움

캡슐화에 대해 배운 모든 내용을 한데 모은 Student Records System을 만들어 봅시다. 학생 데이터가 적절하게 보호되고, 성적은 중첩된 class를 통해 관리되며, 모든 상호 작용은 깔끔한 public interface를 통해 이루어지는 시스템을 만들게 됩니다.

코드를 구성하기 위해 두 개의 파일을 만들게 됩니다.

  • Student.h: 중첩된 Grade class를 사용해 적절한 캡슐화를 보여 주는 Student class를 Define합니다.

    Student의 public section에 선언되는 중첩된 Grade class는 course name(string)과 score(double)를 저장해야 합니다. 두 값을 모두 받는 constructor를 만들고, 데이터에 접근할 수 있도록 getCourseName()getScore() 메서드를 제공하세요. Grade class는 Student 안에 중첩되어 있더라도 데이터를 private으로 유지하며, 자체적인 캡슐화를 유지합니다.

    Student class에는 학생의 name(string), student ID(int), 그리고 Grade 포인터의 collection을 위한 private 멤버가 있어야 합니다. 다음을 제공하세요.

    • name과 student ID를 받는 constructor
    • Getter getName()getStudentId()(둘 다 const)
    • 새로운 Grade를 생성하여 학생의 record에 add하는 addGrade(const std::string& course, double score) 메서드(score가 0 이상 100 이하일 때만 add)
    • 모든 성적의 Average를 계산하여 반환하는 getAverageGrade()(const) 메서드. 성적이 exist하지 않으면 0.0을 반환합니다.
    • 학생의 complete record를 보여 주는 displayRecord()(const) 메서드

    destructor에서 dynamically allocated된 성적을 clean하는 것을 잊지 말고, 적절한 header guards를 include하세요.

  • main.cpp: 입력에서 학생 name, student ID, 세 개의 course grades를 읽습니다. 입력 format은 다섯 줄입니다. name, ID, 그리고 각각 course name과 score가 공백으로 구분된 세 줄입니다(예: Math 95.5).

    name과 ID로 Student를 Create하고, 세 성적을 모두 add한 다음 complete record를 Display하세요.

    displayRecord()의 출력 format은 다음과 같아야 합니다.

    Student: <name> (ID: <id>)
    Grades:
      <course1>: <score1>
      <course2>: <score2>
      <course3>: <score3>
    Average: <average>

score와 Average를 각각 한 자리 소수로 format하려면 <iomanip>std::fixedstd::setprecision(1)을 사용하세요. ID는 std::stoi()로, score는 std::stod()로 Convert하세요.

이 challenge는 private data members, public getters, validation을 적용한 controlled setters, 그리고 nested class를 결합하여, 이 모든 요소가 함께 잘 캡슐화된 student records system을 만들도록 합니다.

직접 해보기

#include <iostream>
#include <string>
#include <sstream>
#include "Student.h"

int main() {
    // 학생 이름 읽기
    std::string name;
    std::getline(std::cin, name);
    
    // 학생 ID 읽기
    std::string idStr;
    std::getline(std::cin, idStr);
    int studentId = std::stoi(idStr);
    
    // 세 과목 성적 읽기 (형식: "CourseName Score")
    std::string line1, line2, line3;
    std::getline(std::cin, line1);
    std::getline(std::cin, line2);
    std::getline(std::cin, line3);
    
    // TODO: 각 줄을 파싱하여 과목명과 점수를 추출
    // std::stod()를 사용하여 점수 문자열을 double로 변환
    
    // TODO: 이름과 ID로 Student 객체 생성
    
    // TODO: 세 성적을 모두 학생에 추가
    
    // TODO: 완전한 학생 기록 표시
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C++ 컴파일러