Menu
Coddy logo textTech

복습 - 학생 기록 시스템

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 43번째.

challenge icon

챌린지

쉬움

이 장에서 배운 모든 캡슐화 개념을 하나로 모은 Student Records System을 만들어 보겠습니다. constructor promotion, private 프로퍼티, 검증 기능이 있는 getter와 setter, 정보 은닉을 사용하여 학생 데이터를 안전하게 관리하는 체계적으로 구성된 시스템을 만들게 됩니다.

코드를 세 개의 파일로 구성합니다:

  • Student.php: private $name (string)과 private $studentId (string)에 constructor promotion을 사용하는 Student class를 Create합니다. 또한 private $grades array 프로퍼티도 포함합니다(값은 empty로 initialized). Student에는 다음 기능이 있어야 합니다:
    • getName(): 학생의 이름을 반환합니다
    • getStudentId(): 학생 ID를 반환합니다
    • addGrade(int $grade): 0에서 100 사이(between, 양 끝값 inclusive)인 경우에만 grade를 추가합니다
    • getAverage(): 모든 grades의 평균을 float로 반환합니다(grades가 없으면 0.0을 반환)
    • getGradeCount(): 기록된 grades의 number를 반환합니다
  • Classroom.php: 학생들의 컬렉션을 관리하는 Classroom class를 Create합니다. students를 저장하기 위해 private array를 사용합니다. Student 파일을 포함합니다. Classroom에는 다음 기능이 있어야 합니다:
    • constructor promotion을 사용하여 private $roomName (string)을 받는 constructor
    • addStudent(Student $student): classroom에 학생을 추가합니다
    • getStudentCount(): enrolled students의 number를 반환합니다
    • getClassAverage(): 모든 students의 averages의 평균을 calculates합니다(students가 없거나 grades가 없으면 0.0을 반환)
    • getRoomName(): classroom 이름을 반환합니다
  • main.php: Classroom 파일을 포함합니다. 다섯 개의 inputs를 받습니다: 방 이름, 학생 이름, 학생 ID, 그리고 두 개의 grade 값입니다. 방 이름으로 Classroom을 Create합니다. 이름과 ID로 Student를 Create하고, 두 grades를 (int로 변환하여) 추가한 다음 학생을 classroom에 추가합니다. 네 줄을 Print합니다:
    • 방 이름
    • 학생의 이름 뒤에 1 decimal place로 formatted된 평균: "[name]: [average]"
    • 해당 학생의 grades number
    • 1 decimal place로 formatted된 class 평균

이 시스템은 적절한 캡슐화를 보여 줍니다. grades는 직접 조작하지 못하도록 보호되고, 원시 데이터를 노출하지 않고 averages가 내부적으로 계산되며, 모든 데이터 흐름은 제어된 메서드를 거칩니다. classroom은 students가 averages를 어떻게 calculates하는지 알 필요가 없습니다. 단지 결과를 요청하면 됩니다.

직접 해보기

<?php

require_once 'Classroom.php';

// 입력 읽기
$roomName = trim(fgets(STDIN));
$studentName = trim(fgets(STDIN));
$studentId = trim(fgets(STDIN));
$grade1 = intval(trim(fgets(STDIN)));
$grade2 = intval(trim(fgets(STDIN)));

// TODO: 방 이름으로 Classroom 생성

// TODO: 이름과 ID로 Student 생성

// TODO: 학생에게 두 성적을 모두 추가

// TODO: 학생을 교실에 추가

// TODO: 방 이름 출력

// TODO: 학생 이름 뒤에 소수점 1자리로 포맷된 평균을 출력: "[name]: [average]"

// TODO: 해당 학생의 성적 수 출력

// TODO: 소수점 1자리로 포맷된 학급 평균 출력

?>

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

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