Menu
Coddy logo textTech

Interface를 활용한 검색

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

challenge icon

챌린지

쉬움

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,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에 따라 적절한 검색 전략 선택
		// 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 // 솔루션을 구현할 때 이 줄을 제거하세요
	}
}

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

직접 연습해 보세요: 온라인 Go 컴파일러