요약 - 학생 기록
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 51번째.
챌린지
쉬움적절한 캡슐화를 보여 주는 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) *Studentconstructor는 학생을 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를, otherwisefalse를 반환합니다. - 다음 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 rejected150은 유효한 범위 밖에 있으므로 마지막 업데이트가 실패합니다. setter method가 이 규칙을 적용하여 학생의 data가 유효한 상태로 유지되도록 합니다. studentID와 grade에 직접 접근할 수 없다는 점에 주목하세요. 외부 코드는 이 보호된 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 // 변수를 사용할 때 이 줄을 제거하세요
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러