Menu
Coddy logo textTech

요약 - 학생 기록

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

challenge icon

챌린지

쉬움

적절한 캡슐화를 보여 주는 Student Records 시스템을 만들어 봅시다. 민감한 학업 데이터는 보호하면서도 잘 설계된 메서드를 통해 제어된 접근을 제공하는 학생 관리 구조를 만들게 됩니다.

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

  • student.go: 민감한 information을 보호하면서 안전한 public data를 노출하는 Student 구조체를 Create합니다. 학생의 Name은 Exported (publicly accessible)되어야 하지만, grade (float64)와 studentID (string)는 이 민감한 information을 보호하기 위해 Exported되지 않아야 합니다.

    다음을 Implement합니다:

    • NewStudent(name, id string, initialGrade float64) *Student constructor는 학생을 creates합니다. Initial grade는 0에서 100 (inclusive) 사이인 경우에만 설정해야 하며, otherwise 0으로 default합니다.
    • 현재 grade를 반환하는 getter Grade() float64
    • 학생 ID를 반환하는 getter StudentID() string
    • 새 값이 0에서 100 (inclusive) 사이인 경우에만 grade를 업데이트하는 setter SetGrade(newGrade float64) bool. grade가 업데이트되면 true를, otherwise false를 반환합니다.
    • 다음 Format을 반환하는 method Summary() string: [Name] (ID: [studentID]) - Grade: [grade]
  • main.go: 입력에서 학생 information을 읽고, constructor를 사용하여 학생을 Create한 다음 grade 작업을 수행합니다. creation 후와 각 grade 업데이트 Attempt 후에 학생의 요약을 표시합니다.

다음 입력이 제공됩니다:

  • Line 1: 학생 이름
  • Line 2: 학생 ID
  • Line 3: Initial grade
  • Line 4: 설정할 first new grade
  • Line 5: 설정할 두 번째 새 grade

학생을 creation한 후 해당 학생의 요약을 Print합니다. 그런 다음 각 grade 업데이트를 Attempt하고, 성공하면 업데이트된 요약을 Print합니다. 거부되면 Invalid grade rejected를 Print합니다. 모든 grade 값은 소수점 이하 두 places로 Format합니다.

예를 들어 Emma Wilson, STU001, 85.5, 92.0, 150이 주어지면 출력은 다음과 같아야 합니다:

Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejected

150은 유효한 범위 밖에 있으므로 마지막 업데이트가 실패합니다. setter method가 이 규칙을 적용하여 학생의 data가 유효한 상태로 유지되도록 합니다. studentIDgrade에 직접 접근할 수 없다는 점에 주목하세요. 외부 코드는 이 보호된 data와 상호 작용하기 위해 getter 및 setter method를 사용해야 합니다.

직접 해보기

package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)

	// 학생 이름 읽기
	name, _ := reader.ReadString('\n')
	name = strings.TrimSpace(name)

	// 학생 ID 읽기
	id, _ := reader.ReadString('\n')
	id = strings.TrimSpace(id)

	// 초기 성적 읽기
	initialGradeStr, _ := reader.ReadString('\n')
	initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)

	// 첫 번째 새 성적 읽기
	newGrade1Str, _ := reader.ReadString('\n')
	newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)

	// 두 번째 새 성적 읽기
	newGrade2Str, _ := reader.ReadString('\n')
	newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)

	// TODO: NewStudent 생성자를 사용하여 새 학생 생성

	// TODO: 생성 후 학생의 요약 출력

	// TODO: 첫 번째 성적 업데이트 시도
	// 성공하면 업데이트된 요약 출력
	// If rejected, print "Invalid grade rejected"

	// TODO: 두 번째 성적 업데이트 시도
	// 성공하면 업데이트된 요약 출력
	// If rejected, print "Invalid grade rejected"

	// Hint: Summary()에서 성적을 포맷팅할 때 fmt.Sprintf와 %.2f를 사용하세요
	_ = newGrade1 // 변수를 사용할 때 이 줄을 제거하세요
	_ = newGrade2 // 변수를 사용할 때 이 줄을 제거하세요
}

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

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