Menu
Coddy logo textTech

이러닝 플랫폼

Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 68번째.

challenge icon

챌린지

쉬움

강좌, 학생, 수강 등록을 관리하는 이러닝 플랫폼을 구축해 봅시다! 이 챌린지는 클래스, 상속, 인터페이스, 캡슐화, 그리고 클린 아키텍처 내에서 함께 작동하는 서비스 등 여러분이 OOP에 대해 배운 모든 것을 하나로 모으는 과정입니다.

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

  • Lesson.cs: ELearning.Models 네임스페이스에 Lesson 클래스를 생성합니다. 각 레슨은 생성자를 통해 설정되는 읽기 전용 속성인 Title (string)과 DurationMinutes (int)를 가집니다.
  • Course.cs: ELearning.Models 네임스페이스에 Course 클래스를 생성합니다. 강좌는 읽기 전용인 Id (string), Title (string), Instructor (string) 속성과 Lessons 리스트를 가집니다. AddLesson(Lesson lesson) 메서드와 모든 레슨 시간의 합계를 계산하는 읽기 전용 TotalDuration 속성을 포함하세요.
  • Student.cs: ELearning.Models 네임스페이스에 읽기 전용 Id (int)와 Name (string) 속성을 가진 Student 클래스를 생성합니다. 학생은 강좌 ID를 완료된 레슨 수에 매핑하는 프라이빗 딕셔너리를 통해 학습 진도를 추적합니다. 진도를 증가시키는 CompleteLesson(string courseId) 메서드와 완료된 레슨 수를 반환하는 GetProgress(string courseId) 메서드(등록되지 않은 경우 0 반환)를 포함하세요.
  • EnrollmentService.cs: ELearning.Services 네임스페이스에 EnrollmentService 클래스를 생성합니다. 이 서비스는 프라이빗 컬렉션을 사용하여 강좌와 수강 등록을 관리합니다. 다음을 구현하세요:
    • AddCourse(Course course) - 플랫폼에 강좌를 추가합니다.
    • Enroll(Student student, string courseId) - 등록에 성공하면 true를, 강좌가 존재하지 않거나 학생이 이미 등록된 경우 false를 반환합니다.
    • GetEnrolledCourses(Student student) - 학생이 등록한 강좌 ID 리스트를 반환합니다.
    • GetCourse(string courseId) - 강좌를 반환하거나 찾지 못한 경우 null을 반환합니다.
  • Program.cs: 레슨이 포함된 강좌를 생성하고, 학생을 등록시키고, 진도를 추적하며, 입력에 따라 결과를 표시하여 모든 기능을 하나로 통합합니다.

다음 입력을 받게 됩니다:

  • 생성할 강좌 수
  • 각 강좌별: ID, 제목, 강사, 레슨 수, 그리고 각 레슨별: 제목 및 시간(분)
  • 학생 ID 및 이름
  • 수행할 작업 수
  • 각 작업별: 작업 종류(enroll, complete, progress, 또는 info)와 이어서 강좌 ID

출력 형식:

  • enroll: Enrolled in: {CourseTitle} 또는 Enrollment failed: {courseId}를 출력합니다.
  • complete: Completed lesson in {CourseTitle}를 출력합니다(진도를 1 증가시킴).
  • progress: {CourseTitle}: {completed}/{total} lessons를 출력합니다.
  • info: {CourseTitle} by {Instructor} - {TotalDuration} minutes를 출력합니다.

예를 들어, 입력이 다음과 같다면:

2
CS101
Intro to Programming
Dr. Smith
3
Variables
30
Loops
45
Functions
60
CS102
Data Structures
Dr. Jones
2
Arrays
40
Lists
50
1
Alice
6
enroll
CS101
info
CS101
complete
CS101
complete
CS101
progress
CS101
enroll
CS999

출력은 다음과 같아야 합니다:

Enrolled in: Intro to Programming
Intro to Programming by Dr. Smith - 135 minutes
Completed lesson in Intro to Programming
Completed lesson in Intro to Programming
Intro to Programming: 2/3 lessons
Enrollment failed: CS999

각 클래스가 자신의 책임을 처리하는 동안 서비스가 학생과 강좌 간의 관계를 어떻게 관리하는지 주목하세요. 학생은 자신의 진도를 추적하고, 강좌는 총 시간을 계산하며, 등록 서비스는 모든 것을 조율합니다. 이것이 바로 깔끔한 관심사 분리(separation of concerns)입니다!

직접 해보기

using System;
using System.Collections.Generic;
using ELearning.Models;
using ELearning.Services;

class Program
{
    public static void Main(string[] args)
    {
        // 강좌 수를 읽습니다
        int numCourses = Convert.ToInt32(Console.ReadLine());
        
        // TODO: EnrollmentService 인스턴스를 생성합니다
        
        // TODO: 각 강좌와 해당 레슨들을 읽고 생성합니다
        // 각 강좌에 대해: ID, 제목, 강사, 레슨 수를 읽습니다
        // 각 레슨에 대해: 제목과 기간을 읽습니다
        // 레슨을 강좌에 추가한 다음, 강좌를 서비스에 추가합니다
        
        // 학생 정보를 읽습니다
        int studentId = Convert.ToInt32(Console.ReadLine());
        string studentName = Console.ReadLine();
        
        // TODO: Student 인스턴스를 생성합니다
        
        // 작업 수를 읽습니다
        int numOperations = Convert.ToInt32(Console.ReadLine());
        
        // TODO: 각 작업을 처리합니다
        // 각 작업에 대해: action과 courseId를 읽습니다
        // 처리: enroll, complete, progress, info
        // 작업에 따라 적절한 메시지를 출력합니다
    }
}

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