Book 및 User 구조체
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 99번째.
챌린지
쉬움Library Management System의 핵심 데이터 모델을 만들어 봅시다! 책과 library 회원을 나타내는 기반 struct를 만들고, 합리적인 기본값으로 초기화하는 constructor function도 함께 작성합니다.
코드를 세 개의 파일로 구성합니다:
book.go:ID,Title,Author,ISBN,Available(boolean) 필드를 포함하는Bookstruct를 Define합니다. ID, title, author, ISBN을parameters로 받아 새로운 Book에 대한 pointer를 반환하는NewBookconstructor function을 Create합니다. 새로운 책은 항상 available 상태로 시작해야 합니다. 책의 details를 다음 Format으로 반환하는Info()method를 Add합니다:[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]user.go:ID,Name,Email,BorrowedBooks(book IDs를 저장하는 string slice) 필드를 포함하는Userstruct를 Define합니다. ID, name, email을 받아 빈 borrowed books 목록을 가진 새로운 User에 대한 pointer를 반환하는NewUserconstructor를 Create합니다. 다음을 반환하는Info()method를 Add합니다:Member: [Name] ([Email]) - Books borrowed: [count]main.go: input으로부터 books와 users를 Create한 다음 해당 information을 표시하여 모델을 함께 사용합니다.book의 number를 읽은 다음, 각 book에 대해 ID, title, author, ISBN을 각각 별도의 줄에서 읽습니다. 다음으로 user의 number를 읽고, 각 user에 대해 ID, name, email을 각각 별도의 줄에서 읽습니다.
각 book의 info를 한 줄에 하나씩 Print한 다음, 각 user의 info를 한 줄에 하나씩 Print합니다.
다음 input이 제공됩니다:
- book의 number
- 각 book에 대해: ID, title, author, ISBN(각각 별도의 줄)
- user의 number
- 각 user에 대해: ID, name, email(각각 별도의 줄)
예를 들어, 다음이 주어졌을 때:
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: 0constructor가 기본값을 어떻게 처리하는지 확인하세요. 책은 available 상태로 시작하고, user는 빌린 책이 0개인 상태로 시작합니다. 적절한 초기화를 보장하기 위해 constructor function을 사용하는 이 패턴은 신뢰할 수 있는 시스템을 구축하는 데 기본이 됩니다!
직접 해보기
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: 책을 저장할 슬라이스 생성
// 각 책의 상세 정보 읽기
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 생성자를 사용해 새 책을 만들고 슬라이스에 추가
}
// 사용자 수를 읽기
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: 사용자를 저장할 슬라이스 생성
// 각 사용자의 상세 정보 읽기
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 생성자를 사용해 새 사용자를 만들고 슬라이스에 추가
}
// TODO: Info() 메서드를 사용해 각 책의 정보 출력
// TODO: Info() 메서드를 사용해 각 사용자의 정보 출력
fmt.Println() // 플레이스홀더 - 구현 시 제거
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러