JAVAの初心者向け問題4-☆2:図書館管理システムを作ろうpart2
この問題を解くために必要な知識:
【レベル1~3の知識】
コメントの書き方、変数と定数、基本データ型とプリミティブ型、四則演算と論理演算、入力と出力(Scannerクラス)、配列、分岐処理(if、if~else、switch)、繰り返し処理(for、while、do~while)、メソッドの定義と呼び出し、メソッドの戻り値、メソッドのオーバーロード、例外処理(try-catch文、throws、throw)、クラスの定義と使用、インスタンス、コンストラクタ、コレクションの基礎、コレクション(List, ArrayList)、コレクション(HashSet, TreeSet)、コレクション(HashMap, TreeMap)
【レベル4の知識】
ゲッターとセッター、カプセル化、クラスメンバ、インスタンスメソッド、クラスの継承、抽象クラス、インターフェース
<<前の問題 | 問題集Top |
次の問題>> |
JAVA練習問題4-☆2:図書館管理システムを作ろうpart2
インターフェースと抽象クラスを使用して図書館の書籍管理システムを作成しましょう。
このシステムはユーザーが入力した本のタイトルと著者を管理し、かつ全ての書籍情報を表示する機能を持ちます。
この問題の要件
以下の要件に従った作成して下さい。
- 書籍情報(タイトルと著者)を管理する抽象クラス
Book
を定義してください。 - 書籍情報を表示するメソッドを含むインターフェース
Displayable
を定義してください。 Book
を継承し、Displayable
を実装するLibraryBook
クラスを作成してください。LibraryBook
クラスには書籍情報を表示するdisplay
メソッドを実装してください。- 書籍を管理する
Library
クラスを作成し、書籍の追加と表示の機能を実装してください。 - ユーザーからの入力を受け付けて書籍を追加し、追加された書籍の一覧を表示してください。
ただし、以下のような実行結果となること。
----- ↓出力される結果の例↓ -----
新しい書籍を追加しますか? (yes/no): yes タイトル: Java入門 著者: 山田太郎 新しい書籍を追加しますか? (yes/no): yes タイトル: Pythonの基礎 著者: 佐藤花子 新しい書籍を追加しますか? (yes/no): no 追加された書籍一覧: タイトル: Java入門, 著者: 山田太郎 タイトル: Pythonの基礎, 著者: 佐藤花子
----- ↑出力される結果の例↑ -----
この問題を解くヒント
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
正解のコードは上から順に以下のような構成となっています。
1.import文
1-1. ArrayListクラスのインポート
1-2. Scannerクラスのインポート
2.抽象クラス Bookの定義
2-1. フィールド titleとauthorの定義
2-1-1. titleフィールドの宣言
2-1-2. authorフィールドの宣言
2-2. コンストラクタの定義
2-2-1. titleフィールドの初期化
2-2-2. authorフィールドの初期化
2-3. タイトルを取得するゲッターメソッドgetTitleの定義
2-4. 著者を取得するゲッターメソッドgetAuthorの定義
2-5. 抽象メソッドdisplayの宣言
3.インターフェース Displayableの定義
3-1. displayメソッドの宣言
4.具象クラス LibraryBookの定義
4-1. Bookクラスの継承とDisplayableインターフェースの実装
4-2. コンストラクタの定義
4-2-1. スーパークラスBookのコンストラクタを呼び出す
4-3. displayメソッドのオーバーライド
4-3-1. タイトルと著者の情報を表示する
5.図書館クラス Libraryの定義
5-1. フィールド booksの定義
5-1-1. ArrayList<LibraryBook> booksフィールドの宣言
5-2. コンストラクタの定義
5-2-1. booksフィールドの初期化
5-3. 書籍を追加するメソッドaddBookの定義
5-3-1. ArrayListに書籍を追加
5-4. 全ての書籍を表示するメソッドshowBooksの定義
5-4-1. ループで全書籍のdisplayメソッドを呼び出す
6.LibraryManagementSystemクラスの定義
6-1. mainメソッドの定義
6-1-1. Scannerオブジェクトの作成
6-1-2. Libraryオブジェクトの作成
6-1-3. ユーザー入力を受け付けるループ
6-1-3-1. ユーザーに新しい書籍の追加を尋ねる
6-1-3-2. 書籍情報の入力
6-1-3-2-1. タイトルの入力
6-1-3-2-2. 著者の入力
6-1-3-3. 入力された書籍情報を元にLibraryBookオブジェクトを作成し追加
6-1-3-4. ユーザーが「no」と答えた場合ループを終了
6-1-4. 追加された書籍の表示
6-2. Scannerオブジェクトのクローズ
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
import java.util.ArrayList; import java.util.Scanner; // 抽象クラス Book abstract class Book { private String title; private String author; // コンストラクタ public Book(String title, String author) { ***ここにコンストラクタのコードを書いてください*** } // タイトルを取得するゲッター public String getTitle() { ***ここにタイトルを取得するゲッターのコードを書いてください*** } // 著者を取得するゲッター public String getAuthor() { ***ここに著者を取得するゲッターのコードを書いてください*** } // 書籍情報を表示する抽象メソッド public abstract void display(); } // インターフェース Displayable interface Displayable { void display(); } // 具象クラス LibraryBook class LibraryBook extends Book implements Displayable { // コンストラクタ public LibraryBook(String title, String author) { ***ここにLibraryBookのコンストラクタのコードを書いてください*** } // display メソッドの実装 @Override public void display() { ***ここにdisplayメソッドの実装コードを書いてください*** } } // 図書館クラス class Library { private ArrayList<LibraryBook> books; // コンストラクタ public Library() { ***ここにLibraryのコンストラクタのコードを書いてください*** } // 書籍を追加するメソッド public void addBook(LibraryBook book) { ***ここに書籍を追加するメソッドのコードを書いてください*** } // 全ての書籍を表示するメソッド public void showBooks() { ***ここに全ての書籍を表示するメソッドのコードを書いてください*** } } public class LibraryManagementSystem { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Library library = new Library(); // ユーザーからの入力を受け付ける while (true) { System.out.println("新しい書籍を追加しますか? (yes/no): "); String response = scanner.next(); if (response.equalsIgnoreCase("no")) { break; } // 書籍情報の入力 System.out.print("タイトル: "); String title = scanner.next(); System.out.print("著者: "); String author = scanner.next(); // 書籍を追加 LibraryBook book = new LibraryBook(title, author); ***ここに書籍を追加するコードを書いてください*** } // 追加された書籍の表示 System.out.println("追加された書籍一覧:"); ***ここに追加された書籍を表示するコードを書いてください*** } }
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例
この問題の一つの正解例とそのコードの解説を以下に示します。
正解コードの例
例えば以下のようなプログラムが考えられます。
********************
import java.util.ArrayList; import java.util.Scanner; // 抽象クラス Book abstract class Book { private String title; private String author; // コンストラクタ public Book(String title, String author) { this.title = title; this.author = author; } // タイトルを取得するゲッター public String getTitle() { return title; } // 著者を取得するゲッター public String getAuthor() { return author; } // 書籍情報を表示する抽象メソッド public abstract void display(); } // インターフェース Displayable interface Displayable { void display(); } // 具象クラス LibraryBook class LibraryBook extends Book implements Displayable { // コンストラクタ public LibraryBook(String title, String author) { super(title, author); } // display メソッドの実装 @Override public void display() { System.out.println("タイトル: " + getTitle() + ", 著者: " + getAuthor()); } } // 図書館クラス class Library { private ArrayList<LibraryBook> books; // コンストラクタ public Library() { books = new ArrayList<LibraryBook>(); } // 書籍を追加するメソッド public void addBook(LibraryBook book) { books.add(book); } // 全ての書籍を表示するメソッド public void showBooks() { for (LibraryBook book : books) { book.display(); } } } public class LibraryManagementSystem { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Library library = new Library(); // ユーザーからの入力を受け付ける while (true) { System.out.println("新しい書籍を追加しますか? (yes/no): "); String response = scanner.next(); if (response.equalsIgnoreCase("no")) { break; } // 書籍情報の入力 System.out.print("タイトル: "); String title = scanner.next(); System.out.print("著者: "); String author = scanner.next(); // 書籍を追加 LibraryBook book = new LibraryBook(title, author); library.addBook(book); } // 追加された書籍の表示 System.out.println("追加された書籍一覧:"); library.showBooks(); } }
********************
コードの解説
このコードを理解することで、オブジェクト指向プログラミングや抽象クラス、インターフェースの基本的な概念に触れることができます。
抽象クラス Book
abstract class Book { private String title; private String author; // コンストラクタ public Book(String title, String author) { this.title = title; this.author = author; } // タイトルを取得するゲッター public String getTitle() { return title; } // 著者を取得するゲッター public String getAuthor() { return author; } // 書籍情報を表示する抽象メソッド public abstract void display(); }
- ここでは、
Book
という抽象クラスが定義されています。抽象クラスとは、インスタンス化(newでオブジェクトを作成すること)ができないクラスであり、他のクラスで継承されて使われます。 title
とauthor
は書籍のタイトルと著者名を表すフィールドで、プライベートアクセス修飾子によって外部から直接アクセスできないように保護されています。getTitle()
やgetAuthor()
は、それぞれ書籍のタイトルと著者名を取得するためのメソッドです(ゲッター)。display()
メソッドは抽象メソッドとして定義されています。これは、Book
を継承したクラスで具体的に実装する必要があるという意味です。
インターフェース Displayable
interface Displayable { void display(); }
- インターフェースは、クラスが実装すべきメソッドを定義するための仕組みです。
Displayable
はdisplay()
メソッドを持ち、このインターフェースを実装するクラスは必ずこのメソッドを実装する必要があります。 - インターフェースを使うことで、複数のクラスが共通のメソッドを持つことを保証できます。
クラス LibraryBook
class LibraryBook extends Book implements Displayable { // コンストラクタ public LibraryBook(String title, String author) { super(title, author); } // display メソッドの実装 @Override public void display() { System.out.println("タイトル: " + getTitle() + ", 著者: " + getAuthor()); } }
LibraryBook
クラスは、Book
クラスを継承し、Displayable
インターフェースを実装しています。super(title, author)
は、スーパークラス(Book
クラス)のコンストラクタを呼び出しています。これにより、LibraryBook
のオブジェクトを作成するときに、タイトルと著者名を設定できます。display()
メソッドは、Book
クラスで定義された抽象メソッドを具象クラスとして実装しています。このメソッドは、タイトルと著者を表示する役割を果たします。
図書館クラス Library
class Library { private ArrayList<LibraryBook> books; // コンストラクタ public Library() { books = new ArrayList<LibraryBook>(); } // 書籍を追加するメソッド public void addBook(LibraryBook book) { books.add(book); } // 全ての書籍を表示するメソッド public void showBooks() { for (LibraryBook book : books) { book.display(); } } }
Library
クラスは図書館を表しています。このクラスは、LibraryBook
オブジェクトを格納するリストを持っています。addBook()
メソッドは、書籍をリストに追加する機能を提供します。showBooks()
メソッドは、リストに追加された全ての書籍の情報を表示します。ここで、LibraryBook
のdisplay()
メソッドが呼び出されています。
メインクラス LibraryManagementSystem
public class LibraryManagementSystem { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Library library = new Library(); // ユーザーからの入力を受け付ける while (true) { System.out.println("新しい書籍を追加しますか? (yes/no): "); String response = scanner.next(); if (response.equalsIgnoreCase("no")) { break; } // 書籍情報の入力 System.out.print("タイトル: "); String title = scanner.next(); System.out.print("著者: "); String author = scanner.next(); // 書籍を追加 LibraryBook book = new LibraryBook(title, author); library.addBook(book); } // 追加された書籍の表示 System.out.println("追加された書籍一覧:"); library.showBooks(); } }
LibraryManagementSystem
クラスのmain
メソッドは、プログラムのエントリーポイントです。- ユーザーに書籍のタイトルと著者を入力させ、その情報を基に新しい
LibraryBook
オブジェクトを作成して図書館に追加します。 while
ループを使って複数の書籍を追加することができます。ユーザーがno
と入力するまで、書籍の追加が繰り返されます。- 最後に、追加された全ての書籍を
library.showBooks()
メソッドで表示します。
<<前の問題 |
問題集Top |
次の問題>> |
この問題への質問・コメント
この問題を作成するにあたりAIを活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。