5 Commits

Author SHA1 Message Date
8ecb68ed34 追加課題(登録処理まで完了) 2026-10-20 16:49:38 +09:00
96dcc745d8 10/20_9段階完了 2026-10-20 14:38:13 +09:00
82628fc7f5 10/15作業分 2026-10-15 16:30:26 +09:00
4b2cb5a18b 修正 2026-10-14 16:46:15 +09:00
2b4e19fae2 10/14 開発課題 2026-10-14 16:37:20 +09:00
67 changed files with 1687 additions and 1392 deletions

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21"/>
<classpathentry kind="src" path="src/main/java"/>
<classpathentry kind="output" path="build/classes"/>
</classpath>

3
.gitignore vendored
View File

@@ -1,2 +1 @@
/bin/
/build/
実行例(追加問題含め)/em_oop.jar

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<installed facet="java" version="21"/>
</faceted-project>

27
BasicCheck1.java Normal file
View File

@@ -0,0 +1,27 @@
package misson1014;
public class BasicCheck1 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
//コンストラクタ
Book book1 = new Book();
//book1
System.out.println(book1.title);
System.out.println(book1.author);
System.out.println(book1.price);
//コンストラクタ
Book book2 = new Book(
"銀河鉄道の夜",
"宮沢賢治",
500);
//book2
System.out.println(book2.title);
System.out.println(book2.author);
System.out.println(book2.price);
}
}

23
BasicCheck2.java Normal file
View File

@@ -0,0 +1,23 @@
package misson1014;
public class BasicCheck2 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Student student1 = new Student(1, "鈴木一郎");
Student student2 = new Student(2, "田中花子");
Student student3 = new Student(3, "佐藤次郎");
// 学生情報表示
student1.printProfile();
student2.printProfile();
student3.printProfile();
// 現在の学生数表示
System.out.println(
"現在の生徒数:"
+ Student.getStudentCount()
+ "人");
}
}

37
BasicCheck3.java Normal file
View File

@@ -0,0 +1,37 @@
package misson1014;
public class BasicCheck3 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
// Item型の配列を作成
Item[] items = new Item[3];
//インスタンス生成
items[0] = new Item();
items[1] = new Item();
items[2] = new Item();
items[0].setName("ノート");
items[0].setPrice(120);
items[0].setStock(50);
items[1].setName("消しゴム");
items[1].setPrice(80);
items[1].setStock(30);
items[2].setName("鉛筆");
items[2].setPrice(60);
items[2].setStock(100);
//販売
for (int i = 0; i < items.length; i++) {
items[i].sell(5);
}
//商品情報表示
for (int i = 0; i < items.length; i++) {
System.out.println(items[i]);
}
}
}

28
Book.java Normal file
View File

@@ -0,0 +1,28 @@
package misson1014;
public class Book {
// タイトル
String title;
// 著者
String author;
// 価格
int price;
//コンストラクタ
public Book() {
this.title = "タイトル未設定";
this.author = "著者未設定";
this.price = 0;
}
//コンストラクタ
public Book(String title, String author, int price) {
//フィールド代入
this.title = title;
this.author = author;
this.price = price;
}
}

View File

@@ -1,388 +0,0 @@
# CUI_EM_OOP ミッション課題【2日目】コンストラクタ・カプセル化・static
## このミッションについて
このミッションは、最終的に **「社員メンテナンス(ファイルシステム版)」(CUI_EM_OOP)** を完成させることを目標にした、複数回に分かれたミッション課題の**2日目**です。
**前回(1日目)作成したプロジェクトのファイルを、そのまま引き続き使います。** 同じプロジェクトに追記・修正を加えていってください(`Book`、`Student`、`Item`、`EmployeeData`、`Main`、`BasicCheck1〜3`など)。
今日は、1日目に作った「まだ簡易版」のクラスたちを、今日習う道具を使って、完成形にぐっと近づけていきます。それでも、まだ以下の内容は習っていないため使いません。今後のミッションでさらにバージョンアップしていきます。
* 継承・多態性(`extends`、抽象クラス)
* コレクション(`ArrayList`など)
* 例外処理
* ファイルの読み書き
## 今日の講義内容
* コンストラクタ
* コンストラクタのオーバーロード
* メソッドのオーバーライド(`Object`クラスの`toString`など)
* アクセス修飾子
* ゲッター・セッター
* `static`、静的メンバ
## 基本の書き方(文法メモ)
今日はじめて出てくる書き方をまとめておきます。各段階で迷ったときは、ここに戻って確認してください。
### コンストラクタ
```java
public class クラス名 {
public クラス名() {
// インスタンスが作られたときに実行される処理(何もしなくてもOK)
}
public クラス名(型 引数名, 型 引数名) {
// 引数を使ってフィールドを設定する処理
}
}
```
* コンストラクタの名前は、**必ずクラス名とまったく同じ**にします。
* コンストラクタには**戻り値の型を書きません**(`void`も書きません)。ここがメソッドとの大きな違いです。
* `new クラス名();`と書けば引数なしのコンストラクタが、`new クラス名(値, 値);`のように引数を渡せば対応する引数ありのコンストラクタが呼ばれます。渡す引数の数や型によって、Javaが自動的にどちらを実行するか選んでくれます。これを**コンストラクタのオーバーロード**と呼びます。
* **注意**:Javaは本来、コンストラクタを1つも書かないクラスに対して「何もしない引数なしコンストラクタ」を自動的に用意してくれます。しかし、コンストラクタを1つでも自分で書くと、この自動生成は行われなくなります。そのため、引数なしでの生成もこれまで通り使いたい場合は、引数なしコンストラクタも自分で明示的に書く必要があります(5段階目で2つとも作るのはこのためです)。
### アクセス修飾子(`private`)
フィールドに`private`をつけると、そのフィールドは**自分のクラスの中からしか直接アクセスできなく**なります。クラスの外からは、これから作るゲッター・セッターというメソッドを経由してアクセスすることになります。
### ゲッター・セッターの命名ルール
* ゲッター:`get` + フィールド名(先頭を大文字にしたもの)というメソッド名にし、フィールドの値を`return`する。引数はなし。
* 例:フィールド`price`(`int`型) → `public int getPrice() { return this.price; }`
* セッター:`set` + フィールド名(先頭を大文字にしたもの)というメソッド名にし、引数で受け取った値をフィールドに代入する。戻り値は`void`。
* 例:フィールド`price`(`int`型) → `public void setPrice(int price) { this.price = price; }`
* 自分のクラスの中から自分のゲッター・セッターを呼び出すときは、`this.getPrice()`のように書いても、`this.`を省略して`getPrice()`のように書いても、どちらも同じ意味になります。
### `static`(静的メンバ)
フィールドやメソッドに`static`をつけると、そのフィールド・メソッドは**インスタンスごとではなく、クラス全体で1つだけ共有される**ものになります。
```java
public class クラス名 {
static 型 フィールド名;
public static 戻り値の型 メソッド名() {
return フィールド名;
}
}
```
呼び出すときは、インスタンス経由ではなく`クラス名.メソッド名()`のように、**クラス名から直接**呼び出します。
### メソッドのオーバーライドと`@Override`
すべてのクラスは、`Object`という共通のクラスを自動的に受け継いでいます(`extends`と書いていないクラスも、実は見えないところで`Object`を継承しています)。そのため、どのクラスも`toString`のようなメソッドを最初から持っています。この中身を自分のクラス用に書き直すことを**オーバーライド(Override)**と呼びます。
* オーバーライドするメソッドの前には`@Override`をつけましょう。これは「このメソッドは親のメソッドを上書きしていますよ」とJavaに伝えるための目印です。書き忘れても動作は変わりませんが、書いておくとメソッド名のスペルミスなどにJavaが気づいてくれるので、必ずつける習慣にしましょう。
* **重要**:`toString`は`Object`クラスの中で`public`として宣言されています。オーバーライドする側は、元のメソッドより公開範囲を狭くすることができないというルールがあるため、**オーバーライドする`toString`メソッドには必ず`public`をつけてください**(`public`をつけずに書くと、コンパイルエラーになります)。
### 「オーバーロード」と「オーバーライド」は別物です
名前が似ていて混同しやすいので、ここで整理しておきます。
* **オーバーロード(Overload)**:同じクラスの中に、同じ名前だけど引数の型や数が違うメソッド(コンストラクタ)を複数作ること。今日の`Book`のコンストラクタが例です。
* **オーバーライド(Override)**:親のクラス(`Object`など)がもともと持っているメソッドを、自分のクラスで上書きして中身を変えること。今日の`toString`が例です。
### `public`をつける習慣について
コンストラクタ・ゲッター・セッターは、特に指定がない限り`public`で宣言してください。今はすべてのクラスを同じ場所(パッケージ)に置いているので`public`をつけなくても動いてしまいますが、後日パッケージ分けをしたときに「他のクラスから呼び出せない」という問題が起きないよう、今のうちから`public`をつける習慣にしておきましょう。
## すすめかた
1. 1段階目から順番に取り組んでください。むずかしそうに見えても、飛ばさないでください。
2. 各段階の「お題」をよく読んで、「何を作るのか」を最初に理解してから手を動かしましょう。
3. コードが書けたら、必ず実行して**「実行例」と同じ結果になるか**確認しましょう。
4. わからない言葉が出てきたら、まず自分で調べてみましょう。調べてもわからないときは、講師に質問してください。
5. コピー&ペーストではなく、自分の手で入力して理解しましょう。
## 提出物
* 今日修正・作成した`.java`ファイル一式
---
## 【基礎確認ゾーン】1〜3段階目
このゾーンは、CUI_EM_OOPとは直接関係のない練習問題です。1日目に作った`Book`・`Item`・`Student`クラスを、今日習った道具でバージョンアップしながら、基本がしっかり身についているかを確認しましょう。
### 1段階目(Bookクラスにコンストラクタを作ろう)
**お題**
`Book`クラスに、コンストラクタを2つ(オーバーロード)追加してください。コンストラクタは2つとも`public`で宣言してください。
**<作成フローとポイント>**
1. `Book.java`に、以下の**引数なしコンストラクタ**を追加してください。
* `title`に`"タイトル未設定"`、`author`に`"著者未設定"`、`price`に`0`を代入する
2. `Book.java`に、以下の**3つの引数を持つコンストラクタ**を追加してください(1と合わせて2つのコンストラクタになります=コンストラクタのオーバーロード)。
* 引数:`String title, String author, int price`
* 処理:渡された3つの引数を、それぞれ対応するフィールドに代入する
3. `BasicCheck1.java`を修正し、`main`メソッドの中で以下を行ってください。
* 引数なしコンストラクタを使って`book1`を作成し、そのまま`title`・`author`・`price`を出力する
* 3つの引数を持つコンストラクタを使って、`book2`を`"銀河鉄道の夜"`・`"宮沢賢治"`・`500`で作成し、同様に出力する
**<実行例>**
```
タイトル未設定
著者未設定
0
銀河鉄道の夜
宮沢賢治
500
```
### 2段階目(Itemクラスをカプセル化し、toStringをオーバーライドしよう)
**お題**
`Item`クラスのフィールドを`private`にして、ゲッター・セッターを作成しましょう。また、`Object`クラスから受け継いでいる`toString`メソッドをオーバーライドしてみましょう。
**<作成フローとポイント>**
1. `Item.java`の3つのフィールド(`name`、`price`、`stock`)に、すべて`private`をつけてください。
2. 3つのフィールドそれぞれに、ゲッター・セッターを作成してください。
* `getName()` / `setName(String name)`
* `getPrice()` / `setPrice(int price)`
* `getStock()` / `setStock(int stock)`
3. `sell`メソッドの中身を、フィールドに直接アクセスする書き方(`this.stock = this.stock - amount;`)から、作成したゲッター・セッターを使う書き方に直してください。
* 例:`this.setStock(this.getStock() - amount);`
4. `Item.java`に、以下のメソッドを追加してください。
* アクセス修飾子:`public`(**必須**です。理由は冒頭の「基本の書き方(文法メモ)」を参照してください)
* `@Override`をつける
* メソッド名:`toString`
* 引数:なし
* 戻り値:`String`
* 中身:`getName() + " " + getPrice() + "円 (残り" + getStock() + "個)"` のような文字列を`return`する
5. `BasicCheck3.java`を修正してください。
* `items[i].name = ...`のようにフィールドへ直接代入していた箇所を、すべて`items[i].setName(...)`のようにセッター経由に書き換える
* 出力部分を、`System.out.println(items[i]);`のように、**オブジェクトをそのまま渡す形**に書き換える
* ※`System.out.println`は、渡されたオブジェクトの`toString`メソッドの戻り値を自動的に出力してくれます。
**<実行例>**
```
ノート 120円 (残り45個)
消しゴム 80円 (残り25個)
鉛筆 60円 (残り95個)
```
### 3段階目(Studentクラスにコンストラクタとstaticメンバを追加しよう)
**お題**
`Student`クラスにコンストラクタを追加し、「これまで何人の生徒が作られたか」を数える仕組みを`static`で作ってみましょう。
**<作成フローとポイント>**
1. `Student.java`に、以下のコンストラクタを追加してください。
* 引数:`int studentId, String name`
* 処理:渡された引数を、それぞれ対応するフィールドに代入する
2. `Student.java`に、以下の`static`フィールドを追加してください。
* `static int studentCount = 0;`(生徒が何人作られたかを数えるための、クラス全体で共有するフィールド)
3. 2で作ったコンストラクタの中で、`studentCount`を1増やす処理を追加してください(`studentCount++;`)。
4. `Student.java`に、以下の`static`メソッドを追加してください。
* メソッド名:`getStudentCount`
* 引数:なし
* 戻り値:`int`
* 中身:`studentCount`の値を`return`する
5. `BasicCheck2.java`を修正してください。
* コンストラクタを使って、`student1`(`1`, `"鈴木一郎"`)、`student2`(`2`, `"田中花子"`)、`student3`(`3`, `"佐藤次郎"`)の3人分のインスタンスを作成する
* それぞれの`printProfile`メソッドを呼び出す
* 最後に、`Student.getStudentCount()`のように**インスタンスではなくクラス名から直接**呼び出し、結果を`"現在の生徒数:" + 件数 + "人"`という形式で出力する
**<考え方のヒント>**
* `static`がついたフィールドやメソッドは、`this.name`のような個々のインスタンスが持つデータとは違い、**そのクラス全体で1つだけ共有される**データです。だからこそ、インスタンスを経由せず`Student.getStudentCount()`のようにクラス名から直接呼び出せます。
**<実行例>**
```
学籍番号:1 名前:鈴木一郎
学籍番号:2 名前:田中花子
学籍番号:3 名前:佐藤次郎
現在の生徒数:3人
```
---
## 【CUI_EM_OOP制作ゾーン】4〜6段階目
ここからは、1日目に作った`EmployeeData`・`Main`を、今日習った道具でバージョンアップし、完成形の姿にぐっと近づけていきます。
### 4段階目(EmployeeDataをカプセル化しよう)
**お題**
`EmployeeData`クラスの6つのフィールドを`private`にして、ゲッター・セッターを作成しましょう。
**<作成フローとポイント>**
1. `EmployeeData.java`の6つのフィールドすべてに、`private`をつけてください。
2. 6つのフィールドそれぞれに、以下の名前でゲッター・セッターを作成してください(今後も同じ名前を使い続けるので、統一しておきましょう。すべて`public`で宣言してください)。
* `getIdEmployee()` / `setIdEmployee(String idEmployee)`
* `getNmEmployee()` / `setNmEmployee(String nmEmployee)`
* `getKnEmployee()` / `setKnEmployee(String knEmployee)`
* `getMailAddress()` / `setMailAddress(String mailAddress)`
* `getPassword()` / `setPassword(String password)`
* `getIdDepartment()` / `setIdDepartment(String idDepartment)`
3. `showInfo`メソッドの中身を、フィールドに直接アクセスする書き方(`this.idEmployee`など)から、1で作ったゲッターを使う書き方に直してください。
4. `Main.java`を見直し、`employee.idEmployee = "10000";`のようにフィールドへ直接代入している箇所を、**すべて**`employee.setIdEmployee("10000");`のようにセッター経由の書き方に直してください。
* 4〜6段階目だけでなく、7〜9段階目(検索機能)で作った箇所も含めて、すべて探して直しましょう。
**<実行例>**
これまでと同じ表示になります(6段階目・9段階目の実行例と見比べて確認してください)。
### 5段階目(EmployeeDataにコンストラクタを作ろう)
**お題**
`EmployeeData`クラスに、コンストラクタを2つ(オーバーロード)追加しましょう。
**<作成フローとポイント>**
1. `EmployeeData.java`に、**引数なしコンストラクタ**を追加してください。
* 中身は空のままでOKです(何もしなくて構いません)。
2. `EmployeeData.java`に、**6つの引数を持つコンストラクタ**を追加してください(1と合わせてオーバーロードになります)。
* 引数:`String idEmployee, String nmEmployee, String knEmployee, String mailAddress, String password, String idDepartment`
* 処理:渡された6つの引数を、直接フィールドに代入するのではなく、対応する**セッターを呼び出して**設定する
* 例:`this.setIdEmployee(idEmployee);`
3. `Main.java`の4段階目で作った「1件分の社員データを作る部分」を、新しく作った6引数コンストラクタを使う形に書き換えてください。
* 例:`EmployeeData employee = new EmployeeData("10000", "山田龍也", "ヤマダタツヤ", "yamada@hoge.jp", "aaa", "10");`
4. 6段階目(5人分)・7〜9段階目(検索機能)で社員データを作っている部分は、これまで通り「引数なしコンストラクタ+セッター」の形のままで構いません。
> **補足**:CSVファイルのようなデータを1項目ずつ読み込んで詰め替えていく場面では、あえて「引数なしコンストラクタ+セッター」の組み合わせが使われることもよくあります(このシステムでも、後日ファイルを扱うミッションでそのような作り方が登場します)。今回作った6引数コンストラクタは、実務でもよく使われる便利な書き方ですが、「どちらが正しい」ということではなく、状況に応じて使い分けるものだと覚えておいてください。
**<実行例>**
これまでと表示内容は変わりません。
### 6段階目(toStringをオーバーライドしよう)
**お題**
`showInfo`メソッドを、`Object`クラスの`toString`メソッドをオーバーライドする形に作り直しましょう。
**<作成フローとポイント>**
1. `EmployeeData.java`の`showInfo`メソッドを、以下のルールで書き換えてください。
* メソッド名を`showInfo`から`toString`に変える
* アクセス修飾子を`public`にする(`showInfo`は修飾子なしでしたが、`toString`は`Object`クラスの`public`なメソッドをオーバーライドするため`public`が**必須**です。つけないとコンパイルエラーになります)
* メソッドの前に`@Override`をつける
* 戻り値を`void`から`String`に変える
* 中で`System.out.println`していた部分はやめて、その文字列を`return`するようにする
2. `Main.java`の中で、`employee.showInfo();`や`employees[i].showInfo();`のように呼び出していた箇所を、**すべて**`System.out.println(employee);`・`System.out.println(employees[i]);`のように、オブジェクトをそのまま渡す形に書き換えてください。
3. 7〜9段階目(検索機能)の中で`showInfo()`を呼んでいた箇所も、同様に書き換えてください。
**<実行例>**
1日目の6段階目・9段階目とまったく同じ表示になることを確認してください。
```
10000 山田龍也 ヤマダタツヤ yamada@hoge.jp aaa 10
10001 高橋準 タカハシジュン jtaka@hoge.jp bbb 10
10002 麻枝史明 マエダフミアキ fmak@hoge.jp ccc 11
10003 丸戸章介 マルトショウスケ marusyo@hoge.jp ddd 12
10004 三宅武 ミヤケタケシ miya@hoge.jp eee 13
```
---
## 【挑戦問題ゾーン】7〜9段階目
ここからは応用問題です。今日習った内容に加えて、自分で少し調べながら進める部分があります。難しく感じても焦らず、じっくり調べながら取り組んでみましょう(経験者の方でも、多少時間がかかる内容です)。
### 7段階目(staticで社員データの件数を数えよう)
**お題**
`EmployeeData`クラスに、これまで何件のインスタンスが作られたかを数える仕組みを追加してください。
**<お題の条件>**
* `private static int empCount = 0;`のような`static`フィールドを追加する
* 2つのコンストラクタ(引数なし・6引数)の**両方**の中で、`empCount`を1増やす処理を追加する
* `static int getEmpCount()`のような`static`メソッドを追加し、`empCount`の値を返せるようにする
* `Main.java`で、6段階目の5人分のインスタンスをすべて生成し終えたあとに、`EmployeeData.getEmpCount()`のように**クラス名から直接**呼び出し、作られた件数を出力する
**<考え方のヒント>**
* `static`がついたフィールドやメソッドは、個々の社員データ(`idEmployee`など)とは違い、「全員で1つを共有する」データです。コンストラクタが呼ばれるたびに増える、という点を意識してみましょう。
**<余裕がある人向け(任意)>**
`static final`をつけると、あとから値を変更できない「定数」を作ることができます。試しに`EmployeeData`クラスに`static final String COMPANY_NAME = "Rhizome";`のような定数を追加し、どこかで出力してみましょう。今回のシステムでは必須ではありませんが、後日のミッションでよく使う書き方です。
**<実行例>**
```
10000 山田龍也 ヤマダタツヤ yamada@hoge.jp aaa 10
10001 高橋準 タカハシジュン jtaka@hoge.jp bbb 10
10002 麻枝史明 マエダフミアキ fmak@hoge.jp ccc 11
10003 丸戸章介 マルトショウスケ marusyo@hoge.jp ddd 12
10004 三宅武 ミヤケタケシ miya@hoge.jp eee 13
現在の社員データ件数:5件
```
### 8段階目(セッターに簡単なチェックを入れてみよう)
**お題**
今の`setNmEmployee`は、どんな値を渡されてもそのまま代入してしまいます。空文字や空白だけの値が渡された場合は代入しないように直してみましょう。
**<お題の条件>**
* `setNmEmployee`の引数`nmEmployee`が、`null`、または前後の空白を取り除いた結果が空文字になる場合、「社員名が空のため設定できませんでした」と表示し、**フィールドへの代入を行わない**
* それ以外の場合は、これまで通りフィールドに代入する
**<考え方のヒント>**
* 文字列の前後の空白を取り除くメソッドと、文字列の長さ(または空文字かどうか)を調べるメソッドを、それぞれ調べてみましょう。
* `null`かどうかを確認する条件を、他の条件より**先に**書かないと、`null`の状態で文字列用のメソッドを呼び出そうとして`NullPointerException`というエラーで止まってしまいます。条件を書く順番に気をつけましょう。
**<実行例>**(`Main.java`で試しに空文字を`setNmEmployee`に渡してみた場合)
```
社員名が空のため設定できませんでした
```
### 9段階目(チェックをもう1つの項目にも広げ、コンストラクタと統一しよう)
**お題**
8段階目で作った「空文字チェック」の考え方を、`idEmployee`(社員ID)にも広げましょう。また、コンストラクタが本当にセッター経由になっているかを見直し、統一します。
**<お題の条件>**
1. `setIdEmployee`メソッドにも、8段階目の`setNmEmployee`と同じような空文字チェックを追加してください。
* `idEmployee`が`null`、または前後の空白を取り除いた結果が空文字になる場合、「社員IDが空のため設定できませんでした」と表示し、フィールドへの代入を行わない
* それ以外の場合は、これまで通りフィールドに代入する
2. 8段階目で作ったチェックは、セッターを直接呼び出したときにしか働きません。5段階目で作った6引数コンストラクタの中身を見直し、**6つのフィールドすべてが、直接代入ではなくセッターを呼び出す形**(`this.setNmEmployee(nmEmployee);`のような形)になっているか確認してください。
* もし直接代入の書き方(`this.nmEmployee = nmEmployee;`など)が残っていた場合は、すべてセッターを呼び出す形に書き換えてください。
**<確認方法>**
`Main.java`で、6引数コンストラクタの`nmEmployee`引数に空文字`""`を渡して`EmployeeData`を生成してみましょう。「社員名が空のため設定できませんでした」と表示され、生成されたインスタンスの`nmEmployee`が設定されない(`null`のままになる)ことを確認してください。同様に、`idEmployee`引数を空文字にした場合も「社員IDが空のため設定できませんでした」と表示されることを確認してください。
**<実行例>**
```
社員名が空のため設定できませんでした
社員IDが空のため設定できませんでした
```
> **ポイント**:「値のチェックはセッターに1回だけ書き、コンストラクタも含めて全員がセッター経由で値を設定する」という作りは、実務でもよく使われる、堅牢なクラス設計の基本パターンです。
---
## まとめ
今日は「コンストラクタ」「アクセス修飾子」「ゲッター・セッター」「メソッドのオーバーライド」「`static`」という道具を使って、1日目に作った土台を大きくバージョンアップしました。特に`EmployeeData`クラスは、フィールドが`private`で守られ、コンストラクタとゲッター・セッターを備え、`toString`で自分の情報を表現できる、完成形にかなり近い姿になりました。
今日書いたコードも消さずに残しておいてください。次回以降のミッションで、継承・多態性・コレクション・例外処理・ファイル入出力などを習いながら、最終的に本物の「社員メンテナンス(ファイルシステム版)」システムに近づけていきます。

View File

@@ -1,462 +0,0 @@
# CUI_EM_OOP ミッション課題【3日目】継承・抽象クラス・インターフェース・ポリモーフィズム
## このミッションについて
このミッションは、最終的に **「社員メンテナンス(ファイルシステム版)」(CUI_EM_OOP)** を完成させることを目標にした、複数回に分かれたミッション課題の**3日目**です。
**【今日からのルール変更】** 1〜3段階目(基礎確認ゾーン)は、今日からは**前回までに作ったファイル(`Book`・`Item`・`Student`・`EmployeeData`・`Main`など)を一切使わず、新しいクラスだけで完結する練習問題**にします。毎回その日の内容だけを、他の実装に引きずられずシンプルに確認できるようにするためです。(4〜6段階目「CUI_EM_OOP制作ゾーン」は、これまで通り前回までの続きから作業します。)
まだ以下の内容は習っていないため使いません。今後のミッションでさらにバージョンアップしていきます。
* コレクション(`ArrayList`など)
* 例外処理
* ファイルの読み書き
## 今日の講義内容
* 継承(`extends`)
* `super`キーワードの構文
* `@Override`によるメソッドオーバーライド(自分で作った親クラスに対するオーバーライド)
* 抽象クラスとインターフェース
* ポリモーフィズムの基本(親クラス型の変数に子クラスのインスタンスを代入する意味)
## 基本の書き方(文法メモ)
今日はじめて出てくる書き方をまとめておきます。各段階で迷ったときは、ここに戻って確認してください。
### 継承(`extends`)
```java
public class 親クラス名 {
// フィールド・メソッド
}
public class 子クラス名 extends 親クラス名 {
// 親クラスのフィールド・メソッドがそのまま使える
// 独自のフィールド・メソッドを追加できる
}
```
子クラスは、親クラスの`public`なフィールドやメソッドを、そのまま自分のものとして使うことができます(`private`なフィールドは、親クラスの中でしか直接アクセスできないという規則は継承していても変わりません)。
### `super`(コンストラクタの呼び出し)
```java
public class 親クラス名 {
public 親クラス名(型 引数名) {
// ...
}
}
public class 子クラス名 extends 親クラス名 {
public 子クラス名(型 引数名) {
super(親クラスのコンストラクタに渡す値); // 必ず1行目に書く
// 子クラス独自の初期化処理
}
}
```
* `super(...)`は、親クラスのコンストラクタを呼び出す書き方です。書く場合は**コンストラクタの中の一番最初の行**に書く必要があります。
* 親クラスに「引数なしコンストラクタ」が1つもない場合、子クラスは必ず`super(...)`で親クラスのどのコンストラクタを呼ぶかを指定しなければ、コンパイルエラーになります。
* 逆に、親クラスに引数なしコンストラクタしかない場合(今回の`BaseData`のように、コンストラクタを1つも書いていない場合も含む)は、子クラス側で`super()`を書かなくても、Javaが自動的に親クラスの引数なしコンストラクタを呼び出してくれます。
### `super`(メソッドの呼び出し)
```java
public class 子クラス名 extends 親クラス名 {
@Override
public 戻り値の型 メソッド名() {
戻り値の型 親の結果 = super.メソッド名(); // オーバーライドする前の、親クラスの処理を呼び出す
// 親の結果を使って、独自の処理を追加する
}
}
```
`super.メソッド名()`と書くと、オーバーライドする前の**親クラスが元々持っていた処理**を呼び出せます。「親の処理はそのまま活かしつつ、少しだけ追加したい」というときによく使います。(1段階目の`Circle`クラスで実際に使います)
### 抽象クラス(`abstract class`)
```java
public abstract class 親クラス名 {
public abstract 戻り値の型 メソッド名(); // 中身を書かない(抽象メソッド)
}
```
* `abstract`をつけたクラスは、**そのままでは`new`でインスタンス化できません**。必ず`extends`した子クラスを作り、その子クラスをインスタンス化して使います。
* `abstract`をつけたメソッド(抽象メソッド)は中身(`{ }`)を書きません。「これを継承する子クラスは、必ずこのメソッドを実装(オーバーライド)してください」という約束を表します。
* 抽象メソッドを1つでも実装し忘れると、その子クラスはコンパイルエラーになります。
### インターフェース(`interface`)
```java
public interface インターフェース名 {
戻り値の型 メソッド名(); // 中身を書かない
}
public class クラス名 implements インターフェース名 {
@Override
public 戻り値の型 メソッド名() {
// 実装
}
}
```
* インターフェースは抽象クラスとよく似ていますが、`extends`ではなく`implements`というキーワードを使います。
* インターフェースの中に書くメソッドは、すべて中身を書かない「約束」だけのメソッドです。
* クラスの継承(`extends`)は1つの親クラスしか指定できませんが、インターフェースは`implements インターフェースA, インターフェースB`のように**複数同時に実装**できます。
### ポリモーフィズム(親クラス型の変数に子クラスのインスタンスを代入する)
```java
親クラス名 変数名 = new 子クラス名();
```
* 変数の**型**は「親クラス」ですが、中に入っているのは「子クラス」のインスタンスです。
* この変数からメソッドを呼び出すと、実際に代入されている**子クラス側でオーバーライドされた内容**が実行されます(親クラスの元々の中身ではありません)。
* この仕組みのおかげで、`親クラス名[]`の配列に、いろいろな種類の子クラスのインスタンスをまとめて入れて、同じように扱うことができるようになります。
* **注意**:変数の型が親クラスの場合、**親クラスに書かれているメソッドしか直接は呼び出せません**。子クラスだけが持つ独自のメソッドを呼びたい場合は「キャスト」という書き方が必要になります(7〜9段階目で扱います)。
### `public`について
これまでと同様、コンストラクタ・ゲッター・セッター・オーバーライドするメソッドは`public`で宣言してください(詳しい理由は2日目の文法メモを参照)。
## すすめかた
1. 1段階目から順番に取り組んでください。むずかしそうに見えても、飛ばさないでください。
2. 各段階の「お題」をよく読んで、「何を作るのか」を最初に理解してから手を動かしましょう。
3. コードが書けたら、必ず実行して**「実行例」と同じ結果になるか**確認しましょう。
4. わからない言葉が出てきたら、まず自分で調べてみましょう。調べてもわからないときは、講師に質問してください。
5. コピー&ペーストではなく、自分の手で入力して理解しましょう。
## プロジェクトの作り方
これまで使っているプロジェクトに、新しいファイルを追加していく形で進めてください。パッケージ分けはまだ行いません。
## 提出物
* 今日修正・作成した`.java`ファイル一式
---
## 【基礎確認ゾーン】1〜3段階目
このゾーンは、CUI_EM_OOPとは直接関係のない練習問題です。**前回までに作った`Book`・`Item`・`Student`・`EmployeeData`は一切使いません。** すべて新しいクラスを使って、今日の内容がしっかり身についているかを確認しましょう(1〜3段階目の中でお互いに作ったクラスを使い回すのはOKです)。
### 1段階目(継承とsuperでシンプルな図形クラスを作ろう)
**お題**
「図形」を表す`Shape`クラスと、それを継承した`Circle`(円)クラスを作りましょう。
**<作成フローとポイント>**
1. `Shape.java`を新規作成し、以下の内容で作成してください(コンストラクタ・メソッドはすべて`public`で宣言してください)。
* フィールド:`name`(`String`型、`private`)
* コンストラクタ:引数`String name`を1つ受け取り、`name`フィールドに代入する(**引数なしコンストラクタは作りません**)
* メソッド`area`:引数なし、戻り値`double`、中身は`return 0.0;`(本来は図形ごとに違う値になるはずですが、今の時点では仮の値です)
* メソッド`showInfo`:引数なし、戻り値なし(`void`)、中身は`this.name + "の面積は" + this.area() + "です"`を`System.out.println`で出力する
2. `Circle.java`を新規作成し、以下の内容で作成してください。
* `Shape`クラスを継承する(`extends`)
* フィールド:`radius`(`double`型、`private`)
* コンストラクタ(`public`):引数`double radius`を1つ受け取る
* 中で`super("円")`を呼び出してください(`Shape`に引数なしコンストラクタがないため、**この`super(...)`を書かないとコンパイルエラーになります**)
* `radius`フィールドにも引数の値を代入する
* `area`メソッドを`public`・`@Override`にし、`Math.PI * radius * radius`(円の面積の公式)を返すようにする
* ※`Shape`側の`area`が`public`なので、オーバーライドする側も必ず`public`にする必要があります(`public`より狭い書き方をするとコンパイルエラーになります)
* `showInfo`メソッドも`public`・`@Override`してください。中身は以下の2行にしてください。
* 1行目:`super.showInfo();`(オーバーライドする前の、`Shape`の`showInfo`をそのまま呼び出す)
* 2行目:`"(半径:" + this.radius + ")"`を`System.out.println`で出力する
3. `Day3Check1.java`を新規作成し、`main`メソッドの中で以下を行ってください。
* `radius`が`2`の`Circle`インスタンスを作成する
* 作成したインスタンスの`showInfo`メソッドを呼び出す
**<実行例>**
```
円の面積は12.566370614359172です
(半径:2.0)
```
> 面積の値は小数点以下が長く表示されますが、`Math.PI`を使って正しく計算されている証拠なので、そのままでOKです。
### 2段階目(抽象クラスとインターフェースを使ってみよう)
**お題**
`Shape`クラスを抽象クラスに変え、新しい図形`Rectangle`(長方形)を追加します。また、まったく別の練習として、インターフェースも使ってみましょう。
**<作成フローとポイント>**
**①`Shape`を抽象クラスにする**
1. `Shape.java`を修正してください。
* クラス宣言を`public abstract class Shape`に変える
* `area`メソッドを、中身のない**抽象メソッド**に変える(`public abstract double area();`)
* ※`Circle`クラスはすでに`area`を`@Override`して実装済みなので、修正は不要です(そのままコンパイルが通ることを確認しましょう)。
2. `Rectangle.java`を新規作成してください。
* `Shape`クラスを継承する
* フィールド:`width`、`height`(どちらも`double`型、`private`)
* コンストラクタ(`public`):引数`double width, double height`を受け取り、`super("四角形")`を呼び出したうえで、2つのフィールドに代入する
* `area`メソッドを`public`・`@Override`にし、`width * height`を返すようにする(`Circle`のときと同じ理由で`public`が必須です)
**②インターフェースを使ってみる(①とは無関係の練習です)**
3. `Greeting.java`を新規作成し、以下の内容の**インターフェース**を作成してください。
```java
public interface Greeting {
String hello();
}
```
4. `JapaneseGreeting.java`を新規作成してください。
* `Greeting`インターフェースを`implements`する
* `hello`メソッドを`public`・`@Override`にし、`"こんにちは"`を返すようにする
* ※インターフェースのメソッドは元々`public`として扱われるため、実装する側も必ず`public`にする必要があります(`toString`のときと同じルールです)
5. `Day3Check2.java`を新規作成し、`main`メソッドの中で以下を行ってください。
* `width`が`3`、`height`が`4`の`Rectangle`インスタンスを作成し、`showInfo`メソッドを呼び出す
* `Greeting`型の変数に`JapaneseGreeting`のインスタンスを代入し、`hello`メソッドの戻り値を出力する
**<実行例>**
```
四角形の面積は12.0です
こんにちは
```
**<余裕がある人向け(任意)>**
`LoudGreeting`という、もう1つのインターフェース(`String shout();`)を作り、`JapaneseGreeting`クラスに`Greeting`と`LoudGreeting`の**両方**を実装させてみましょう(`implements Greeting, LoudGreeting`)。クラスは1つしか継承できませんが、インターフェースは複数実装できることを確認してみてください。
### 3段階目(ポリモーフィズムを体感しよう)
**お題**
1〜2段階目で作った`Shape`・`Circle`・`Rectangle`を使って、「親クラス型の変数に子クラスのインスタンスを代入する」とはどういうことかを確認しましょう。
**<作成フローとポイント>**
1. `Day3Check3.java`を新規作成し、`main`メソッドの中で以下を行ってください。
* `Shape`型の変数`shape1`に、`radius`が`2`の`Circle`インスタンスを代入する(`Shape shape1 = new Circle(2);`)
* `shape1`の`showInfo`メソッドを呼び出す
* 変数の型は`Shape`なのに、`Circle`で上書きした`area`の内容(円の面積の計算)が使われることを確認しましょう
* `Shape`型の変数`shape2`に、`width`が`3`、`height`が`4`の`Rectangle`インスタンスを代入する(`Shape shape2 = new Rectangle(3, 4);`)
* `shape2`の`showInfo`メソッドを呼び出す
* 同じ`Shape`型の変数なのに、今度は`Rectangle`で上書きした`area`の内容(長方形の面積の計算)が使われることを確認しましょう
**<実行例>**
```
円の面積は12.566370614359172です
(半径:2.0)
四角形の面積は12.0です
```
> **ポイント①**:`shape1`と`shape2`はどちらも同じ`Shape`型の変数ですが、代入したインスタンスが`Circle`か`Rectangle`かによって、`showInfo()`の結果(特に`area()`の計算内容)が変わっています。これがポリモーフィズムの効果です。
> **ポイント②**:`Circle`は`showInfo`をオーバーライドして半径の情報を追加していますが、`Rectangle`は`showInfo`をオーバーライドしていないため、`Shape`の`showInfo`がそのまま使われています。「オーバーライドは、変えたいメソッドだけ行えばよい」ということも確認できます。
---
## 【CUI_EM_OOP制作ゾーン】4〜6段階目
ここからは、前回までに作った`EmployeeData`・`Main`を、今日習った道具でバージョンアップしていきます。
### 4段階目(BaseDataを作り、EmployeeDataに継承させよう)
**お題**
社員データ以外のデータ(後日追加する部署データなど)も含めて共通で使える、`BaseData`という抽象クラスを作りましょう。
**<作成フローとポイント>**
1. `BaseData.java`を新規作成し、以下の内容で作成してください。
* `public abstract class BaseData`として宣言する(フィールドはありません)
* 以下の3つの抽象メソッドを宣言する(すべて中身なし)
* `public abstract String toString();`
* `public abstract String toCSV();`
* `public abstract String getPrimaryKeyValue();`
* ※`toString`は`Object`クラスのメソッドを上書きする形にもなりますが、ここではまだ中身のない抽象メソッドとして宣言するだけなので、`@Override`はつけなくて構いません(つけても間違いではありませんが、今回は付けない形で統一します)。
2. `EmployeeData.java`を修正し、`BaseData`クラスを継承してください(`public class EmployeeData extends BaseData`)。
* 2日目にすでに`@Override public String toString()`を作成済みなので、そのままで`BaseData`の`toString`の約束を満たしています(修正不要です)。
* `EmployeeData`のコンストラクタに`super(...)`を書く必要は**ありません**。`BaseData`にはコンストラクタを1つも書いていないため、Javaが自動的に引数なしの親コンストラクタを呼び出してくれるためです。
3. `EmployeeData.java`に、以下の2つのメソッドを追加してください(どちらも`public`・`@Override`)。
* `toCSV`:引数なし、戻り値`String`。6つのフィールドの値を、ゲッターを使ってカンマ区切り(`","`)でつなげて`return`する
* 例:`getIdEmployee() + "," + getNmEmployee() + ...`
* `getPrimaryKeyValue`:引数なし、戻り値`String`。`idEmployee`フィールドの値をそのまま`return`する
4. `Main.java`で、4段階目(1日目)から作っている`employee`変数を使って、`employee.toCSV()`と`employee.getPrimaryKeyValue()`の結果をそれぞれ出力し、正しく動いているか確認してください。
**<実行例>**
```
10000,山田龍也,ヤマダタツヤ,yamada@hoge.jp,aaa,10
10000
```
(出力の形式は自由です。上の例のように2行に分けて出力すればOKです。)
### 5段階目(Mainでポリモーフィズムを使おう)
**お題**
`Main.java`の中で、`EmployeeData`型を使っていた変数・配列を、`BaseData`型に変更してみましょう。
**<作成フローとポイント>**
1. `Main.java`を見直し、以下の宣言を変更してください。
* `EmployeeData employee = ...` → `BaseData employee = ...`
* `EmployeeData[] employees = new EmployeeData[5];` → `BaseData[] employees = new BaseData[5];`
* ※右辺で`new EmployeeData(...)`しているところは変更不要です。「`EmployeeData`のインスタンスを、`BaseData`型の変数・配列に入れる」という変更です。
2. 変更すると、`isMatchId`メソッドを呼び出している箇所が、**すべてコンパイルエラーになります**。`BaseData`型には`isMatchId`というメソッドが存在しないためです。呼び出し箇所は複数あるので、探し忘れに注意してください。
* 1日目7段階目で書いた動作確認用の呼び出し(`employees[2].isMatchId("10002")`など)
* 1日目8〜9段階目で書いた検索処理の中の呼び出し
* これらの`何か.isMatchId(引数)`という呼び出しを、すべて`何か.getPrimaryKeyValue().equals(引数)`という書き方に直してください。
* 例:`employees[2].isMatchId("10002")` → `employees[2].getPrimaryKeyValue().equals("10002")`
* 検索処理の中の呼び出し(`employees[i].isMatchId(入力されたID)`のような形。`入力されたID`の部分は、8段階目で`Scanner`から読み取った自分がつけた変数名に置き換えてください)→ `employees[i].getPrimaryKeyValue().equals(入力されたID)`
* `getPrimaryKeyValue`は`BaseData`で約束されているメソッドなので、`BaseData`型のままでも呼び出せます。
* `isMatchId`メソッド自体は`EmployeeData.java`に残しておいて構いません(今後使わなくなりますが、消さなくても動作に影響はありません)。
3. `Main.java`のすべての動作(全件表示・ID検索など)が、今まで通り同じ結果になることを確認してください。
**<実行例>**
これまでと表示内容は変わりません。1日目の実行例、2日目6段階目の実行例と見比べて確認してください。
> **ポイント**:`isMatchId`は`EmployeeData`専用のメソッドでしたが、`getPrimaryKeyValue`は`BaseData`を継承したクラスなら何でも使える共通の仕組みです。今回のように「専用メソッド」を「共通の仕組み」に置き換えられるのが、抽象クラスとポリモーフィズムの強みです。
### 6段階目(DepartmentDataを作って、ポリモーフィズムの威力を実感しよう)
**お題**
社員データとは別に、部署データを表す`DepartmentData`クラスを作り、`EmployeeData`と一緒くたに扱えることを確認しましょう。
**<作成フローとポイント>**
1. `DepartmentData.java`を新規作成し、`EmployeeData`と同じ要領で以下の内容で作成してください。
* `BaseData`クラスを継承する
* フィールド(すべて`private`・`String`型):`idDepartment`(部署ID)、`nmDepartment`(部署名)
* 2つのフィールドそれぞれにゲッター・セッターを作成する(`getIdDepartment`/`setIdDepartment`、`getNmDepartment`/`setNmDepartment`)
* コンストラクタは何も書かなくて構いません(Javaが自動的に用意してくれる「引数なし・中身なし」のコンストラクタをそのまま使います)
* 以下の3つのメソッドを`public`・`@Override`で作成する
* `toString`:`getIdDepartment() + "\t" + getNmDepartment()`を返す
* `toCSV`:`getIdDepartment() + "," + getNmDepartment()`を返す
* `getPrimaryKeyValue`:`getIdDepartment()`を返す
2. `Main.java`に、以下のデータをすべて格納できる`BaseData`型の配列`allData`を用意してください(`BaseData[] allData = new BaseData[11];`)。
* `allData[0]`〜`allData[4]`:5段階目で`BaseData`型に変えた`employees`配列の中身(`employees[0]`〜`employees[4]`)をそのまま代入する
* `allData[5]`〜`allData[10]`:以下の部署データを、それぞれ新しく`DepartmentData`インスタンスを作成して代入する
```
10,役員
11,人事・総務部
12,経理部
13,システム開発事業部
14,教育事業部
15,営業企画部
```
**<部署データを入れるときの注意>** `allData`は`BaseData`型の配列です。`allData[5] = new DepartmentData();`のように**先に配列へ代入してしまうと**、そのあとで`allData[5].setIdDepartment(...)`のような`DepartmentData`専用のセッターを呼び出せなくなります(`BaseData`型にはセッターの約束がないためです)。必ず次の順番で進めてください。
1. `DepartmentData`型の変数(例:`dept`)を用意し、`new DepartmentData()`でインスタンスを作成する
2. `dept`のセッターを使って、部署ID・部署名を設定する
3. 設定が終わった`dept`を`allData[5]`のように代入する
3. `for`文を使って、`allData`の中身を順番に`System.out.println`で出力してください。
**<実行例>**
```
10000 山田龍也 ヤマダタツヤ yamada@hoge.jp aaa 10
10001 高橋準 タカハシジュン jtaka@hoge.jp bbb 10
10002 麻枝史明 マエダフミアキ fmak@hoge.jp ccc 11
10003 丸戸章介 マルトショウスケ marusyo@hoge.jp ddd 12
10004 三宅武 ミヤケタケシ miya@hoge.jp eee 13
10 役員
11 人事・総務部
12 経理部
13 システム開発事業部
14 教育事業部
15 営業企画部
```
> **ポイント**:`allData`は`BaseData`型の配列ですが、中身は`EmployeeData`と`DepartmentData`という**まったく別のクラス**のインスタンスが混ざっています。それでも同じ`for`文・同じ`System.out.println`で、それぞれ正しい形式で表示できました。これがポリモーフィズムの一番の効果です。
---
## 【挑戦問題ゾーン】7〜9段階目
ここからは応用問題です。今日習った内容に加えて、自分で少し調べながら進める部分があります。難しく感じても焦らず、じっくり調べながら取り組んでみましょう(経験者の方でも、多少時間がかかる内容です)。
### 7段階目(instanceofで型を確認しよう)
**お題**
6段階目で作った`allData`配列の中身が、実際には`EmployeeData`と`DepartmentData`のどちらなのかを調べる方法を調査し、それぞれの件数を数えてください。
**<お題の条件>**
* `allData`を`for`文で1件ずつ確認し、その要素が実際には`EmployeeData`のインスタンスなのか、`DepartmentData`のインスタンスなのかを判定する
* 社員データの件数と、部署データの件数を、それぞれ数えて出力する
**<考え方のヒント>**
* 「ある変数の中身が、実際にはどのクラスのインスタンスか」を調べる演算子があります。「Java instanceof」で調べてみましょう。
**<実行例>**
```
社員データ:5件
部署データ:6件
```
### 8段階目(キャストでサブクラス限定の機能を使おう)
**お題**
`allData`は`BaseData`型の配列なので、そのままでは`EmployeeData`だけが持っている`getMailAddress`メソッドを呼び出せません。「キャスト」という方法を調べて、全社員のメールアドレスを表示してください。
**<お題の条件>**
* `allData`を`for`文で1件ずつ確認し、7段階目の`instanceof`を使って`EmployeeData`かどうかを判定する
* `EmployeeData`だった場合のみ、`EmployeeData`型に**キャスト**したうえで`getMailAddress`メソッドを呼び出し、結果を出力する
**<考え方のヒント>**
* 「親クラス型の変数の中身を、実際の子クラスの型として扱いなおす」書き方を「Java キャスト」で調べてみましょう。書き方の形は`(型名) 変数名`です。
* `instanceof`で確認せずにキャストすると、実際の型と違う型にキャストしようとして`ClassCastException`というエラーになることがあります。必ず`instanceof`で確認してからキャストしましょう。
**<実行例>**
```
yamada@hoge.jp
jtaka@hoge.jp
fmak@hoge.jp
marusyo@hoge.jp
miya@hoge.jp
```
### 9段階目(部署名から社員を検索する集計プログラムを作ろう)
**お題**
7〜8段階目で調べた`instanceof`とキャストを組み合わせて、「部署名」から「その部署に所属する社員」を検索するプログラムを作ってください。
**<お題の条件>**
1. `allData`の中から、`nmDepartment`が`"システム開発事業部"`である`DepartmentData`を探し、その`idDepartment`(部署ID)を調べる
2. 1で調べた部署IDと、`idDepartment`が一致する`EmployeeData`を`allData`の中からすべて探す
3. 見つかった社員の`nmEmployee`(社員名)と`mailAddress`(メールアドレス)を、タブ区切りで出力する
※`nmDepartment`・`idDepartment`・`nmEmployee`・`mailAddress`はすべて`private`なフィールドなので、実際にはそれぞれのゲッター(`getNmDepartment()`など)を使って値を取得してください。
**<実行例>**
```
三宅武 miya@hoge.jp
```
**<余裕がある人向け(任意)>**
部署名を`"システム開発事業部"`のように固定で書くのではなく、`Scanner`を使ってキーボードから入力できるようにしてみましょう。存在しない部署名が入力された場合の表示(例:「該当する部署が見つかりませんでした」)も考えてみてください。
---
## まとめ
今日は「継承」「`super`」「抽象クラス」「インターフェース」「ポリモーフィズム」という、オブジェクト指向の中心となる仕組みを学びました。`EmployeeData`は`BaseData`を継承する形になり、`DepartmentData`という仲間も加わって、`BaseData`型でまとめて扱えるようになりました。これは最終的に完成するシステムの土台となる、とても重要な変更です。
今日書いたコードも消さずに残しておいてください。次回以降のミッションで、コレクション・例外処理・ファイル入出力などを習いながら、最終的に本物の「社員メンテナンス(ファイルシステム版)」システムに近づけていきます。

View File

@@ -1,8 +1,11 @@
10000,山田龍也,ヤマダタツヤ,yamada@hoge.jp,aaa,10
10001,高橋準,タカハシジュン,jtaka@hoge.jp,bbb,10
10002,麻枝史明,マエダフミアキ,fmak@hoge.jp,ccc,11
10003,丸戸章介,マルトショウスケ,marusyo@hoge.jp,ddd,12
10004,三宅武,ミヤケタケシ,miya@hoge.jp,eee,13
10005,丸井悠,マルイハルカ,haru@hoge.jp,fff,13
10006,涼元香織,スズモトカオリ,suzumoto@hoge.jp,ggg,13
10007,葉山稔,ハヤマミノル,mhayama@hoge.jp,hhh,14
10008,川上朱里,カワカミアカリ,kawakami@hoge.jp,iii,14
10009,杉井肇,スギイハジメ,sugi@hoge.jp,jjj,15
2,2,2,2,2,2
12345,石原,イシハラ,tesr,test,10
1 10001 10000 高橋準 山田龍也 タカハシジュン ヤマダタツヤ jtaka@hoge.jp yamada@hoge.jp bbb aaa 10
1 10000 山田龍也 ヤマダタツヤ yamada@hoge.jp aaa 10
2 10001 10001 高橋準 高橋準 タカハシジュン タカハシジュン jtaka@hoge.jp jtaka@hoge.jp bbb bbb 10
3 10002 10002 麻枝史明 麻枝史明 マエダフミアキ マエダフミアキ fmak@hoge.jp fmak@hoge.jp ccc ccc 11
4 10003 丸戸章介 マルトショウスケ marusyo@hoge.jp ddd 12
5 10004 三宅武 ミヤケタケシ miya@hoge.jp eee 13
6 10005 10005 丸井悠 丸井悠 マルイハルカ マルイハルカ haru@hoge.jp haru@hoge.jp fff fff 13
7 10006 10006 涼元香織 涼元香織 スズモトカオリ スズモトカオリ suzumoto@hoge.jp suzumoto@hoge.jp ggg ggg 13
8 10007 10007 葉山稔 葉山稔 ハヤマミノル ハヤマミノル mhayama@hoge.jp mhayama@hoge.jp hhh hhh 14
9 10008 10008 川上朱里 川上朱里 カワカミアカリ カワカミアカリ kawakami@hoge.jp kawakami@hoge.jp iii iii 14
10 10009 10009 杉井肇 杉井肇 スギイハジメ スギイハジメ sugi@hoge.jp sugi@hoge.jp jjj jjj 15
11 2 12345 2 石原 2 イシハラ 2 tesr 2 test 2 10

118
EmployeeData.java Normal file
View File

@@ -0,0 +1,118 @@
package misson1014;
public class EmployeeData {
//社員ID
private String idEmployee;
//社員名
private String nmEmployee;
//社員名カナ
private String knEmployee;
//メールアドレス
private String mailAddress;
//パスワード
private String password;
//部署ID
private String idDepartment;
//社員データ件数
private static int empCount = 0;
//コンストラクタ
public EmployeeData() {
empCount++;
}
//コンストラクタ
public EmployeeData(
String idEmployee,
String nmEmployee,
String knEmployee,
String mailAddress,
String password,
String idDepartment) {
this.setIdEmployee(idEmployee);
this.setNmEmployee(nmEmployee);
this.setKnEmployee(knEmployee);
this.setMailAddress(mailAddress);
this.setPassword(password);
this.setIdDepartment(idDepartment);
empCount++;
}
//ゲッター
public String getIdEmployee() {
return idEmployee;
}
public String getNmEmployee() {
return nmEmployee;
}
public String getKnEmployee() {
return knEmployee;
}
public String getMailAddress() {
return mailAddress;
}
public String getPassword() {
return password;
}
public String getIdDepartment() {
return idDepartment;
}
//セッター
public void setIdEmployee(String idEmployee) {
//nullチェック
if (idEmployee == null) {
System.out.println("社員IDが空のため設定できませんでした");
return;
}
//空文字チェック
if (idEmployee.trim().isEmpty()) {
System.out.println( "社員IDが空のため設定できませんでした");
return;
}
this.idEmployee = idEmployee;
}
public void setNmEmployee(String nmEmployee) {
//nullチェック
if (nmEmployee == null) {
System.out.println("社員名が空のため設定できませんでした");
return;
}
//空文字チェック
if (nmEmployee.trim().isEmpty()) {
System.out.println("社員名が空のため設定できませんでした");
return;
}
this.nmEmployee = nmEmployee;
}
public void setKnEmployee(String knEmployee) {
this.knEmployee = knEmployee;
}
public void setMailAddress(String mailAddress) {
this.mailAddress = mailAddress;
}
public void setPassword(String password) {
this.password = password;
}
public void setIdDepartment(String idDepartment) {
this.idDepartment = idDepartment;
}
//toString
@Override
public String toString() {
return getIdEmployee() + "\t"
+ getNmEmployee() + "\t"
+ getKnEmployee() + "\t"
+ getMailAddress() + "\t"
+ getPassword() + "\t"
+ getIdDepartment();
}
//ID一致判定
public boolean isMatchId(String id) {
return getIdEmployee().equals(id);
}
//件数取得
public static int getEmpCount() {
return empCount;
}
}

52
Item.java Normal file
View File

@@ -0,0 +1,52 @@
package misson1014;
public class Item {
private String name;
private int price;
private int stock;
//商品
public void sell(int amount) {
//在庫減らし
this.setStock(this.getStock() - amount);
}
//商品名ゲッター
public String getName() {
return name;
}
//商品名セッター
public void setName(String name) {
this.name = name;
}
//価格ゲッター
public int getPrice() {
return price;
}
//価格セッター
public void setPrice(int price) {
this.price = price;
}
//在庫数ゲッター
public int getStock() {
return stock;
}
//在庫数セッター
public void setStock(int stock) {
this.stock = stock;
}
@Override
public String toString() {
return getName()
+ " "
+ getPrice()
+ "円 (残り"
+ getStock()
+ "個)";
}
}

80
Main.java Normal file
View File

@@ -0,0 +1,80 @@
package misson1014;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
//配列を作成
EmployeeData[] employees = new EmployeeData[5];
//インスタンス生成
employees[0] = new EmployeeData();
employees[1] = new EmployeeData();
employees[2] = new EmployeeData();
employees[3] = new EmployeeData();
employees[4] = new EmployeeData();
employees[0].setIdEmployee("10000");
employees[0].setNmEmployee("山田龍也");
employees[0].setKnEmployee("ヤマダタツヤ");
employees[0].setMailAddress("yamada@hoge.jp");
employees[0].setPassword("aaa");
employees[0].setIdDepartment("10");
employees[1].setIdEmployee("10001");
employees[1].setNmEmployee("高橋準");
employees[1].setKnEmployee("タカハシジュン");
employees[1].setMailAddress("jtaka@hoge.jp");
employees[1].setPassword("bbb");
employees[1].setIdDepartment("10");
employees[2].setIdEmployee("10002");
employees[2].setNmEmployee("麻枝史明");
employees[2].setKnEmployee("マエダフミアキ");
employees[2].setMailAddress("fmak@hoge.jp");
employees[2].setPassword("ccc");
employees[2].setIdDepartment("11");
employees[3].setIdEmployee("10003");
employees[3].setNmEmployee("丸戸章介");
employees[3].setKnEmployee("マルトショウスケ");
employees[3].setMailAddress("marusyo@hoge.jp");
employees[3].setPassword("ddd");
employees[3].setIdDepartment("12");
employees[4].setIdEmployee("10004");
employees[4].setNmEmployee("三宅武");
employees[4].setKnEmployee("ミヤケタケシ");
employees[4].setMailAddress("miya@hoge.jp");
employees[4].setPassword("eee");
employees[4].setIdDepartment("13");
Scanner scanner = new Scanner(System.in);
//0が入力されるまでループ
while (true) {
//ID入力
System.out.println("検索したい社員IDを入力してください(終了する場合は0)");
String search = scanner.nextLine();
if (search.equals("0")) { System.out.println("システムを終了します");
break;
}
//見つかったかどうか
boolean found = false;
//検索処理
for (int i = 0; i < employees.length; i++) {
if (employees[i].isMatchId(search)) {
System.out.println(employees[i]);
found = true;
break;
}
}
// 見つからなかった場合
if (!found) {System.out.println("該当する社員が見つかりませんでした");
}
}
scanner.close();
}
}

91
Main1.java Normal file
View File

@@ -0,0 +1,91 @@
package misson1014;
public class Main1 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
//8段階目まで
/*
EmployeeData[] employees = new EmployeeData[5];
employees[0] = new EmployeeData();
employees[1] = new EmployeeData();
employees[2] = new EmployeeData();
employees[3] = new EmployeeData();
employees[4] = new EmployeeData();
employees[0].setIdEmployee("10000");
8段階用
employees[0].setNmEmployee("");
employees[0].setKnEmployee("ヤマダタツヤ");
employees[0].setMailAddress("yamada@hoge.jp");
employees[0].setPassword("aaa");
employees[0].setIdDepartment("10");
employees[1].setIdEmployee("10001");
employees[1].setNmEmployee("高橋準");
employees[1].setKnEmployee("タカハシジュン");
employees[1].setMailAddress("jtaka@hoge.jp");
employees[1].setPassword("bbb");
employees[1].setIdDepartment("10");
employees[2].setIdEmployee("10002");
employees[2].setNmEmployee("麻枝史明");
employees[2].setKnEmployee("マエダフミアキ");
employees[2].setMailAddress("fmak@hoge.jp");
employees[2].setPassword("ccc");
employees[2].setIdDepartment("11");
employees[3].setIdEmployee("10003");
employees[3].setNmEmployee("丸戸章介");
employees[3].setKnEmployee("マルトショウスケ");
employees[3].setMailAddress("marusyo@hoge.jp");
employees[3].setPassword("ddd");
employees[3].setIdDepartment("12");
employees[4].setIdEmployee("10004");
employees[4].setNmEmployee("三宅武");
employees[4].setKnEmployee("ミヤケタケシ");
employees[4].setMailAddress("miya@hoge.jp");
employees[4].setPassword("eee");
employees[4].setIdDepartment("13");
for (int i = 0; i < employees.length; i++) {
System.out.println(employees[i]);
}
System.out.println(
"現在の社員データ件数:"
+ EmployeeData.getEmpCount()
+ "件");
*/
//ここから9段階↓
EmployeeData employee1 =
new EmployeeData(
"10000",
"",
"ヤマダタツヤ",
"yamada@hoge.jp",
"aaa",
"10"
);
EmployeeData employee2 =
new EmployeeData(
"",
"山田龍也",
"ヤマダタツヤ",
"yamada@hoge.jp",
"aaa",
"10"
);
}
}

31
Student.java Normal file
View File

@@ -0,0 +1,31 @@
package misson1014;
public class Student {
int studentId;
String name;
//staticフィールド
static int studentCount = 0;
//コンストラクタ
public Student(int studentId, String name) {
//フィールド代入
this.studentId = studentId;
this.name = name;
studentCount++;
}
//学生情報
void printProfile() {
System.out.println(
"学籍番号:" + this.studentId
+ " 名前:" + this.name);
}
//現在の学生数用staticメソッド
public static int getStudentCount() {
return studentCount;
}
}

View File

@@ -1,6 +0,0 @@
10,役員
11,人事・総務部
12,経理部
13,システム開発事業部
14,教育事業部
15,営業企画部
1 10 役員
2 11 人事・総務部
3 12 経理部
4 13 システム開発事業部
5 14 教育事業部
6 15 営業企画部

View File

@@ -1,6 +0,0 @@
10000,山田龍也,ヤマダタツヤ,yamada@hoge.jp,aaa,10
10001,高橋準,タカハシジュン,jtaka@hoge.jp,bbb,10
10002,麻枝史明,マエダフミアキ,fmak@hoge.jp,ccc,11
1,1,1,1,1,1
3,2,2,2,2,2
4,4,4,4,4,4
1 10000 山田龍也 ヤマダタツヤ yamada@hoge.jp aaa 10
2 10001 高橋準 タカハシジュン jtaka@hoge.jp bbb 10
3 10002 麻枝史明 マエダフミアキ fmak@hoge.jp ccc 11
4 1 1 1 1 1 1
5 3 2 2 2 2 2
6 4 4 4 4 4 4

10
misson1014/.classpath Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>em-oop</name>
<name>misson1014</name>
<comment></comment>
<projects>
</projects>
@@ -10,14 +10,8 @@
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@@ -1,9 +1,11 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=21
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=21

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,10 @@
package misson1014;
public abstract class BaseData {
public abstract String toString();
public abstract String toCSV();
public abstract String getPrimaryKeyValue();
}

View File

@@ -0,0 +1,27 @@
package misson1014;
public class BasicCheck1 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
//コンストラクタ
Book book1 = new Book();
//book1
System.out.println(book1.title);
System.out.println(book1.author);
System.out.println(book1.price);
//コンストラクタ
Book book2 = new Book(
"銀河鉄道の夜",
"宮沢賢治",
500);
//book2
System.out.println(book2.title);
System.out.println(book2.author);
System.out.println(book2.price);
}
}

View File

@@ -0,0 +1,23 @@
package misson1014;
public class BasicCheck2 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Student student1 = new Student(1, "鈴木一郎");
Student student2 = new Student(2, "田中花子");
Student student3 = new Student(3, "佐藤次郎");
// 学生情報表示
student1.printProfile();
student2.printProfile();
student3.printProfile();
// 現在の学生数表示
System.out.println(
"現在の生徒数:"
+ Student.getStudentCount()
+ "人");
}
}

View File

@@ -0,0 +1,37 @@
package misson1014;
public class BasicCheck3 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
// Item型の配列を作成
Item[] items = new Item[3];
//インスタンス生成
items[0] = new Item();
items[1] = new Item();
items[2] = new Item();
items[0].setName("ノート");
items[0].setPrice(120);
items[0].setStock(50);
items[1].setName("消しゴム");
items[1].setPrice(80);
items[1].setStock(30);
items[2].setName("鉛筆");
items[2].setPrice(60);
items[2].setStock(100);
//販売
for (int i = 0; i < items.length; i++) {
items[i].sell(5);
}
//商品情報表示
for (int i = 0; i < items.length; i++) {
System.out.println(items[i]);
}
}
}

View File

@@ -0,0 +1,28 @@
package misson1014;
public class Book {
// タイトル
String title;
// 著者
String author;
// 価格
int price;
//コンストラクタ
public Book() {
this.title = "タイトル未設定";
this.author = "著者未設定";
this.price = 0;
}
//コンストラクタ
public Book(String title, String author, int price) {
//フィールド代入
this.title = title;
this.author = author;
this.price = price;
}
}

View File

@@ -0,0 +1,24 @@
package misson1014;
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
super("円");
this.radius = radius;
}
@Override
public double area() {
return Math.PI * this.radius * this.radius;
}
@Override
public void showInfo() {
super.showInfo();
System.out.println("(半径:" + this.radius + ")");
}
}

View File

@@ -0,0 +1,11 @@
package misson1014;
public class Day3Check1 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Circle circle = new Circle(2);
circle.showInfo();
}
}

View File

@@ -0,0 +1,38 @@
package misson1014;
public class DepartmentData extends BaseData {
private String idDepartment;
private String nmDepartment;
public String getIdDepartment() {
return idDepartment;
}
public void setIdDepartment(String idDepartment) {
this.idDepartment = idDepartment;
}
public String getNmDepartment() {
return nmDepartment;
}
public void setNmDepartment(String nmDepartment) {
this.nmDepartment = nmDepartment;
}
@Override
public String toString() {
return getIdDepartment() + "\t" + getNmDepartment();
}
@Override
public String toCSV() {
return getIdDepartment() + "," + getNmDepartment();
}
@Override
public String getPrimaryKeyValue() {
return getIdDepartment();
}
}

View File

@@ -0,0 +1,147 @@
package misson1014;
public class EmployeeData extends BaseData {
//社員ID
private String idEmployee;
//社員名
private String nmEmployee;
//社員名カナ
private String knEmployee;
//メールアドレス
private String mailAddress;
//パスワード
private String password;
//部署ID
private String idDepartment;
//社員データ件数
private static int empCount = 0;
//コンストラクタ
public EmployeeData() {
empCount++;
}
//コンストラクタ
public EmployeeData(
String idEmployee,
String nmEmployee,
String knEmployee,
String mailAddress,
String password,
String idDepartment) {
this.setIdEmployee(idEmployee);
this.setNmEmployee(nmEmployee);
this.setKnEmployee(knEmployee);
this.setMailAddress(mailAddress);
this.setPassword(password);
this.setIdDepartment(idDepartment);
empCount++;
}
//ゲッター
public String getIdEmployee() {
return idEmployee;
}
public String getNmEmployee() {
return nmEmployee;
}
public String getKnEmployee() {
return knEmployee;
}
public String getMailAddress() {
return mailAddress;
}
public String getPassword() {
return password;
}
public String getIdDepartment() {
return idDepartment;
}
//セッター
public void setIdEmployee(String idEmployee) {
if (idEmployee == null) {
System.out.println("社員IDが空のため設定できませんでした");
return;
}
if (idEmployee.trim().isEmpty()) {
System.out.println("社員IDが空のため設定できませんでした");
return;
}
this.idEmployee = idEmployee;
}
public void setNmEmployee(String nmEmployee) {
if (nmEmployee == null) {
System.out.println("社員名が空のため設定できませんでした");
return;
}
if (nmEmployee.trim().isEmpty()) {
System.out.println("社員名が空のため設定できませんでした");
return;
}
this.nmEmployee = nmEmployee;
}
public void setKnEmployee(String knEmployee) {
this.knEmployee = knEmployee;
}
public void setMailAddress(String mailAddress) {
this.mailAddress = mailAddress;
}
public void setPassword(String password) {
this.password = password;
}
public void setIdDepartment(String idDepartment) {
this.idDepartment = idDepartment;
}
//toString
@Override
public String toString() {
return getIdEmployee() + "\t"
+ getNmEmployee() + "\t"
+ getKnEmployee() + "\t"
+ getMailAddress() + "\t"
+ getPassword() + "\t"
+ getIdDepartment();
}
//CSV形式へ変換
@Override
public String toCSV() {
return getIdEmployee() + ","
+ getNmEmployee() + ","
+ getKnEmployee() + ","
+ getMailAddress() + ","
+ getPassword() + ","
+ getIdDepartment();
}
//キー取得
@Override
public String getPrimaryKeyValue() {
return getIdEmployee();
}
//ID一致判定
public boolean isMatchId(String id) {
return getIdEmployee().equals(id);
}
//件数取得
public static int getEmpCount() {
return empCount;
}
}

View File

@@ -0,0 +1,52 @@
package misson1014;
public class Item {
private String name;
private int price;
private int stock;
//商品
public void sell(int amount) {
//在庫減らし
this.setStock(this.getStock() - amount);
}
//商品名ゲッター
public String getName() {
return name;
}
//商品名セッター
public void setName(String name) {
this.name = name;
}
//価格ゲッター
public int getPrice() {
return price;
}
//価格セッター
public void setPrice(int price) {
this.price = price;
}
//在庫数ゲッター
public int getStock() {
return stock;
}
//在庫数セッター
public void setStock(int stock) {
this.stock = stock;
}
@Override
public String toString() {
return getName()
+ " "
+ getPrice()
+ "円 (残り"
+ getStock()
+ "個)";
}
}

View File

@@ -0,0 +1,241 @@
package misson1014;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
//社員データ格納用配列作成
//EmployeeDataをBaseDataとして管理する
//(ポリモーフィズム)
BaseData[] employees = new BaseData[5];
//社員データ用インスタンス
employees[0] = new EmployeeData();
employees[1] = new EmployeeData();
employees[2] = new EmployeeData();
employees[3] = new EmployeeData();
employees[4] = new EmployeeData();
employees[0] = new EmployeeData();
employees[1] = new EmployeeData();
employees[2] = new EmployeeData();
employees[3] = new EmployeeData();
employees[4] = new EmployeeData();
//社員情報設定
//BaseData型なのでEmployeeDataへ
//キャストしてセッターを利用する
((EmployeeData) employees[0]).setIdEmployee("10000");
((EmployeeData) employees[0]).setNmEmployee("山田龍也");
((EmployeeData) employees[0]).setKnEmployee("ヤマダタツヤ");
((EmployeeData) employees[0]).setMailAddress("yamada@hoge.jp");
((EmployeeData) employees[0]).setPassword("aaa");
((EmployeeData) employees[0]).setIdDepartment("10");
((EmployeeData) employees[1]).setIdEmployee("10001");
((EmployeeData) employees[1]).setNmEmployee("高橋準");
((EmployeeData) employees[1]).setKnEmployee("タカハシジュン");
((EmployeeData) employees[1]).setMailAddress("jtaka@hoge.jp");
((EmployeeData) employees[1]).setPassword("bbb");
((EmployeeData) employees[1]).setIdDepartment("10");
((EmployeeData) employees[2]).setIdEmployee("10002");
((EmployeeData) employees[2]).setNmEmployee("麻枝史明");
((EmployeeData) employees[2]).setKnEmployee("マエダフミアキ");
((EmployeeData) employees[2]).setMailAddress("fmak@hoge.jp");
((EmployeeData) employees[2]).setPassword("ccc");
((EmployeeData) employees[2]).setIdDepartment("11");
((EmployeeData) employees[3]).setIdEmployee("10003");
((EmployeeData) employees[3]).setNmEmployee("丸戸章介");
((EmployeeData) employees[3]).setKnEmployee("マルトショウスケ");
((EmployeeData) employees[3]).setMailAddress("marusyo@hoge.jp");
((EmployeeData) employees[3]).setPassword("ddd");
((EmployeeData) employees[3]).setIdDepartment("12");
((EmployeeData) employees[4]).setIdEmployee("10004");
((EmployeeData) employees[4]).setNmEmployee("三宅武");
((EmployeeData) employees[4]).setKnEmployee("ミヤケタケシ");
((EmployeeData) employees[4]).setMailAddress("miya@hoge.jp");
((EmployeeData) employees[4]).setPassword("eee");
((EmployeeData) employees[4]).setIdDepartment("13");
//6段階目
//EmployeeDataとDepartmentDataを同じBaseData配列で管理する
//全データ格納用
BaseData[] allData = new BaseData[11];
//社員データをallDataへ格納
for (int i = 0; i < employees.length; i++) {
allData[i] = employees[i];
}
//部署データ作成
//先にDepartmentData型で生成
//値を設定後にallDataへ格納する
DepartmentData dept;
dept = new DepartmentData();
dept.setIdDepartment("10");
dept.setNmDepartment("役員");
allData[5] = dept;
dept = new DepartmentData();
dept.setIdDepartment("11");
dept.setNmDepartment("人事・総務部");
allData[6] = dept;
dept = new DepartmentData();
dept.setIdDepartment("12");
dept.setNmDepartment("経理部");
allData[7] = dept;
dept = new DepartmentData();
dept.setIdDepartment("13");
dept.setNmDepartment("システム開発事業部");
allData[8] = dept;
dept = new DepartmentData();
dept.setIdDepartment("14");
dept.setNmDepartment("教育事業部");
allData[9] = dept;
dept = new DepartmentData();
dept.setIdDepartment("15");
dept.setNmDepartment("営業企画部");
allData[10] = dept;
//BaseData配列を全件表示
//EmployeeDataとDepartmentDataでオーバーライドされたtoString()が実行
for (int i = 0; i < allData.length; i++) {
System.out.println(allData[i]);
}
//7段階目
//instanceofを使って型を判定
//EmployeeData件数とDepartmentData件数を集計
int employeeCount = 0;
int departmentCount = 0;
for (int i = 0; i < allData.length; i++) {
if (allData[i] instanceof EmployeeData) {
employeeCount++;
}
if (allData[i] instanceof DepartmentData) {
departmentCount++;
}
}
//集計結果表示
System.out.println("社員データ:" + employeeCount + "件");
System.out.println("部署データ:" + departmentCount + "件");
//8段階目
//EmployeeDataへキャストしてメールアドレスを取得する
for (int i = 0; i < allData.length; i++) {
if (allData[i] instanceof EmployeeData) {
EmployeeData employee = (EmployeeData) allData[i];
System.out.println(
employee.getMailAddress()
);
}
}
Scanner scanner = new Scanner(System.in);
//9段階目
//入力した部署名に所属する社員を検索
//部署名から部署IDを取得
//部署IDと一致する社員を検索
//社員名とメールアドレスを表示
System.out.println("検索したい部署名を入力してください");
String departmentName = scanner.nextLine();
//該当部署の部署ID
String targetDepartmentId = null;
//部署見つかったか
boolean departmentFound = false;
//部署検索
for (int i = 0; i < allData.length; i++) {
if (allData[i] instanceof DepartmentData) {
DepartmentData department =(DepartmentData) allData[i];
if (department.getNmDepartment().equals(departmentName)) {
targetDepartmentId = department.getIdDepartment();
departmentFound = true;
break;
}
}
}
//部署が存在した場合
if (departmentFound) {
System.out.println("所属社員一覧");
for (int i = 0; i < allData.length; i++) {
if (allData[i] instanceof EmployeeData) {
EmployeeData employee =(EmployeeData) allData[i];
if (employee.getIdDepartment().equals(targetDepartmentId)) {
System.out.println(employee.getNmEmployee()
+ "\t"
+ employee.getMailAddress()
);
}
}
}
} else {
System.out.println(
"該当する部署が見つかりませんでした");
}
//三日目4段階目用
//System.out.println(employees[0].toCSV());
//System.out.println(employees[0].getPrimaryKeyValue());
//検索機能
//ループ
while (true) {
System.out.println("検索したい社員IDを入力してください(終了する場合は0)");
String search = scanner.nextLine();
if (search.equals("0")) {
System.out.println("システムを終了します");
break;
}
boolean found = false;
//ID検索と比較
for (int i = 0; i < employees.length; i++) {
if (employees[i].getPrimaryKeyValue().equals(search)) {
System.out.println(employees[i]);
found = true;
break;
}
}
//該当なし
if (!found) {
System.out.println("該当する社員が見つかりませんでした");
}
}
scanner.close();
}
}

View File

@@ -0,0 +1,125 @@
package misson1014;
public class Main1 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
//8段階目まで
/*
EmployeeData[] employees = new EmployeeData[5];
employees[0] = new EmployeeData();
employees[1] = new EmployeeData();
employees[2] = new EmployeeData();
employees[3] = new EmployeeData();
employees[4] = new EmployeeData();
employees[0].setIdEmployee("10000");
8段階用
employees[0].setNmEmployee("");
employees[0].setKnEmployee("ヤマダタツヤ");
employees[0].setMailAddress("yamada@hoge.jp");
employees[0].setPassword("aaa");
employees[0].setIdDepartment("10");
employees[1].setIdEmployee("10001");
employees[1].setNmEmployee("高橋準");
employees[1].setKnEmployee("タカハシジュン");
employees[1].setMailAddress("jtaka@hoge.jp");
employees[1].setPassword("bbb");
employees[1].setIdDepartment("10");
employees[2].setIdEmployee("10002");
employees[2].setNmEmployee("麻枝史明");
employees[2].setKnEmployee("マエダフミアキ");
employees[2].setMailAddress("fmak@hoge.jp");
employees[2].setPassword("ccc");
employees[2].setIdDepartment("11");
employees[3].setIdEmployee("10003");
employees[3].setNmEmployee("丸戸章介");
employees[3].setKnEmployee("マルトショウスケ");
employees[3].setMailAddress("marusyo@hoge.jp");
employees[3].setPassword("ddd");
employees[3].setIdDepartment("12");
employees[4].setIdEmployee("10004");
employees[4].setNmEmployee("三宅武");
employees[4].setKnEmployee("ミヤケタケシ");
employees[4].setMailAddress("miya@hoge.jp");
employees[4].setPassword("eee");
employees[4].setIdDepartment("13");
for (int i = 0; i < employees.length; i++) {
System.out.println(employees[i]);
}
System.out.println(
"現在の社員データ件数:"
+ EmployeeData.getEmpCount()
+ "件");
*/
/*ここから9段階↓
EmployeeData employee1 =
new EmployeeData(
"10000",
"",
"ヤマダタツヤ",
"yamada@hoge.jp",
"aaa",
"10"
);
EmployeeData employee2 =
new EmployeeData(
"",
"山田龍也",
"ヤマダタツヤ",
"yamada@hoge.jp",
"aaa",
"10"
);
*/
//三日目5段階
BaseData employee1 = new EmployeeData(
"10000",
"",
"ヤマダタツヤ",
"yamada@hoge.jp",
"aaa",
"10"
);
BaseData employee2 = new EmployeeData(
"",
"山田龍也",
"ヤマダタツヤ",
"yamada@hoge.jp",
"aaa",
"10"
);
System.out.println(employee1);
System.out.println(employee1.toCSV());
System.out.println(employee1.getPrimaryKeyValue());
System.out.println(
employee1.getPrimaryKeyValue().equals("10000")
);
System.out.println(
employee2.getPrimaryKeyValue().equals("10000")
);
}
}

View File

@@ -0,0 +1,17 @@
package misson1014;
public class Shape {
private String name;
public Shape(String name) {
this.name = name;
}
public double area() {
return 0.0;
}
public void showInfo() {
System.out.println(this.name + "の面積は" + this.area() + "です");
}
}

View File

@@ -0,0 +1,31 @@
package misson1014;
public class Student {
int studentId;
String name;
//staticフィールド
static int studentCount = 0;
//コンストラクタ
public Student(int studentId, String name) {
//フィールド代入
this.studentId = studentId;
this.name = name;
studentCount++;
}
//学生情報
void printProfile() {
System.out.println(
"学籍番号:" + this.studentId
+ " 名前:" + this.name);
}
//現在の学生数用staticメソッド
public static int getStudentCount() {
return studentCount;
}
}

View File

@@ -1,8 +0,0 @@
public abstract class BaseData {
public abstract String toString();
public abstract String toCSV();
public abstract String getPrimaryKeyValue();
}

View File

@@ -1,127 +0,0 @@
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
//====================設定====================
BaseData[] employees = new BaseData[5];
BaseData employee1 = new EmployeeData("10000", "山田龍也", "ヤマダタツヤ", "yamada@hoge.jp", "aaa", "10");
employees[1-1] = employee1;
BaseData employee2 = new EmployeeData("10001", "高橋準", "タカハシジュン", "jtaka@hoge.jp", "bbb", "10");
employees[2-1] = employee2;
BaseData employee3 = new EmployeeData("10002", "麻枝史明", "マエダフミアキ", "fmak@hoge.jp", "ccc", "11");
employees[3-1] = employee3;
BaseData employee4 = new EmployeeData("10003", "丸戸章介", "マルトショウスケ", "marusyo@hoge.jp", "ddd", "12");
employees[4-1] = employee4;
BaseData employee5 = new EmployeeData("10004", "三宅武", "ミヤケタケシ", "miya@hoge.jp", "eee", "13");
employees[5-1] = employee5;
BaseData[] allData = new BaseData[11];
allData[0] = employees[0];
allData[1] = employees[1];
allData[2] = employees[2];
allData[3] = employees[3];
allData[4] = employees[4];
DepartmentData department1 = new DepartmentData();
department1.setIdDepartment("10");
department1.setNmDepartment("役員");
allData[5] = department1;
DepartmentData department2 = new DepartmentData();
department2.setIdDepartment("11");
department2.setNmDepartment("人事");
allData[6] = department2;
DepartmentData department3 = new DepartmentData();
department3.setIdDepartment("12");
department3.setNmDepartment("経理部");
allData[7] = department3;
DepartmentData department4 = new DepartmentData();
department4.setIdDepartment("13");
department4.setNmDepartment("システム開発事業部");
allData[8] = department4;
DepartmentData department5 = new DepartmentData();
department5.setIdDepartment("14");
department5.setNmDepartment("教育事業部");
allData[9] = department5;
DepartmentData department6 = new DepartmentData();
department6.setIdDepartment("15");
department6.setNmDepartment("営業企画部");
allData[10] = department6;
// 段階7+8
int nEmployeeData = 0;
int nDepartmentData = 0;
for ( BaseData data : allData ) {
// System.out.println(data);
if ( data instanceof EmployeeData ) {
System.out.println(((EmployeeData)data).getMailAddress());
nEmployeeData++;
continue;
}
if ( data instanceof DepartmentData ) {
nDepartmentData++;
continue;
}
}
System.out.println("社員データ:"+nEmployeeData+"件");
System.out.println("部署データ:"+nDepartmentData+"件");
// 段階9
String ID = "";
for ( BaseData data : allData ) {
if ( data instanceof DepartmentData ) {
if ( ((DepartmentData)data).getNmDepartment().equals("システム開発事業部") ) {
ID = data.getPrimaryKeyValue();
}
}
}
for ( BaseData data : allData ) {
if ( data instanceof EmployeeData ) {
if ( ((EmployeeData)data).getIdDepartment().equals(ID) ) {
System.out.println(((EmployeeData)data).getNmEmployee()+" "+((EmployeeData)data).getMailAddress());
}
}
}
//====================表示====================
System.out.println(EmployeeData.COMPANY_NAME);
for ( BaseData employee : employees ) {
System.out.println(employee);
}
System.out.println("現在の社員データ件数:"+EmployeeData.getEmpCount()+"件");
//====================検索====================
while (true) {
System.out.println("検索したい社員IDを入力してください(終了する場合は0)");
Scanner sc = new Scanner(System.in);
String id = sc.nextLine();
if ( id.equals("0") ) {
System.out.println("システムを終了します");
break;
}
boolean matchId = false;
for ( BaseData employee : employees ) {
if ( employee.getPrimaryKeyValue().equals(id) ) {
matchId = true;
System.out.println(employee);;
}
}
if ( matchId==false ) {
System.out.println("該当する社員が見つかりませんでした");
}
}
}
}

View File

@@ -1,280 +0,0 @@
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Scanner;
public class MainNew {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Scanner sc = new Scanner(System.in);
while (true) {
// csvファイルからデータを読み込む
ArrayList<BaseData> allData = readCSV();
// 会社情報表示
//System.out.println(EmployeeData.COMPANY_NAME);
//====================管理機能====================
System.out.println("1:検索 2:登録 3:更新 4:削除 0:終了");
// 操作項目入力
String index = sc.nextLine();
// 入力1=検索
if (index.equals("1")) {
System.out.println("1:全検索 2:条件検索 それ以外:戻る");
String indexSearch = sc.nextLine();
if (indexSearch.equals("1")) {
// 全検索
displayEmployee(allData);
continue;
} else if (indexSearch.equals("2")) {
// 条件検索
searchEmployee(allData,sc);
continue;
} else {
continue;
}
}
// 入力2=登録
if (index.equals("2")) {
registerEmployee(allData,sc);
}
// 入力3=更新
if (index.equals("3")) {
updateEmployee(allData,sc);
}
// 入力4=削除
if (index.equals("4")) {
removeEmployee(allData,sc);
}
// 入力0=終了
if ( index.equals("0") ) {
System.out.println("システムを終了します");
break;
}
}
}
// csvファイルから情報を読み込む
public static ArrayList<BaseData> readCSV() {
ArrayList<BaseData> allData = new ArrayList<BaseData>();
try {
// 社員情報を読み込む
File empFile = new File("/Users/鈴木 皓介/Documents/em-oop/file/EmployeeData.csv");
String empline = "";
BufferedReader empbr = new BufferedReader(new InputStreamReader(new FileInputStream(empFile),"UTF-8"));
while ((empline=empbr.readLine())!=null) {
String[] data = empline.split(",",0);
BaseData employee = new EmployeeData(data[0],data[1],data[2],data[3],data[4],data[5]);
allData.add(employee);
}
// 部署情報を読み込む
File depFile = new File("/Users/鈴木 皓介/Documents/em-oop/file/DepartmentData.csv");
String depline = "";
BufferedReader depbr = new BufferedReader(new InputStreamReader(new FileInputStream(depFile),"UTF-8"));
while ((depline=depbr.readLine())!=null) {
String[] data = depline.split(",",0);
BaseData department = new DepartmentData(data[0],data[1]);
allData.add(department);
}
} catch (IOException err) {
System.exit(0);
}
return allData;
}
// csvファイルに社員データを書き込む
public static void writeEmployee(ArrayList<BaseData> allData) {
try {
// 社員情報を書き込む
File empFile = new File("/Users/鈴木 皓介/Documents/em-oop/file/EmployeeData.csv");
FileWriter empfr = new FileWriter(empFile);
for ( BaseData data : allData ) {
if ( data instanceof EmployeeData ) {
empfr.append(data.toCSV()+"\n");
}
}
empfr.close();
} catch (IOException err) {
System.exit(0);
}
}
// 全検索(社員情報表示)
public static void displayEmployee(ArrayList<BaseData> allData) {
for ( BaseData data : allData ) {
if ( data instanceof EmployeeData ) {
System.out.println(data);
}
}
System.out.println();
}
// 社員ID照合
public static boolean matchIdEmployee(ArrayList<BaseData> allData,String id) {
boolean isMatched = false;
for ( BaseData data : allData ) {
if ( data instanceof EmployeeData ) {
if ( data.getPrimaryKeyValue().equals(id) ) {
isMatched = true;
break;
}
}
}
return isMatched;
}
// ID照合→該当BaseData配列インデックス取得
public static int getIndexArray(ArrayList<BaseData> allData,String id) {
int index = 0;
for ( BaseData data : allData ) {
if ( data instanceof EmployeeData ) {
if ( data.getPrimaryKeyValue().equals(id) ) {
break;
}
}
index++;
}
return index;
}
// 条件検索
public static void searchEmployee(ArrayList<BaseData> allData,Scanner sc) {
System.out.println("検索したい社員IDを入力してください");
String id = sc.nextLine();
boolean isMatched = matchIdEmployee(allData,id);
if (isMatched==false) {
System.out.println("入力されたIDに該当する社員が見つかりませんでした");
}
if (isMatched==true) {
System.out.println(allData.get(getIndexArray(allData,id)));
}
System.out.println();
}
// 登録
public static void registerEmployee(ArrayList<BaseData> allData,Scanner sc) {
System.out.println("登録したい社員IDを入力してください");
String id = sc.nextLine();
boolean isMatched = matchIdEmployee(allData,id);
if (isMatched==false) {
String[] newdata = new String[6];
newdata[0] = id;
System.out.println("社員名を入力してください");
newdata[1] = sc.nextLine();
System.out.println("フリガナを入力してください");
newdata[2] = sc.nextLine();
System.out.println("メールアドレスを入力してください");
newdata[3] = sc.nextLine();
System.out.println("パスワードを入力してください");
newdata[4] = sc.nextLine();
System.out.println("部署IDを入力してください");
newdata[5] = sc.nextLine();
System.out.println("登録が完了しました");
allData.add(new EmployeeData(newdata[0],newdata[1],newdata[2],newdata[3],newdata[4],newdata[5]));
writeEmployee(allData);
}
if (isMatched==true) {
System.out.println("入力されたIDは既に登録されています");
}
}
// 更新
public static void updateEmployee(ArrayList<BaseData> allData,Scanner sc) {
System.out.println("更新したい社員IDを入力してください");
String id = sc.nextLine();
boolean isMatched = matchIdEmployee(allData,id);
if (isMatched==false) {
System.out.println("入力されたIDに該当する社員が見つかりませんでした");
}
if (isMatched==true) {
BaseData data = allData.get(getIndexArray(allData,id));
System.out.println("社員名を入力してください");
((EmployeeData)data).setNmEmployee(sc.nextLine());
System.out.println("フリガナを入力してください");
((EmployeeData)data).setKnEmployee(sc.nextLine());
System.out.println("メールアドレスを入力してください");
((EmployeeData)data).setMailAddress(sc.nextLine());
System.out.println("パスワードを入力してください");
((EmployeeData)data).setPassword(sc.nextLine());
System.out.println("部署IDを入力してください");
((EmployeeData)data).setIdDepartment(sc.nextLine());
System.out.println("更新が完了しました");
writeEmployee(allData);
}
}
// 消去
public static void removeEmployee(ArrayList<BaseData> allData,Scanner sc) {
System.out.println("削除したい社員IDを入力してください");
String id = sc.nextLine();
boolean isMatched = matchIdEmployee(allData,id);
if (isMatched==false) {
System.out.println("入力されたIDに該当する社員が見つかりませんでした");
}
if (isMatched==true) {
System.out.println("指定されたIDに該当する社員の情報を削除しますか? Y/y");
System.out.println("Y/y以外:キャンセル");
String flag = sc.nextLine();
if (flag.equals("Y")||flag.equals("y")) {
allData.remove(getIndexArray(allData,id));
System.out.println("削除が完了しました");
writeEmployee(allData);
}
}
}
}

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>実行例_20261020</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@@ -0,0 +1,11 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=21
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=21

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,10 @@
public abstract class BaseData {
public abstract String toString();
public abstract String toCSV();
public abstract String getPrimaryKeyValue();
}

View File

@@ -1,18 +1,10 @@
public class DepartmentData extends BaseData {
private String idDepartment;
private String nmDepartment;
public DepartmentData() {
}
public DepartmentData(String idDepartment,String nmDepartment) {
this.setIdDepartment(idDepartment);
this.setNmDepartment(nmDepartment);
}
public String getIdDepartment() {
return idDepartment;
}
@@ -31,19 +23,16 @@ public class DepartmentData extends BaseData {
@Override
public String toString() {
return this.getIdDepartment()+"\t"
+this.getNmDepartment();
return getIdDepartment() + "\t" + getNmDepartment();
}
@Override
public String toCSV() {
return this.getIdDepartment()+","
+this.getNmDepartment();
return getIdDepartment() + "," + getNmDepartment();
}
@Override
public String getPrimaryKeyValue() {
return this.getIdDepartment();
return getIdDepartment();
}
}

View File

@@ -1,123 +1,147 @@
public class EmployeeData extends BaseData {
static final String COMPANY_NAME = "Rhizome";
private static int empCount = 0;
//社員ID
private String idEmployee;
//社員名
private String nmEmployee;
//社員名カナ
private String knEmployee;
//メールアドレス
private String mailAddress;
//パスワード
private String password;
//部署ID
private String idDepartment;
//社員データ件数
private static int empCount = 0;
//コンストラクタ
public EmployeeData() {
empCount++;
}
public EmployeeData(String idEmployee,
//コンストラクタ
public EmployeeData(
String idEmployee,
String nmEmployee,
String knEmployee,
String mailAddress,
String password,
String idDepartment) {
this.setIdEmployee(idEmployee);
this.setNmEmployee(nmEmployee);
this.setKnEmployee(knEmployee);
this.setMailAddress(mailAddress);
this.setPassword(password);
this.setIdDepartment(idDepartment);
empCount++;
}
//ゲッター
public String getIdEmployee() {
return idEmployee;
}
public void setIdEmployee(String idEmployee) {
if (idEmployee.strip().length()==0) {
System.out.println("社員IDが空のため設定できませんでした");
System.exit(0);
} else {
this.idEmployee = idEmployee;
}
}
public String getNmEmployee() {
return nmEmployee;
}
public void setNmEmployee(String nmEmployee) {
if (nmEmployee.strip().length()==0) {
System.out.println("社員名が空のため設定できませんでした");
System.exit(0);
} else {
this.nmEmployee = nmEmployee;
}
}
public String getKnEmployee() {
return knEmployee;
}
public String getMailAddress() {
return mailAddress;
}
public String getPassword() {
return password;
}
public String getIdDepartment() {
return idDepartment;
}
//セッター
public void setIdEmployee(String idEmployee) {
if (idEmployee == null) {
System.out.println("社員IDが空のため設定できませんでした");
return;
}
if (idEmployee.trim().isEmpty()) {
System.out.println("社員IDが空のため設定できませんでした");
return;
}
this.idEmployee = idEmployee;
}
public void setNmEmployee(String nmEmployee) {
if (nmEmployee == null) {
System.out.println("社員名が空のため設定できませんでした");
return;
}
if (nmEmployee.trim().isEmpty()) {
System.out.println("社員名が空のため設定できませんでした");
return;
}
this.nmEmployee = nmEmployee;
}
public void setKnEmployee(String knEmployee) {
this.knEmployee = knEmployee;
}
public String getMailAddress() {
return mailAddress;
}
public void setMailAddress(String mailAddress) {
this.mailAddress = mailAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getIdDepartment() {
return idDepartment;
}
public void setIdDepartment(String idDepartment) {
this.idDepartment = idDepartment;
}
//toString
@Override
public String toString() {
return getIdEmployee() + "\t"
+ getNmEmployee() + "\t"
+ getKnEmployee() + "\t"
+ getMailAddress() + "\t"
+ getPassword() + "\t"
+ getIdDepartment();
}
//CSV形式へ変換
@Override
public String toCSV() {
return getIdEmployee() + ","
+ getNmEmployee() + ","
+ getKnEmployee() + ","
+ getMailAddress() + ","
+ getPassword() + ","
+ getIdDepartment();
}
//キー取得
@Override
public String getPrimaryKeyValue() {
return getIdEmployee();
}
//ID一致判定
public boolean isMatchId(String id) {
return getIdEmployee().equals(id);
}
//件数取得
public static int getEmpCount() {
return empCount;
}
@Override
public String toString() {
return this.getIdEmployee()+"\t"
+this.getNmEmployee()+"\t"
+this.getKnEmployee()+"\t"
+this.getMailAddress()+"\t"
+this.getPassword()+"\t"
+this.getIdDepartment();
}
// public boolean isMatchId(String id) {
// return id.equals(this.getIdEmployee()) ;
// }
@Override
public String toCSV() {
return this.getIdEmployee()+","
+this.getNmEmployee()+","
+this.getKnEmployee()+","
+this.getMailAddress()+","
+this.getPassword()+","
+this.getIdDepartment();
}
@Override
public String getPrimaryKeyValue() {
return this.getIdEmployee();
}
}

View File

@@ -0,0 +1,214 @@
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//社員データ格納用配列
//CSVから読み込んだ社員データを格納する
EmployeeData[] employees = new EmployeeData[100];
//読み込んだ件数管理用
int count = 0;
// EmployeeData.csv読込
try {
BufferedReader br =
new BufferedReader(new FileReader("C:\\Users\\石原 叶大\\Documents\\em-oop\\EmployeeData.csv"));
String line;
// CSVを1行ずつ読込
while ((line = br.readLine()) != null) {
//カンマ区切りで分割
String[] data = line.split(",");
// EmployeeData生成
EmployeeData employee = new EmployeeData();
//CSVの値をEmployeeDataへ設定
employee.setIdEmployee(data[0]);
employee.setNmEmployee(data[1]);
employee.setKnEmployee(data[2]);
employee.setMailAddress(data[3]);
employee.setPassword(data[4]);
employee.setIdDepartment(data[5]);
//配列へ格納
employees[count] = employee;
//件数加算
count++;
}
//ファイルクローズ
br.close();
} catch (IOException e) {
//CSV読込失敗
System.out.println("CSVの読み込みに失敗しました");
return;
}
//システム開始
System.out.println("システムを開始します");
//ループ
//0が入力されるまで繰り返す
while (true) {
System.out.println();
//メニュー表示
System.out.println("1:検索 2:登録 3:更新 4:削除 0:終了");
//メニュー入力
String menu = scanner.nextLine();
//システム終了
if (menu.equals("0")) {
System.out.println("システムを終了します");
break;
}
//検索機能
else if (menu.equals("1")) {
//検索メニュー表示
System.out.println("1:全検索 2:条件検索 それ以外:戻る");
String searchMenu = scanner.nextLine();
//全検索
if (searchMenu.equals("1")) {
// 読み込んだ全社員を表示
for (int i = 0; i < count; i++) {
System.out.println(employees[i]);
}
}
//社員ID検索
else if (searchMenu.equals("2")) {
//ID入力
System.out.println("IDを入力してください");
String id = scanner.nextLine();
//検索判定
boolean found = false;
//配列検索
for (int i = 0; i < count; i++) {
//社員ID比較
if (employees[i].getPrimaryKeyValue().equals(id)) {
//一致データ表示
System.out.println(employees[i]);
found = true;
break;
}
}
//見つからなかった場合
if (!found) {System.out.println("該当する社員が見つかりませんでした");
}
}
}
//社員登録機能
else if (menu.equals("2")) {
//新しい社員データ生成
EmployeeData employee = new EmployeeData();
//社員ID入力
System.out.println("社員IDを入力してください");
employee.setIdEmployee(scanner.nextLine());
//社員名入力
System.out.println("社員名を入力してください");
employee.setNmEmployee(scanner.nextLine());
//フリガナ入力
System.out.println("フリガナを入力してください");
employee.setKnEmployee(scanner.nextLine());
//メールアドレス入力
System.out.println("メールアドレスを入力してください");
employee.setMailAddress(scanner.nextLine());
//パスワード入力
System.out.println("パスワードを入力してください");
employee.setPassword(scanner.nextLine());
//部署ID入力
System.out.println("部署IDを入力してください");
employee.setIdDepartment(scanner.nextLine());
//配列へ追加
employees[count] = employee;
//CSVへ追記
try {
PrintWriter pw =
new PrintWriter(new FileWriter("C:\\Users\\石原 叶大\\Documents\\em-oop\\EmployeeData.csv",true));
//CSVに1行追加
pw.println(employee.toCSV());
pw.close();
} catch (IOException e) {
System.out.println("CSVへの保存に失敗しました");
return;
}
// 件数加算
count++;
System.out.println("登録が完了しました");
}
//更新機能
//未実装あとから使う
else if (menu.equals("3")) {
System.out.println("更新機能は未実装です");
}
//削除機能
//未実装あとから使う
else if (menu.equals("4")) {
System.out.println("削除機能は未実装です");
}
//入力ミス
else {
System.out.println("正しく入力してください");
}
}
scanner.close();
}
}

View File

@@ -1,3 +0,0 @@
@echo off
java -Dfile.encoding=Shift_JIS -jar em_oop.jar
pause