Book 및 User 구조체
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 99번째.
챌린지
쉬움도서 관리 시스템을 위한 핵심 데이터 모델을 구축해 봅시다! 도서와 도서관 회원을 나타내는 기본 구조체(struct)를 만들고, 이를 합리적인 기본값으로 초기화하는 생성자 함수를 작성하게 됩니다.
코드는 다음 세 개의 파일로 구성합니다:
book.go:ID,Title,Author,ISBN, 그리고Available(불리언) 필드를 가진Book구조체를 정의하세요. ID, 제목, 저자, ISBN을 매개변수로 받아 새로운 Book에 대한 포인터를 반환하는NewBook생성자 함수를 만드세요. 새 도서는 항상 대출 가능(available) 상태로 시작해야 합니다. 도서의 상세 정보를[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]형식으로 반환하는Info()메서드를 추가하세요.user.go:ID,Name,Email, 그리고BorrowedBooks(도서 ID를 저장하는 문자열 슬라이스) 필드를 가진User구조체를 정의하세요. ID, 이름, 이메일을 받아 빈 대출 도서 목록을 가진 새로운 User에 대한 포인터를 반환하는NewUser생성자를 만드세요.Member: [Name] ([Email]) - Books borrowed: [count]형식을 반환하는Info()메서드를 추가하세요.main.go: 입력으로부터 도서와 사용자를 생성하고 그 정보를 표시하여 모델들을 하나로 결합합니다.도서의 수를 읽은 다음, 각 도서에 대해 ID, 제목, 저자, ISBN을 별도의 줄에서 읽으세요. 그 다음, 사용자의 수를 읽고, 각 사용자에 대해 ID, 이름, 이메일을 별도의 줄에서 읽으세요.
각 도서의 정보를 각각 한 줄씩 출력하고, 이어서 각 사용자의 정보를 각각 한 줄씩 출력하세요.
다음과 같은 입력이 제공됩니다:
- 도서의 수
- 각 도서별: ID, 제목, 저자, ISBN (각각 별도의 줄)
- 사용자의 수
- 각 사용자별: ID, 이름, 이메일 (각각 별도의 줄)
예를 들어, 다음과 같이 입력되면:
2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com출력은 다음과 같아야 합니다:
[B001] "The Go Programming Language" by Alan Donovan (ISBN: 978-0134190440) - Available: true
[B002] "Clean Code" by Robert Martin (ISBN: 978-0132350884) - Available: true
Member: Alice Smith (alice@library.com) - Books borrowed: 0그리고 다음과 같이 입력되면:
1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com출력은 다음과 같아야 합니다:
[B100] "Design Patterns" by Gang of Four (ISBN: 978-0201633610) - Available: true
Member: Bob Jones (bob@email.com) - Books borrowed: 0
Member: Carol White (carol@email.com) - Books borrowed: 0생성자가 기본값을 어떻게 처리하는지 확인해 보세요. 도서는 대출 가능 상태로 시작하고 사용자는 대출된 도서가 0권인 상태로 시작합니다. 적절한 초기화를 보장하기 위해 생성자 함수를 사용하는 이 패턴은 신뢰할 수 있는 시스템을 구축하는 데 필수적입니다!
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 책의 권수 읽기
numBooksStr, _ := reader.ReadString('\n')
numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))
// TODO: 책을 저장할 slice 생성
// 각 책의 상세 정보 읽기
for i := 0; i < numBooks; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
author, _ := reader.ReadString('\n')
author = strings.TrimSpace(author)
isbn, _ := reader.ReadString('\n')
isbn = strings.TrimSpace(isbn)
// TODO: NewBook 생성자를 사용하여 새 책을 생성하고 slice에 추가
}
// 사용자 수 읽기
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: 사용자를 저장할 slice 생성
// 각 사용자의 상세 정보 읽기
for i := 0; i < numUsers; i++ {
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
// TODO: NewUser 생성자를 사용하여 새 사용자를 생성하고 slice에 추가
}
// TODO: Info() 메서드를 사용하여 각 책의 정보 출력
// TODO: Info() 메서드를 사용하여 각 사용자의 정보 출력
fmt.Println() // 자리 표시자 - 구현 시 제거
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서