20 Commits

Author SHA1 Message Date
s-sakiyama
8fbfa99047 9段階目(何度でも検索できるようにしよう) 2026-09-15 16:06:53 +09:00
s-sakiyama
1c4b834578 8段階目(社員をID検索してみよう) 2026-09-15 15:43:55 +09:00
s-sakiyama
b8aa7238f6 7段階目(IDが一致するか調べるメソッドを作ろう) 2026-09-15 15:06:13 +09:00
s-sakiyama
d88468306f 9段階目(チェックをもう1つの項目にも広げ、コンストラクタと統一しよう) 2026-09-15 14:44:43 +09:00
s-sakiyama
968c5094a4 8段階目(セッターに簡単なチェックを入れてみよう) 2026-09-15 14:24:20 +09:00
s-sakiyama
3b6b23c883 7段階目(staticで社員データの件数を数えよう) 2026-09-15 14:03:03 +09:00
s-sakiyama
f143cf7ec2 6段階目(toStringをオーバーライドしよう) 2026-09-15 13:55:35 +09:00
s-sakiyama
b58fcecaa2 5段階目(EmployeeDataにコンストラクタを作ろう) 2026-09-15 13:34:30 +09:00
s-sakiyama
d98145e598 4段階目(EmployeeDataをカプセル化しよう) 2026-09-15 13:25:46 +09:00
s-sakiyama
3d026db061 3段階目(Studentクラスにコンストラクタとstaticメンバを追加しよう) 2026-09-15 13:08:33 +09:00
s-sakiyama
38620e220f 2段階目(Itemクラスをカプセル化し、toStringをオーバーライドしよう) 2026-09-15 13:02:03 +09:00
s-sakiyama
d4b07b24bf 1段階目(Bookクラスにコンストラクタを作ろう) 2026-09-15 13:01:42 +09:00
s-sakiyama
066af8799d Merge remote-tracking branch 'origin/main' into s-sakiyama 2026-09-15 12:37:00 +09:00
m-mun
e7a1d9851d 2日目のミッション課題を追加しました 2026-09-15 12:32:46 +09:00
s-sakiyama
27685ac25f 6段階目(複数の社員をまとめて表示してみよう) 2026-09-14 16:50:07 +09:00
s-sakiyama
3e82879f22 4段階目(EmployeeDataクラスの型を作ろう) 2026-09-14 16:37:11 +09:00
s-sakiyama
769fb977ca 3段階目(複数のインスタンスを扱ってみよう) 2026-09-14 16:32:27 +09:00
s-sakiyama
04da447bfe 2段階目(自分でクラスを宣言してみよう) 2026-09-14 16:32:12 +09:00
s-sakiyama
25802b8380 1段階目(用意されたクラスを使ってみよう) 2026-09-14 16:31:51 +09:00
s-sakiyama
be15630c5b 1段階目(用意されたクラスを使ってみよう) 2026-09-14 16:31:32 +09:00
20 changed files with 589 additions and 368 deletions

1
.gitignore vendored
View File

@@ -25,4 +25,3 @@ hs_err_pid*
replay_pid*
/.metadata/
/bin/

View File

@@ -0,0 +1,388 @@
# 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,10 +0,0 @@
public abstract class BaseData {
public abstract String toString();
public abstract String toCSV();
public abstract String getPrimaryKeyValue();
}

View File

@@ -2,12 +2,27 @@
public class BasicCheck1 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Book book = new Book();
book.title = "吾輩は猫である";
book.author = "夏目漱石";
book.price = 800;
System.out.println(book.title);
System.out.println(book.author);
System.out.println(book.price);
System.out.println();
//9/15段階1
Book book1 = new Book();
Book book2 = new Book("銀河鉄道の夜", "宮沢賢治", 500);
System.out.println(book1.title);
System.out.println(book1.author);
System.out.println(book1.price);
System.out.println(book1.title + "\n" + book1.author + "\n" + book1.price);
System.out.println(book2.title + "\n" + book2.author + "\n" + book2.price);
Book book2 = new Book("銀河鉄道の夜", "宮沢賢治", 500);
System.out.println(book2.title);
System.out.println(book2.author);
System.out.println(book2.price);
}

View File

@@ -1,23 +1,15 @@
public class BasicCheck2 {
public static void main(String[] args) {
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();
Student.getStudentCount();
System.out.println("現在の生徒数:" + Student.getStudentCount() + "人");
}
}

View File

@@ -1,31 +1,26 @@
public class BasicCheck3 {
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Item[] items = new Item[3];
items[0] = new Item();
items[1] = new Item();
items[2] = new Item();
for (int i = 0; i < items.length; i++) {
items[i] = new Item();
}
items[0].setName("ノート");
items[1].setName("消しゴム");
items[2].setName("鉛筆");
items[0].setPrice(120);
items[1].setPrice(80);
items[2].setPrice(60);
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);
System.out.println(items[i].getName() + " " + items[i].getPrice() + "円 (残り" + items[i].getStock() + "個) ");
// System.out.println("合計金額 " + items[i].totalPrice() + "円");
// System.out.println();
for (Item i : items) {
i.sell(5);
System.out.println(i);
}
}
}

View File

@@ -1,22 +1,20 @@
public class Book {
String title;
String author;
int price;
//コンストラクタ
public Book() {
this.title = "タイトル未設定";
this.author = "著者未設定";
this.price = 0;
title = "タイトル未設定";
author = "著者未設定";
price = 0;
}
//引数ありコンストラクタ
public Book(String title, String author, int price) {
this.title = title;
this.author = author;
this.price = price;
}
}

View File

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

View File

@@ -1,8 +0,0 @@
public class Day3Check1 {
public static void main(String[] args) {
Circle radius = new Circle(2);
radius.showInfo();
}
}

View File

@@ -1,11 +0,0 @@
public class Day3Check2 {
public static void main(String[] args) {
Rectangle rect = new Rectangle(3, 4);
rect.showInfo();
Greeting greeting = new JapaneseGreeting();
System.out.println(greeting.hello());
}
}

View File

@@ -1,11 +0,0 @@
public class Day3Check3 {
public static void main(String[] args) {
Shape shape1 = new Circle(2);
shape1.showInfo();
Shape shape2 = new Rectangle(3, 4);
shape2.showInfo();
}
}

View File

@@ -1,39 +0,0 @@
public class DepartmentData extends BaseData {
private String idDepartment, nmDepartment;
public DepartmentData(String idDepartment,String nmDepartment) {
this.setIdDepartment(idDepartment);
this.setNmDepartment(nmDepartment);
return;
}
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();
}
public String toCSV() {
return getIdDepartment() + "," + getNmDepartment();
}
public String getPrimaryKeyValue() {
return getIdDepartment();
}
}

View File

@@ -1,50 +1,61 @@
public class EmployeeData extends BaseData {
public class EmployeeData {
private String idEmployee;
private String nmEmployee;
private String knEmployee;
private String mailAddress;
private String password;
private String idDepartment;
private static int empCount = 0;
static final String COMPANY_NAME = "Rhizome";
static int getempCount() {
return empCount;
}
//コンストラクタ
public EmployeeData() {
empCount++;
}
static int getEmpCount() {
return empCount;
}
public EmployeeData(String idEmployee, String nmEmployee, String knEmployee, String mailAddress, String password,
String idDepartment) {
//引数ありコンストラクタ
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++;
}
@Override
public String toString() {
return this.idEmployee + "\t" + this.nmEmployee
+ "\t" + this.knEmployee + "\t" + this.mailAddress
+ "\t" + this.password + "\t" + this.idDepartment;
}
public boolean isMatchId(String id) {
return getIdEmployee().equals(id);
}
public static boolean isMatchId(EmployeeData[] employees, String id) {
for (EmployeeData e : employees) {
if (e.isMatchId(id))
return true;
}
return false;
}
public String getIdEmployee() {
return idEmployee;
}
public void setIdEmployee(String idEmployee) {
this.idEmployee = idEmployee;
if (idEmployee == null || idEmployee.strip().isEmpty()) {
System.out.println("社員IDが空のため設定できませんでした");
if (!check(idEmployee, "社員ID"))
return;
}
this.idEmployee = idEmployee;
}
public String getNmEmployee() {
@@ -52,12 +63,9 @@ public class EmployeeData extends BaseData {
}
public void setNmEmployee(String nmEmployee) {
this.nmEmployee = nmEmployee;
if (nmEmployee == null || nmEmployee.strip().isEmpty()) {
System.out.println("社員名が空のため設定できませんでした");
if (!check(nmEmployee, "社員名"))
return;
}
this.nmEmployee = nmEmployee;
}
public String getKnEmployee() {
@@ -92,30 +100,16 @@ public class EmployeeData extends BaseData {
this.idDepartment = idDepartment;
}
@Override
public String toString() {
return (this.getIdEmployee() + "\t" + this.getNmEmployee() + "\t" + this.getKnEmployee() + "\t"
+ this.getMailAddress() + "\t" + this.getPassword() + "\t" + this.getIdDepartment());
public static int getEmpCount() {
return empCount;
}
@Override
public String toCSV() {
return getIdEmployee() + "," + getNmEmployee() + "," + getKnEmployee() + "," + getMailAddress() + ","
+ getPassword() + "," + getIdDepartment();
}
public String getPrimaryKeyValue() {
return getIdEmployee();
}
public boolean isMatchId(String id) {
if (id == null || this.idEmployee == null) {
private boolean check(String str, String stringName) {
if (str == null || str.strip().length() == 0) {
System.out.println(stringName + "が空のため設定できませんでした");
return false;
}
return this.idEmployee.equals(id);
return true;
}
}

View File

@@ -1,6 +0,0 @@
public interface Greeting {
String hello();
}

View File

@@ -4,18 +4,17 @@ public class Item {
private int price;
private int stock;
public void sell(int amount) {
void sell(int amount) {
this.setStock(this.getStock() - amount);
}
public int totalPrice() {
return price * stock;
}
@Override
public String toString() {
return (getName() + " " + getPrice() + "円 (残り" + getStock() + "個");
return this.getName() + " " + this.getPrice() + "円(残り" + this.getStock() + "個)";
}
int totalPrice() {
return this.price * this.stock;
}
public String getName() {
@@ -41,5 +40,4 @@ public class Item {
public void setStock(int stock) {
this.stock = stock;
}
}

View File

@@ -1,8 +0,0 @@
public class JapaneseGreeting implements Greeting {
@Override
public String hello() {
return "こんにちは";
}
}

View File

@@ -1,130 +1,121 @@
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("会社名:" + EmployeeData.COMPANY_NAME);
// while (true) {
// Scanner scanner = new Scanner(System.in);
// System.out.println("検索したい社員IDを入力してください(終了する場合は0)");
// String input = scanner.nextLine();
BaseData[] employees = new BaseData[5];
// BaseData employee = new EmployeeData("10000", "山田龍也", "ヤマダタツヤ", "yamada@hoge.jp", "aaa", "10");
BaseData[] allData = new BaseData[11];
// EmployeeData employee = new EmployeeData("10000", "山田龍也", "ヤマダタツヤ",
// "yamada@hoge.jp", "aaa", "10");
// System.out.println(employee);
//
// System.out.println();
allData[0] = new EmployeeData("10000", "山田龍也", "ヤマダタツヤ", "yamada@hoge.jp", "aaa", "10");
allData[1] = new EmployeeData("10001", "高橋準", "タカハシジュン", "jtaka@hoge.jp", "bbb", "10");
allData[2] = new EmployeeData("10002", "麻枝史明", "マエダフミアキ", "fmak@hoge.jp", "ccc", "11");
allData[3] = new EmployeeData("10003", "丸戸章介", "マルトショウスケ", "marusyo@hoge.jp", "ddd", "12");
allData[4] = new EmployeeData("10004", "三宅武", "ミタケタケシ", "miya@hoge.jp", "eee", "13");
allData[5] = new DepartmentData("10", "役員");
allData[6] = new DepartmentData("11", "人事・総務部");
allData[7] = new DepartmentData("12", "経理");
allData[8] = new DepartmentData("13", "システム開発事業部");
allData[9] = new DepartmentData("14", "教育事業部");
allData[10] = new DepartmentData("15", "営業企画部");
// String targetDeptId = "";
//
// for (int i = 0; i < allData.length; i++) {
//
// if (allData[i] instanceof DepartmentData) {
// DepartmentData dept = (DepartmentData) allData[i];
//
// if (dept.getNmDepartment().equals("システム開発事業部")) {
// targetDeptId = dept.getIdDepartment();
// break;
// }
// }
// }
//
// for (int i = 0; i < allData.length; i++) {
// if (allData[i] instanceof EmployeeData) {
// EmployeeData emp = (EmployeeData) allData[i];
// if (emp.getIdDepartment().equals(targetDeptId)) {
// System.out.println(emp.getNmEmployee() + "\t" + emp.getMailAddress());
// }
// }
// }
// int count = 0;
// int countt = 0;
// for (int i = 0; i < allData.length; i++) {
// if (allData[i] instanceof EmployeeData) {
// // count++;
// EmployeeData emp = (EmployeeData) allData[i];
//
// System.out.println(emp.getMailAddress());
// else if (allData[i] instanceof DepartmentData) {
// countt++;
// }
// System.out.println("社員のデータ:" + count + "件");
// System.out.println("部署のデータ:" + countt + "件");
// System.out.println(allData[i]);
// employees[0] = new EmployeeData("10000", "山田龍也", "ヤマダタツヤ", "yamada@hoge.jp", "aaa", "10");
// employees[1] = new EmployeeData("10001", "高橋準", "タカハシジュン", "jtaka@hoge.jp", "bbb", "10");
// employees[2] = new EmployeeData("10002", "麻枝史明", "マエダフミアキ", "fmak@hoge.jp", "ccc", "11");
// employees[3] = new EmployeeData("10003", "丸戸章介", "マルトショウスケ", "marusyo@hoge.jp", "ddd", "12");
// employees[4] = new EmployeeData("10004", "三宅武", "ミタケタケシ", "miya@hoge.jp", "eee", "13");
// //
// for (int i = 0; i < employees.length; i++) {
// System.out.println(allData[i]);
// }
// System.out.println("現在の社員データ件数:" + EmployeeData.getEmpCount() + "件");
if (allData[0] instanceof EmployeeData) {
EmployeeData sampleEmp = (EmployeeData) allData[0];
sampleEmp.setNmEmployee("");
}
if (allData[0] instanceof EmployeeData) {
EmployeeData sampleEmp = (EmployeeData) allData[0];
sampleEmp.setIdEmployee("");
EmployeeData[] employees = new EmployeeData[5];
for (int i = 0; i < employees.length; i++) {
employees[i] = new EmployeeData();
}
// String serchId1 = "10002";
// System.out.println(serchId1 + "を検索します");
// boolean bo = false;
// for (int i = 0; i < employees.length; i++) {
// if (((EmployeeData) employees[i]).isMatchId(serchId1)) {
// bo = true;
// break;
// }
//
// }
// System.out.println(bo);
// String serchId2 = "99999";
// System.out.println(serchId2 + "を検索します");
// boolean bl = false;
// for (int i = 0; i < employees.length; i++) {
// if (((EmployeeData) employees[i]).isMatchId(serchId2)) {
// bl = true;
// break;
// }
// }
// System.out.println(bl);
employees[0].setIdEmployee("10000");
employees[0].setNmEmployee("山田龍也");
employees[0].setKnEmployee("ヤマダタツヤ");
employees[0].setMailAddress("yamada@hoge.jp");
employees[0].setPassword("aaa");
employees[0].setIdDepartment("10");
// boolean a = false;
// for (int i = 0; i < employees.length; i++) {
// if (((EmployeeData) employees[i]).isMatchId(input)) {
// a = true;
// System.out.println(employees[i]);
// break;
//
// }
// }
// if (!a) {
// System.out.println("該当する社員が見つかりませんでした");
// }
// if (input.equals("0")) {
// System.out.println("システムを終了します");
// break;
// }
employees[1].setIdEmployee("10001");
employees[1].setNmEmployee("高橋準\t");
employees[1].setKnEmployee("タカハシジュン");
employees[1].setMailAddress("jtaka@hoge.jp");
employees[1].setPassword("bbb");
employees[1].setIdDepartment("10");
// System.out.println(employee.toCSV());
// System.out.println(employee.getPrimaryKeyValue());
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("三宅武\t");
employees[4].setKnEmployee("ミヤケタケシ");
employees[4].setMailAddress("miya@hoge.jp");
employees[4].setPassword("eee");
employees[4].setIdDepartment("13");
for (EmployeeData e : employees) {
System.out.println(e);
;
}
System.out.println("現在の社員のデータ件数:" + EmployeeData.getEmpCount() + "件");
System.out.println();
//nullおよび前後の空白を取り除いた結果が空文字チェック
EmployeeData emp = new EmployeeData("10000", "デフォルト", "ヤマダタツヤ", "yamada@hoge.jp", "aaa", "10");
System.out.println(emp);
emp.setNmEmployee(null);
System.out.println(emp);
emp.setNmEmployee("   ");
System.out.println(emp);
System.out.println();
EmployeeData emptyEmployee = new EmployeeData("", "", "", "", "", "");
System.out.println(emptyEmployee);
System.out.println();
//IDが一致するか
boolean matchIdBool = false;
System.out.println("10002 を検索します");
for (EmployeeData e : employees) {
matchIdBool = e.isMatchId("10002");
if (matchIdBool)
break;
}
System.out.println(matchIdBool);
System.out.println("99999 を検索します");
System.out.println(EmployeeData.isMatchId(employees, "99999"));
System.out.println("10003 を検索します");
System.out.println(EmployeeData.isMatchId(employees, "10003"));
System.out.println();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("検索したい社員IDを入力してください(終了する場合は0)");
System.out.print(">>>>");
String findId = scanner.nextLine();
if (findId.equals("0")) {
System.out.println("システムを終了します");
return;
}
boolean matchFlag = false;
for (EmployeeData e : employees) {
if (e.isMatchId(findId)) {
System.out.println(e);
matchFlag = true;
break;
}
}
if (!matchFlag) {
System.out.println("該当する社員が見つかりませんでした");
}
System.out.println();
}
}
}

View File

@@ -1,17 +0,0 @@
public class Rectangle extends Shape{
private double width;
private double height;
public Rectangle(double width, double height) {
super("四角形");
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}

View File

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

View File

@@ -2,23 +2,19 @@
public class Student {
int studentId;
String name;
static int studentCount = 0;
public void printProfile () {
void printProfile() {
System.out.println("学籍番号:" + this.studentId + " 名前:" + this.name);
}
public Student(int studentId, String name) {
this.studentId = studentId;
this.name = name;
studentCount++;
}
static int getStudentCount() {
public static int getStudentCount() {
return studentCount;
}
}