Menu
Coddy logo textTech

E-러닝 플랫폼

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

challenge icon

챌린지

쉬움

강좌, 학생, 강사를 관리하는 E-러닝 플랫폼을 구축해 봅시다. 이 종합적인 챌린지는 상속, 인터페이스, 캡슐화 및 디자인 패턴을 하나의 응집력 있는 시스템으로 결합합니다.

코드는 다음 6개의 파일로 구성됩니다:

  • User.php — 학생과 강사 모두의 기본 클래스 역할을 하는 추상 클래스 User를 생성합니다. id (int)와 name (string)에 대해 생성자 프로모션(constructor promotion)을 사용하며, 둘 다 public readonly여야 합니다. 자식 클래스에서 반드시 구현해야 하는 추상 메서드 getRole(): string을 포함하세요.
  • Student.php — User 파일을 포함합니다. User를 상속받는 Student 클래스를 생성합니다. 학생은 등록된 강좌를 private 배열에 추적하고, 각 강좌에 대한 진행률(완료 백분율)을 추적합니다. 다음을 구현하세요:
    • getRole(): string"Student"를 반환합니다.
    • enrollInCourse(Course $course): string — 강좌에 여유 정원이 있는 경우 학생을 등록하고, 성공 또는 실패 메시지를 반환합니다.
    • getEnrolledCourses(): array — 등록된 강좌 배열을 반환합니다.
    • updateProgress(string $courseTitle, int $percent): void — 강좌의 진행률(0-100)을 설정합니다.
    • getProgress(string $courseTitle): int — 진행률 백분율을 반환하거나, 등록되지 않은 경우 0을 반환합니다.
  • Instructor.php — User 파일을 포함합니다. User를 상속받는 Instructor 클래스를 생성합니다. 강사는 강좌를 생성하고 관리할 수 있습니다. 다음을 구현하세요:
    • getRole(): string"Instructor"를 반환합니다.
    • createCourse(string $title, int $capacity): Course — 이 강사가 배정된 새로운 Course를 생성하여 반환합니다.
  • Course.php — Instructor 파일을 포함합니다. title (string, public readonly), instructor (Instructor, public readonly), capacity (int, private)에 대해 생성자 프로모션을 사용하는 Course 클래스를 생성합니다. 등록된 학생들을 private 배열로 추적합니다. 다음을 구현하세요:
    • getCapacity(): int — 최대 정원을 반환합니다.
    • getEnrolledCount(): int — 현재 등록된 학생 수를 반환합니다.
    • hasCapacity(): bool — 학생이 더 등록할 수 있으면 true를 반환합니다.
    • addStudent(Student $student): bool — 정원이 허용되는 경우 학생을 추가하고, 성공 여부를 반환합니다.
    • getStudents(): array — 등록된 학생 배열을 반환합니다.
  • Platform.php — Course와 Student 파일을 포함합니다. 전체 시스템을 관리하는 Platform 클래스를 생성합니다. 강좌와 사용자를 private 배열에 저장합니다. 다음을 구현하세요:
    • addCourse(Course $course): void — 플랫폼에 강좌를 추가합니다.
    • findCourse(string $title): ?Course — 제목으로 강좌를 찾습니다.
    • enrollStudent(Student $student, string $courseTitle): string — 학생을 강좌에 등록합니다. "Course not found", "Course is full", 또는 "[name] enrolled in [title]"을 반환합니다.
    • getCourseStats(string $title): string"[title]: [enrolled]/[capacity] students" 또는 "Course not found"를 반환합니다.
  • main.php — Platform 파일을 포함합니다. 강사 데이터(JSON), 생성할 강좌(JSON), 수행할 작업(JSON)의 세 가지 입력을 받습니다.

    강사 JSON 형식:

    {"id": 1, "name": "Dr. Smith"}

    강좌 JSON 형식:

    [{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]

    작업 JSON 형식:

    [{"type": "enroll", "student_id": 1, "student_name": "Alice", "course": "PHP Basics"}, {"type": "progress", "student_id": 1, "course": "PHP Basics", "percent": 50}, {"type": "stats", "course": "PHP Basics"}]

    플랫폼, 강사 및 모든 강좌를 생성합니다(강사의 createCourse 메서드 사용). 플랫폼에 강좌를 추가합니다. 그런 다음 각 작업을 처리합니다:

    • "enroll" — 새 Student를 생성하고 등록합니다. enrollStudent()의 결과를 출력합니다.
    • "progress" — 학생의 진행률을 업데이트합니다. "[name] progress in [course]: [percent]%"를 출력합니다.
    • "stats"getCourseStats()의 결과를 출력합니다.

    나중에 진행률을 업데이트할 수 있도록 생성된 학생들을 ID별로 추적하세요. 각 작업의 결과를 새 줄에 출력합니다.

이 챌린지는 상속이 어떻게 깔끔한 사용자 계층 구조를 만드는지, 캡슐화가 어떻게 등록 데이터를 보호하는지, 그리고 플랫폼이 강좌, 학생, 강사 간의 관계를 관리하는 조정자 역할을 어떻게 수행하는지 보여줍니다.

직접 해보기

<?php

require_once 'Platform.php';

// 입력 읽기
$instructorData = (array)json_decode(trim(fgets(STDIN)), true);
$coursesData = (array)json_decode(trim(fgets(STDIN)), true);
$operations = (array)json_decode(trim(fgets(STDIN)), true);

// TODO: 플랫폼 생성

// TODO: instructorData를 사용하여 강사(instructor) 생성

// TODO: 강사의 createCourse 메서드를 사용하여 모든 강의를 생성하고
// 플랫폼에 추가

// TODO: 생성된 학생들을 ID별로 추적
$students = [];

// TODO: 각 작업(operation) 처리
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: "enroll" 작업 처리
    // 새로운 학생(Student)을 생성하고 등록
    // enrollStudent()의 결과 출력
    
    // TODO: "progress" 작업 처리
    // 학생 진도 업데이트
    // "[name] progress in [course]: [percent]%" 출력
    
    // TODO: "stats" 작업 처리
    // getCourseStats()의 결과 출력
}

?>

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