Menu
Coddy logo textTech

이러닝 플랫폼

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

challenge icon

챌린지

쉬움

강좌와 학생을 관리하고 학습 진행 상황을 추적하는 이러닝 플랫폼(E-Learning Platform)을 구축해 봅시다! 구조체(structs), 인터페이스(interfaces), 컴포지션(composition), 그리고 다형성(polymorphism)을 결합하여 학생이 강좌에 등록하고 레슨을 완료할 수 있는 응집력 있는 시스템을 만들게 됩니다.

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

  • lesson.go: 개별 학습 단위를 나타내는 Lesson 구조체를 정의합니다. 각 레슨은 ID, Title, Duration(분 단위)을 가집니다. Lesson에 대한 포인터를 반환하는 NewLesson 생성자를 포함하세요.
  • course.go: ID, Title, Instructor, 그리고 *Lesson 포인터 슬라이스를 포함하는 Course 구조체를 생성합니다. NewCourse 생성자와 AddLesson 메서드를 포함하세요. 또한 강좌 내 모든 레슨 시간의 합계를 반환하는 TotalDuration() int 메서드를 구현하세요.
  • student.go: ID, Name, Email 필드를 가진 Student 구조체를 정의합니다. NewStudent 생성자를 포함하세요.
  • enrollment.go: 진행 상황 추적 로직이 구현되는 곳입니다. 학생과 강좌를 연결하고 완료한 레슨을 추적하는 Enrollment 구조체를 생성합니다. 다음 항목을 포함해야 합니다:
    • Student에 대한 포인터
    • Course에 대한 포인터
    • CompletedLessons 맵 (레슨 ID를 불리언 값으로 매핑)

    백분율(0.0에서 100.0)을 반환하는 Progress() float64 메서드를 가진 Progressable 인터페이스를 정의합니다.

    Enrollment에 다음 메서드들을 구현하세요:

    • NewEnrollment(student *Student, course *Course) *Enrollment — 빈 완료 레슨 맵을 초기화하는 생성자
    • CompleteLesson(lessonID string) string — 레슨을 완료로 표시합니다. 레슨이 강좌에 존재하지 않으면 "lesson not found"를, 이미 완료했다면 "already completed"를, 성공하면 "completed"를 반환합니다.
    • Progress() float64 — 완료된 레슨의 백분율(완료된 수/전체 수 * 100)을 반환하며, 강좌에 레슨이 없는 경우 0.0을 반환합니다.
  • main.go: 플랫폼을 구축하고 등록 작업을 처리합니다.

    강좌의 ID, 제목, 강사명을 읽습니다. 그다음 레슨의 개수와 각 레슨의 ID, 제목, 시간을 읽습니다. 학생의 ID, 이름, 이메일을 읽습니다. 학생과 강좌를 연결하는 등록(enrollment)을 생성합니다.

    그다음 작업(operation)의 개수를 읽습니다. 각 작업은 "complete [lessonID]" 또는 "progress" 중 하나입니다. complete 작업의 경우 결과 메시지를 출력합니다. progress 작업의 경우 소수점 첫째 자리까지 형식을 맞춘 진행률 뒤에 퍼센트 기호를 붙여 출력합니다.

다음과 같은 입력이 제공됩니다:

  • 강좌 ID, 제목, 강사명 (3줄)
  • 레슨 개수, 그다음 각 레슨의 ID, 제목, 시간 (각 3줄씩)
  • 학생 ID, 이름, 이메일 (3줄)
  • 작업 개수, 그다음 각 작업 (각 1줄씩)

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

C001
Go Fundamentals
Jane Smith
3
L001
Variables
30
L002
Functions
45
L003
Structs
60
S001
Alice
alice@learn.com
5
progress
complete L001
progress
complete L001
complete L002

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

0.0%
completed
33.3%
already completed
completed

그리고 다음과 같이 입력되면:

C100
Python Basics
Bob Teacher
2
L100
Intro
20
L101
Loops
40
S100
Charlie
charlie@edu.com
4
complete L999
complete L100
complete L101
progress

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

lesson not found
completed
completed
100.0%

Enrollment 구조체가 컴포지션을 사용하여 학생과 강좌를 어떻게 연결하는지, 그리고 Progressable 인터페이스가 어떻게 모든 타입이 완료 상태를 보고할 수 있게 하는지 주목해 보세요. 이러한 설계는 확장이 용이합니다. 동일한 인터페이스를 사용하여 개별 레슨이나 전체 학습 경로에 진행 상황 추적 기능을 추가할 수도 있습니다!

직접 해보기

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// 한 줄을 읽기 위한 헬퍼 함수
	readLine := func() string {
		scanner.Scan()
		return strings.TrimSpace(scanner.Text())
	}

	// 강의 정보 읽기
	courseID := readLine()
	courseTitle := readLine()
	courseInstructor := readLine()

	// TODO: NewCourse를 사용하여 강의 생성
	_ = courseID
	_ = courseTitle
	_ = courseInstructor

	// 레슨 수 읽기
	numLessons, _ := strconv.Atoi(readLine())

	// TODO: 각 레슨을 읽고 강의에 추가
	for i := 0; i < numLessons; i++ {
		lessonID := readLine()
		lessonTitle := readLine()
		lessonDuration, _ := strconv.Atoi(readLine())

		// TODO: 레슨을 생성하고 강의에 추가
		_ = lessonID
		_ = lessonTitle
		_ = lessonDuration
	}

	// 학생 정보 읽기
	studentID := readLine()
	studentName := readLine()
	studentEmail := readLine()

	// TODO: NewStudent를 사용하여 학생 생성
	_ = studentID
	_ = studentName
	_ = studentEmail

	// TODO: 학생과 강의를 연결하는 등록(enrollment) 생성

	// 작업 수 읽기
	numOps, _ := strconv.Atoi(readLine())

	// 각 작업 처리
	for i := 0; i < numOps; i++ {
		operation := readLine()

		if operation == "progress" {
			// TODO: Progress()를 호출하고 "%.1f%%" 형식으로 출력
			fmt.Println("0.0%") // 실제 진행률로 교체
		} else if strings.HasPrefix(operation, "complete ") {
			lessonID := strings.TrimPrefix(operation, "complete ")
			// TODO: CompleteLesson을 호출하고 결과 출력
			_ = lessonID
			fmt.Println("") // 실제 결과로 교체
		}
	}
}

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