요약 - 학생 기록
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 51번째.
챌린지
쉬움적절한 캡슐화를 보여주는 학생 기록 시스템을 구축해 보겠습니다. 민감한 학업 데이터는 보호하면서 잘 설계된 메서드를 통해 제어된 접근을 제공하는 학생 관리 구조를 만들게 됩니다.
코드는 두 개의 파일로 구성됩니다:
student.go: 안전한 공개 데이터는 노출하면서 민감한 정보는 보호하는Student구조체를 만듭니다. 학생의Name은 내보내기(공개적으로 접근 가능)되어야 하지만,grade(float64)와studentID(string)는 이 민감한 정보를 보호하기 위해 내보내지 않아야 합니다.다음 사항들을 구현하세요:
- 학생을 생성하는 생성자
NewStudent(name, id string, initialGrade float64) *Student. 초기 성적은 0에서 100 사이(포함)인 경우에만 설정되어야 하며, 그렇지 않으면 기본값 0으로 설정됩니다. - 현재 성적을 반환하는 게터(getter)
Grade() float64 - 학생 ID를 반환하는 게터
StudentID() string - 새 값이 0에서 100 사이(포함)인 경우에만 성적을 업데이트하는 세터(setter)
SetGrade(newGrade float64) bool. 성적이 업데이트되면true를, 그렇지 않으면false를 반환합니다. [Name] (ID: [studentID]) - Grade: [grade]형식의 문자열을 반환하는 메서드Summary() string
- 학생을 생성하는 생성자
main.go: 입력에서 학생 정보를 읽고, 생성자를 사용하여 학생을 생성한 다음 성적 작업을 수행합니다. 생성 후와 각 성적 업데이트 시도 후에 학생의 요약 정보를 표시합니다.
다음 입력이 제공됩니다:
- 줄 1: 학생 이름
- 줄 2: 학생 ID
- 줄 3: 초기 성적
- 줄 4: 설정할 첫 번째 새 성적
- 줄 5: 설정할 두 번째 새 성적
학생을 생성한 후, 요약 정보를 출력하세요. 그런 다음 각 성적 업데이트를 시도합니다. 성공하면 업데이트된 요약 정보를 출력하고, 거부되면 Invalid grade rejected를 출력하세요. 모든 성적 값은 소수점 둘째 자리까지 형식을 맞추어 출력합니다.
예를 들어, 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이 유효 범위를 벗어나기 때문에 실패합니다. 여러분의 세터 메서드는 이 규칙을 강제하여 학생의 데이터를 유효하게 유지합니다. studentID와 grade가 직접 접근되지 않는 점에 주목하세요. 외부 코드는 이 보호된 데이터와 상호 작용하기 위해 반드시 여러분이 만든 게터와 세터 메서드를 사용해야 합니다.
직접 해보기
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: 첫 번째 성적 업데이트 시도
// 성공하면 업데이트된 요약 정보 출력
// 거부되면 "Invalid grade rejected" 출력
// TODO: 두 번째 성적 업데이트 시도
// 성공하면 업데이트된 요약 정보 출력
// 거부되면 "Invalid grade rejected" 출력
// 힌트: Summary()에서 성적 형식을 지정하려면 %.2f와 함께 fmt.Sprintf를 사용하세요
_ = newGrade1 // 변수를 사용할 때 이 줄을 제거하세요
_ = newGrade2 // 변수를 사용할 때 이 줄을 제거하세요
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서