Menu
CoddyTech

도서와 회원

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

이 프로젝트에서는 도서관 시스템의 핵심을 만듭니다. Library 클래스는 한 줄에 하나씩 명령을 받아 각각에 응답합니다. 다섯 단계를 거치며 책과 회원을 추가하고, 책을 대출하고 반납하고, 도서 목록을 검색하고 보고서를 출력하는 방법을 배웁니다.

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

데이터 모델은 이 섹션의 도구를 사용합니다. Book은 구조체입니다. borrower가 변경되는 값입니다. Member는 클래스입니다. 도서관과 회원의 대출 목록이 동일한 사람을 참조하기 때문입니다. 도서관은 둘 다 비공개 딕셔너리에 보관하므로, 메서드만 이를 변경할 수 있습니다:

struct Book {
    let id: Int
    let title: String
    var borrower: String? = nil
    var isAvailable: Bool { borrower == nil }
}

var books: [Int: Book] = [:]
books[1] = Book(id: 1, title: "Dune")
books[1]!.borrower = "ada"
print(books[1]!.isAvailable)

출력:

false

handle(_:)은 명령을 분리하고 첫 번째 단어에 따라 분기합니다. 각 분기는 응답을 배열로 반환하므로, REPORT와 같은 명령은 여러 줄로 응답할 수 있습니다. 책 제목에는 공백이 포함될 수 있으므로, id 뒤에 오는 모든 내용이 제목입니다:

let p = "ADD_BOOK 7 The Hobbit".split(separator: " ").map(String.init)
let id = Int(p[1])!
let title = p.dropFirst(2).joined(separator: " ")
print("\(id): \(title)")

출력:

7: The Hobbit
challenge icon

챌린지

쉬움

처음 두 명령에 대해 Library.handle(_:)를 완성하세요.

  • ADD_BOOK <id> <title>: 새 책을 대출 가능한 상태로 저장하고 added book 1: Dune라고 응답합니다. id가 이미 사용 중이면 book 1 exists라고 응답합니다.
  • JOIN <name>: 회원을 추가하고 welcome ada라고 응답합니다. 이름이 이미 존재하면 ada is already a member라고 응답합니다.

제공된 코드는 각 입력 줄을 library.handle(_:)에 전달하고, 반환된 각 응답을 별도의 줄에 출력합니다. 회원 이름은 소문자 한 단어이며, 책 id는 정수입니다. 입력에는 지금까지 설명한 명령만 포함됩니다. 그 밖의 명령에는 unknown command라고 응답합니다.

코드는 Book.swift, Member.swift, Library.swift에 작성합니다. main.swift에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.

직접 해보기

// 제공된 입출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
let library = Library()
for line in input {
    for reply in library.handle(line) { print(reply) }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

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

직접 연습해 보세요: Swift 플레이그라운드