Menu
Coddy logo textTech

E-러닝 플랫폼

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

최종 과제 장에 오신 것을 환영합니다! 이 과제들은 이 과정을 통해 배운 모든 OOP 개념에 대한 숙련도를 테스트하도록 설계되었습니다.

이 도전 과제에서는 상속, 인터페이스, 다형성, 캡슐화 및 디자인 패턴을 하나의 응집력 있는 애플리케이션으로 결합하는 E-Learning Platform 시스템을 구축합니다.

플랫폼은 course, 학생, 강사 간의 관계를 모델링해야 합니다. User base class가 StudentInstructor class에 의해 어떻게 확장될 수 있는지, course가 lesson을 어떻게 포함하는지, 그리고 학생과 course 간에 enrollment 추적이 어떻게 작동하는지 생각해 보세요.

어떤 OOP 원칙이 적용되는지 고려하세요. 사용자 데이터를 보호하기 위해 캡슐화를 사용하고, 공통 동작을 공유하기 위해 상속을 사용하며, Enrollable 또는 Completable과 같은 contract를 정의하기 위해 인터페이스를 사용하고, 다양한 사용자 유형을 일관되게 처리하기 위해 다형성을 사용하세요.

배운 모든 내용을 적용하는 데 행운을 빕니다!

challenge icon

챌린지

쉬움

이 과정 전체에서 익힌 모든 OOP 개념을 하나로 모으는 E-Learning Platform을 만들어 봅시다! 상속, 인터페이스, 다형성, 캡슐화를 사용하여 courses, students, instructors 간의 관계를 모델링하는 시스템을 만들게 됩니다.

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

  • Enrollable.java: enrollment operations의 contract를 정의하는 interface를 Create하세요. boolean을 반환하는 enroll(Student student) 메서드와 int를 반환하는 getEnrolledCount() 메서드를 Declare해야 합니다.
  • User.java: platform의 모든 사용자를 나타내는 abstract base class를 Create하세요. id (String)와 name (String)을 위한 private fields, 두 필드를 초기화하는 constructor, appropriate getters, 그리고 사용자의 역할을 설명하는 String을 반환하는 abstract method getRole()을 포함하세요.
  • Student.java: User를 확장하는 class를 Create하세요. 등록된 course ID를 추적할 private ArrayList를 추가하세요. parent constructor를 호출하는 constructor를 포함하고, getRole()"Student"를 반환하도록 구현하며, addCourse(String courseId)getEnrolledCourseCount() 메서드를 추가하세요. toString()을 Override하여 "Student: [name] ([enrolledCount] courses)"를 반환하도록 하세요.
  • Instructor.java: User를 확장하는 class를 Create하세요. specialty (String)를 위한 private field를 추가하세요. id, name, specialty를 인수로 받는 constructor를 포함하고, getRole()"Instructor"를 반환하도록 구현하며, specialty를 위한 getter를 추가하고, toString()을 Override하여 "Instructor: [name] - [specialty]"를 반환하도록 하세요.
  • Course.java: Enrollable을 구현하는 class를 Create하세요. courseId (String), title (String), instructor (Instructor)를 위한 private fields와 등록된 Students의 ArrayList를 포함하세요. constructor는 courseId, title, instructor를 받습니다. enroll(Student student)를 구현하여 student를 list에 추가하고, 해당 student의 addCourse() 메서드를 이 course의 ID와 함께 call한 다음 true를 반환하세요. getEnrolledCount()도 구현하세요. literal square brackets 안에 course ID를 넣고, 이어서 title과 instructor의 name을 반환하는 getDetails() 메서드를 추가하세요. 이 값은 "[" + courseId + "] " + title + " by " + instructorName로 구성됩니다.
  • Main.java: platform을 구축하세요! comma-separated commands 문자열을 받습니다:
    • ADD_INSTRUCTOR:id:name:specialty
    • ADD_STUDENT:id:name
    • ADD_COURSE:courseId:title:instructorId
    • ENROLL:studentId:courseId
    • INFO:userId

    instructors, students, courses의 collections를 유지하세요. 각 command를 처리하고 다음을 출력하세요:

    • ADD_INSTRUCTOR: Instructor added: [name]
    • ADD_STUDENT: Student added: [name]
    • ADD_COURSE: Course added: [title]
    • ENROLL: [studentName] enrolled in [courseTitle]
    • INFO: 사용자의 toString() output을 출력

    모든 commands가 끝나면 --- Platform Summary ---를 출력하고, 각 course의 details와 enrollment count를 [courseDetails] - [count] student(s) 형식으로 출력하세요.

입력으로 하나의 comma-separated command 문자열을 받습니다.

예를 들어 input이 ADD_INSTRUCTOR:I001:Dr. Smith:Java,ADD_STUDENT:S001:Alice,ADD_STUDENT:S002:Bob,ADD_COURSE:C001:OOP Fundamentals:I001,ENROLL:S001:C001,ENROLL:S002:C001,INFO:S001,INFO:I001인 경우, output은 다음과 같습니다:

Instructor added: Dr. Smith
Student added: Alice
Student added: Bob
Course added: OOP Fundamentals
Alice enrolled in OOP Fundamentals
Bob enrolled in OOP Fundamentals
Student: Alice (1 courses)
Instructor: Dr. Smith - Java
--- Platform Summary ---
[C001] OOP Fundamentals by Dr. Smith - 2 student(s)

이 challenge는 상속 (User hierarchy), 인터페이스 (Enrollable), 다형성 (각자 고유한 toString 구현을 가진 서로 다른 user types), 캡슐화 (controlled access가 적용된 private fields)를 하나의 cohesive system으로 결합합니다!

직접 해보기

import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: 강사, 학생, 강의를 저장할 컬렉션 생성
        // 힌트: 쉬운 조회를 위해 id를 키로 사용하는 HashMap 사용
        
        // TODO: 쉼표를 기준으로 입력을 분할하여 개별 명령어 가져오기
        
        // TODO: 각 명령어 처리:
        // - ADD_INSTRUCTOR:id:name:specialty -> Create instructor, add to collection, print "Instructor added: [name]"
        // - ADD_STUDENT:id:name -> Create student, add to collection, print "Student added: [name]"
        // - ADD_COURSE:courseId:title:instructorId -> Create course with instructor, add to collection, print "Course added: [title]"
        // - ENROLL:studentId:courseId -> 학생을 강의에 등록하고, "[studentName] enrolled in [courseTitle]" 출력
        // - INFO:userId -> 사용자(학생 또는 강사)를 찾아서 해당 객체의 toString() 출력
        
        // TODO: After processing all commands, print "--- Platform Summary ---"
        
        // TODO: 각 강의에 대해 "[courseDetails] - [count] student(s)" 출력
    }
}
quiz icon실력 점검

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

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

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