Menu
Coddy logo textTech

Interface를 활용한 검색

Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 101번째.

challenge icon

챌린지

쉬움

도서 관리 시스템에 유연한 검색 기능을 추가해 봅시다! 인터페이스를 사용하여 전략(Strategy) 패턴을 구현함으로써, 핵심 라이브러리 코드를 수정하지 않고도 사용자가 다양한 기준으로 도서를 검색할 수 있도록 만들 것입니다.

코드는 다음 다섯 개의 파일로 구성됩니다:

  • book.go: 이전 레슨에서 작성한 ID, Title, Author, ISBN, Available 필드를 가진 Book 구조체입니다. 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들을 쉼표로 구분하여 출력하세요. 일치하는 도서가 없으면 대신 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,B002

Search 메서드가 어떻게 어떤 전략과도 작동하는지 주목해 보세요. 이 메서드는 제목, 저자, 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에 따라 적절한 검색 전략(strategy) 선택
		// 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 // 솔루션을 구현할 때 이 라인을 제거하십시오
	}
}

객체 지향 프로그래밍의 모든 레슨