Interface를 활용한 검색
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 101번째.
챌린지
쉬움Library Management System에 유연한 검색 기능을 추가해 봅시다! 인터페이스를 사용하여 Strategy 패턴을 구현하면, 핵심 라이브러리 코드를 수정하지 않고도 사용자가 다양한 기준으로 책을 검색할 수 있습니다.
코드를 다섯 개의 파일로 구성합니다:
book.go: 이전 수업에서 작성한Book구조체로,ID,Title,Author,ISBN,Available필드를 포함합니다.NewBook생성자도 포함하세요.user.go:ID,Name,Email,BorrowedBooks필드를 포함하는User구조체입니다.NewUser생성자도 포함하세요.search.go: 검색 전략 인터페이스와 구현을 정의합니다.다음 단일 메서드를 포함하는
SearchStrategy인터페이스를 생성하세요:Match(book *Book, query string) bool세 가지 검색 전략을 구현하세요:
TitleSearch: 책의 제목에 검색어가 포함되어 있으면 일치합니다(대소문자 구분 없음).AuthorSearch: 책의 저자에 검색어가 포함되어 있으면 일치합니다(대소문자 구분 없음).ISBNSearch: 책의 ISBN이 검색어와 정확히 같으면 일치합니다.
library.go: 책과 사용자를 위한 맵을 포함하는Library구조체입니다. 모든SearchStrategy와 검색어 문자열을 받아 일치하는 책 포인터의 슬라이스를 반환하는Search메서드를 추가하세요. 이 메서드는 모든 책을 순회하면서 전략의Match메서드를 사용해 결과를 찾아야 합니다.main.go: 책이 포함된 라이브러리를 만든 다음, 다양한 전략을 사용하여 검색을 수행합니다.책의 수를 읽은 다음, 각 책에 대해 ID, 제목, 저자, ISBN을 읽습니다. 다음으로 검색 작업의 수를 읽습니다. 각 작업은 검색 유형(
title,author또는isbn)과 검색어 문자열로 구성됩니다.각 검색에 대해
Search by [type]: [query]를 출력하고, 다음 줄에 일치하는 책 ID를 오름차순으로 정렬하여 쉼표로 구분해 출력합니다(맵은 임의의 순서로 순회되므로 출력하기 전에 ID를 정렬해야 합니다). 일치하는 책이 없으면 대신No results를 출력합니다.
다음 입력이 제공됩니다:
- 책의 수, 이어서 각 책의 ID, 제목, 저자, ISBN(각각 별도의 줄)
- 검색 수, 이어서 각 검색 유형과 검색어(각각 별도의 줄)
예를 들어 다음이 주어졌을 때:
3
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Go in Action
William Kennedy
978-1617291784
B003
Learning Python
Mark Lutz
978-1449355739
3
title
go
author
kennedy
isbn
978-1449355739출력은 다음과 같아야 합니다:
Search by title: go
B001,B002
Search by author: kennedy
B002
Search by isbn: 978-1449355739
B003또한 다음이 주어졌을 때:
2
B001
Clean Code
Robert Martin
978-0132350884
B002
The Pragmatic Programmer
David Thomas
978-0135957059
2
title
java
author
martin출력은 다음과 같아야 합니다:
Search by title: java
No results
Search by author: martin
B001또한 다음이 주어졌을 때:
2
B001
Design Patterns
Gang of Four
978-0201633610
B002
Head First Design Patterns
Eric Freeman
978-0596007126
1
title
design출력은 다음과 같아야 합니다:
Search by title: design
B001,B002Search 메서드가 어떤 전략과도 함께 작동하는 방식에 주목하세요. 이 메서드는 제목, 저자 또는 ISBN 중 무엇을 검색하는지 알 필요가 없습니다. 이러한 다형적 접근 방식을 사용하면 SearchStrategy를 구현하는 새로운 구조체를 만들기만 하여 새로운 검색 유형(예: 대여 가능 여부나 출판 연도에 따른 검색)을 간단히 추가할 수 있습니다!
직접 해보기
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))
// 도서관 생성
library := NewLibrary()
// 각 책의 세부 정보 읽기
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)
book := NewBook(id, title, author, isbn)
library.AddBook(book)
}
// 검색 횟수 읽기
numSearchesStr, _ := reader.ReadString('\n')
numSearches, _ := strconv.Atoi(strings.TrimSpace(numSearchesStr))
// 각 검색 처리
for i := 0; i < numSearches; i++ {
searchType, _ := reader.ReadString('\n')
searchType = strings.TrimSpace(searchType)
query, _ := reader.ReadString('\n')
query = strings.TrimSpace(query)
// TODO: searchType에 따라 적절한 검색 전략 선택
// searchType은 "title", "author", 또는 "isbn"일 수 있음
var strategy SearchStrategy
// TODO: 여기에 전략 선택 로직 구현
// TODO: library.Search(strategy, query)를 사용하여 검색 수행
// TODO: 결과를 필수 형식으로 출력
// 형식: "Search by [type]: [query]" 다음에 일치하는 ID 또는 "No results"
fmt.Printf("Search by %s: %s\n", searchType, query)
// TODO: 일치하는 책 ID를 쉼표로 구분하여 출력하거나 "No results"
_ = strategy // 솔루션을 구현할 때 이 줄을 제거하세요
}
}
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러