19 Commits

Author SHA1 Message Date
d5e8dc56f8 3日目_4段階 2026-09-24 14:41:36 +09:00
0c12fcb008 2日目_段階9 2026-09-24 12:54:50 +09:00
8efaa1341f 2日目_段階8 2026-09-24 12:34:11 +09:00
b13acdba05 2日目_7段階 2026-09-24 10:40:00 +09:00
2094ebac56 2日目_6段階 2026-09-24 09:59:27 +09:00
9e19a2c2b9 2日目_5段階 2026-09-18 16:03:17 +09:00
86473bb137 2日目_4段階 2026-09-18 15:03:23 +09:00
c31f27f461 1日目_段階6 2026-09-18 13:58:15 +09:00
28b8e508f3 1日目_段階4 2026-09-18 12:45:55 +09:00
1f57c5b7e0 1日目_段階4 2026-09-18 12:45:29 +09:00
2c6742fd26 2日目_段階3完了 2026-09-18 10:56:38 +09:00
9780db9a8f ミッション課題 2026-09-18 10:28:27 +09:00
439556d4cc Day3課題2
q5の1~3まで終了
2026-09-17 13:55:31 +09:00
012cbcd562 3日目_1段階 2026-09-16 15:59:09 +09:00
f4acecff05 1日目_段階4_完了 2026-09-15 16:12:18 +09:00
cdf731795f 一日目_段階3_完了 2026-09-15 15:50:41 +09:00
c82f9ca678 2日目_段階1_完了 2026-09-15 14:36:27 +09:00
7559a7dfa7 段階2完了いたしました。 2026-09-14 16:36:18 +09:00
43567c0e0c 1段階目完了 2026-09-14 15:14:17 +09:00
21 changed files with 725 additions and 495 deletions

6
.classpath Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="src" path="em-oop/src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

1
.gitignore vendored
View File

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

17
.project Normal file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>java-cui-em-oop</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

@@ -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`で自分の情報を表現できる、完成形にかなり近い姿になりました。
今日書いたコードも消さずに残しておいてください。次回以降のミッションで、継承・多態性・コレクション・例外処理・ファイル入出力などを習いながら、最終的に本物の「社員メンテナンス(ファイルシステム版)」システムに近づけていきます。

8
em-oop/src/BaseData.java Normal file
View File

@@ -0,0 +1,8 @@
public abstract class BaseData { //”abstract”classと宣言。
public abstract String toString(); //以下3つの抽象メソッドを宣言 中身無し
public abstract String toCSV();
public abstract String getPrimaryKeyValue();
}

View File

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

View File

@@ -1,12 +1,37 @@
public class BasicCheck2 { public class BasicCheck2 {
public static void main(String[] args) { public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
Student student = new Student(); // Student student = new Student(3,"a");
student.studentId = 1; //Student型のstudentを宣言、インスタンスを代入する
student.name = "鈴木一郎"; Student student1 = new Student(1,"鈴木一郎");
student.printProfile(); Student student2 = new Student(2, "田中花子");
Student student3 = new Student(3,"佐藤次郎");
// student1.studentId = 1;
// student1.name = "鈴木一郎";
// //studentIDに1,nameに鈴木一郎を代入
//
// student2.studentId = 2;
// student2.name ="田中花子";
//
// student3.studentId = 3;
// student3.name ="佐藤次郎";
//
//studentのprintProfileメソッドを呼び出す
student1.printProfile();
student2.printProfile();
student3.printProfile();
Student.getStudentCount();
} }
} }
//
//System.out.print("学籍番号"+student.studentId);
//System.out.print("名前:" + student.name);

View File

@@ -1,26 +1,53 @@
public class BasicCheck3 { public class BasicCheck3 {
public static void main(String[] args) { public static void main(String[] args){
// TODO 自動生成されたメソッド・スタブ
Item[] items = new Item[3];
for (int i = 0; i < items.length; i++) {
items[i] = new Item();
}
items[0].name = "ノート";
items[0].price = 120;
items[0].stock = 50;
items[1].name = "消しゴム";
items[1].price = 80;
items[1].stock = 30;
items[2].name = "鉛筆";
items[2].price = 60;
items[2].stock = 100;
for (Item i : items) {
i.sell(5);
System.out.println(i.name + " " + i.price + "円 残り" + i.stock + "個 合計金額" + i.totalPrice() + "円"); Item[] items = new Item[3];
items[0] = new Item();
items[0].setName("ノート");
items[0].setPrice(80);
items[0].setStock(50);
items[1] = new Item();
items[1].setName("ノート");
items[1].setPrice(120);
items[1].setStock(30);
items[2] = new Item();
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("在庫");
for(int i = 0; i < items.length; i ++) {
//items[i]をprintlnに渡すとitemクラスのtoStringが自動で呼ばれる
System.out.println(items[i]);
// System.out.println("商品名" + items[i].name+ "価格" + items[i].price +"在庫" + items[i].stock);
// System.out.println("価格" + items[i].price);
// System.out.println("在庫" + items[i].stock);
}
// Item 0 = new Item("ノート", 120, 50);
} }
} }

View File

@@ -1,6 +1,24 @@
public class Book { public class Book {
String title; public String title;
String author; public String author;
int price; public int price;
//引数なしコンストラクタ
public Book() {
this.title = "タイトル未設定";
this.author = "著者未設定";
this.price = 0;
// System.out.println("コンストラクタが呼び出されました");
}
//引数ありコンストラクタ
public Book(String title, String author, int price) {
// System.out.println("引数なしのコンストラクタが呼び出されました");
this.title = title;
this.author = author;
this.price = price;
}
} }

21
em-oop/src/Circle.java Normal file
View File

@@ -0,0 +1,21 @@
public class Circle extends Shape { //shapeクラスを継承する
private double radius; //radius: 半径 フィールドradius (double型、private)
public Circle(double radius) { //コンストラクタpub 引数dou/raを受け取る
super("円"); //"円"呼び出し 文字列
this.radius = radius; //radiusフィールドにも引数の値を代入する。
}
public double area() { //Overrideは 子クラスで!
return Math.PI * radius * radius;
}
public void showInfo(){
super.showInfo();
System.out.println("(半径:" + this.radius + ")");
}
}

View File

@@ -0,0 +1,14 @@
public class Day3Check1 {
public static void main(String[] args) {
Circle circle = new Circle(2);
circle.area();
circle.showInfo();
// Rectangle rectangle = new Rectangle(2);
// rectangle.area();
}
}

View File

@@ -0,0 +1,22 @@
public class Day3Check2 {
public static void main(String[] args) {
//Rect-クラスをもとにrect-のインスタンスつくる
//3,4をRectangleのコンストラクタに渡す
Rectangle rectangle = new Rectangle(3, 4);
//Rect-はShapeを継承しているため親クラスのshowInfoメソッドを使える
rectangle.showInfo();
//JaGrクラスをもとにインスタンスをつくる
//変数の型はGreetingインタフェース型にしている
Greeting greeting = new JapaneseGreeting();
//greeetingのhelloメソッドよびだす
//実際に入っているインスタンスはJaGrなのでJaGrで作ったhello()が実行される
System.out.println(greeting.hello());
}
}

View File

@@ -0,0 +1,15 @@
public class Day3Check3 {
public static void main(String[] args) {
//Shape型の変数にCircleのインスタンスを代入
Shape shape1 = new Circle(2);
//円の情報を表示
shape1.showInfo();
//Shape型の変数にRectangleのインスタンスを代入
Shape shape2 = new Rectangle(3, 4);
//四角形の情報を表示
shape2.showInfo();
}
}

View File

@@ -1,15 +1,158 @@
public class EmployeeData { public class EmployeeData extends BaseData {
String idEmployee;
String nmEmployee;
String knEmployee;
String mailAddress;
String password;
String idDepartment;
void showInfo() { private String idEmployee;
System.out.println(this.idEmployee + "\t" + this.nmEmployee private String nmEmployee;
+ "\t" + this.knEmployee + "\t" + this.mailAddress private String knEmployee;
private String mailAddress;
private String password;
private String idDepartment;
//staticをつけたフィールドはクラス変数:全てのインスタンスで共有される変数
public static int empCount = 0;
// boolean isMatchID = isMatchId(idEmployee);//IdEmployeeが一致するか判断
@Override
public String toCSV(){
return getIdEmployee() + "," + getNmEmployee() + "," + getKnEmployee() + ","
+ getMailAddress() +"," + getPassword() +"," + getIdDepartment() + ","; //フィールドの値をゲッターを使ってカンマ区切り、returnする。
}
@Override
public String getPrimaryKeyValue() {
return idEmployee;
}
//idEmployee「ID」を取得するgetter
public String getIdEmployee() {
return idEmployee;
}
//idEmployee「ID」を設定するsetter
public void setIdEmployee(String idEmployee) {
if(idEmployee == null || idEmployee.trim().isEmpty()) {
System.out.println("社員IDが空のため設定できませんでした");
return;
}
this.idEmployee = idEmployee;
}
//nmEmployee「名前」を取得するgetter
public String getNmEmployee() {
return nmEmployee;
}
//nmEmployee「名前」を設定するsetter
public void setNmEmployee(String nmEmployee) {
// this.nmEmployee = nmEmployee.trim();
if (nmEmployee == null || nmEmployee.trim().isEmpty()) {
System.out.println("社員名が空のため設定できませんでした");
return;
}
this.nmEmployee = nmEmployee;
}
//getKnEmployee「カタカナの名前」を取得するgetter
public String getKnEmployee() {
return knEmployee;
}
//getKnEmployee「カタカナの名前」を設定するsetter
public void setKnEmployee(String knEmployee) {
this.knEmployee = knEmployee;
}
//メールアドレスを取得するgetter
public String getMailAddress() {
return mailAddress;
}
//メールアドレスを設定するsetter
public void setMailAddress(String mailAddress) {
this.mailAddress = mailAddress;
}
//パスワードを取得するgetter
public String getPassword() {
return password;
}
//パスワードを取得するsetter
public void setPassword(String password) {
this.password = password;
}
//IdDepartmentを設定するgetter
public String getIdDepartment() {
return idDepartment;
}
//IdDepartmentを取得するsetter
public void setIdDepartment(String idDepartment) {
this.idDepartment = idDepartment;
}
//メソッド名:isMatchId 引数:String id 戻り値:boolean ID一致ならtrue,違えばfalse
public boolean isMatchId(String id) {
return this.idEmployee.equals(id);
}
public EmployeeData(String idEmployee, String nmEmployee,
String knEmployee, String mailAddress, String password, String idDepartment) {
this.setIdEmployee(idEmployee); //2d 段階9
// this.idEmployee = idEmployee;
this.setNmEmployee(nmEmployee);
// this.nmEmployee = nmEmployee;
this.setKnEmployee(knEmployee);
// this.knEmployee = knEmployee;
this.setMailAddress(mailAddress);
// this.mailAddress = mailAddress;
this.setPassword(password);
// this.password = password;
this.setIdEmployee(idEmployee);
// this.idDepartment = idDepartment;
empCount++;
}
// public boolean isMatchId(String id) {
//// if(idEmployee equals )
// {
//
// }
//
// }
// public String Employee(String idEmployee) {
// this.idEmployee= idEmployee;
// }
public EmployeeData() {
empCount++;
// TODO 自動生成されたコンストラクター・スタブ
}
public static int getEmpCount() { //empCountの値を返せるようにする
return empCount;
}
// void showinfo() { //showinfo->toStringにメソッド名変更 + アクセス修飾子publicつける
// // this.idEmployee = idEmployee;
// System.out.println(this.idEmployee + "\t" + this.nmEmployee + "\t" + this.knEmployee + "\t" + this.mailAddress
// + "\t" + this.password + "\t" + this.idDepartment);
//
// }
@Override
public String toString() {
return (this.idEmployee + "\t" + this.nmEmployee + "\t" + this.knEmployee + "\t" + this.mailAddress
+ "\t" + this.password + "\t" + this.idDepartment); + "\t" + this.password + "\t" + this.idDepartment);
} }
} }

4
em-oop/src/Greeting.java Normal file
View File

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

View File

@@ -1,14 +1,54 @@
public class Item { public class Item {
String name; //フィールドを宣言・外から触れないようにprivate
int price; private String name;
int stock; private int price;
private int stock;
void sell(int amount) { //nameを取得するgetter
this.stock -= amount; public String getName() {
return name;
} }
int totalPrice() { //nameを設定するsetter
return this.price * this.stock; public void setName(String name) { //item="ノート"はもう使えない。item[0].setName("ノート")にしている
this.name = name;
} }
//priceを取得するgetter
public int getPrice() {
return price;
}
//priceを設定するsetter
public void setPrice(int price) {
this.price = price;
}
//stockを取得するgetter
public int getStock() {
return stock;
}
public void setStock(int stock) {
this.stock = stock;
}
// Item(String name, int price, int stock){
// this.name = name;
// this.price = price;
// this.stock = stock;
// }
//売れた数を在庫から引く
public void sell(int amount) {
this.setStock(this.getStock() - amount);
}
//Itemの情報を文字列として返す
@Override
public String toString() {
return getName() + "" + getPrice() + "円(残り" + getStock() + "個)";
}
} }

View File

@@ -0,0 +1,13 @@
//JaGrクラスを作る、implements GrによってGreetingインターフェースを実装する
public class JapaneseGreeting implements Greeting {
//Grインターフェースで定義されているhello()メソッドをこのクラスに実装する
@Override
public String hello() {
//hello()が呼び出されたらString型の文字列を呼び出し元に返す
return "こんにちは";
}
}

View File

@@ -1,63 +1,195 @@
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
EmployeeData employee = new EmployeeData(); EmployeeData employee = new EmployeeData();
// String idEmployee = "10000";
// String nmEmployee = "山田龍也";
// String knEmployee = "ヤマダタツヤ";
// String mailAddress = "yamada@hoge.jp";
// String password = "aaa";
// String idDepartment = "10";
employee.idEmployee = "10000"; // EmployeeData[] employees = new EmployeeData[5];
employee.nmEmployee = "山田龍也";
employee.knEmployee = "ヤマダタツヤ";
employee.mailAddress = "yamada@hoge.jp";
employee.password = "aaa";
employee.idDepartment = "10";
employee.showInfo(); // employees[1] = new Employee;
EmployeeData[] employees = new EmployeeData[5]; // employees[0] = new EmployeeData();
for (int i = 0; i < employees.length; i++) {
employees[i] = new EmployeeData();
}
//やり方わからないのでごり押し // employees[0] = new EmployeeData("10000", "山田龍也", "ヤマダタツヤ", "yamada@hoge.jp", "aaa", "10");
employees[0].idEmployee = "10000"; employee.setIdEmployee("10000"); //private 後 に使用する!!
employees[0].nmEmployee = "山田龍也"; employee.setNmEmployee("山田龍也"); //段階 8 確認用
employees[0].knEmployee = "ヤマダタツヤ"; employee.setKnEmployee("ヤマダタツヤ");
employees[0].mailAddress = "yamada@hoge.jp"; employee.setMailAddress("yamada@hoge.jp");
employees[0].password = "aaa"; employee.setPassword("aaa");
employees[0].idDepartment = "10"; employee.setIdDepartment("10");
employees[1].idEmployee = "10001"; // employees[0].idEmployee = "1000"; //段階5の分に s[0] 足した //privete 前 に使用!!!!!!
employees[1].nmEmployee = "高橋準"; // employees[0].nmEmployee = "山田龍也";
employees[1].knEmployee = "タカハシジュン"; // employees[0].knEmployee = "ヤマダタツヤ";
employees[1].mailAddress = "jtaka@hoge.jp"; // employees[0].mailAddress = "yamada@hoge.jp";
employees[1].password = "bbb"; // employees[0].password = "aaa";
employees[1].idDepartment = "10"; // employees[0].idDepartment = "10";
employees[2].idEmployee = "10002"; //
employees[2].nmEmployee = "麻枝史明"; // employees[1] = new EmployeeData();
employees[2].knEmployee = "マエダフミアキ"; // employees[1] = new EmployeeData("10000", "高橋準", "タカハシジュン", "jtaka@hoge.jp", "bbb", "10");
employees[2].mailAddress = "fmak@hoge.jp";
employees[2].password = "ccc";
employees[2].idDepartment = "11";
employees[3].idEmployee = "10003"; // employees[1].setIdEmployee ( "10001");
employees[3].nmEmployee = "丸戸章介"; // employees[1].setNmEmployee ( "高橋準");
employees[3].knEmployee = "マルトショウスケ"; // employees[1].setKnEmployee ( "タカハシジュン");
employees[3].mailAddress = "marusyo@hoge.jp"; // employees[1].setMailAddress ("jtaka@hoge.jp");
employees[3].password = "ddd"; // employees[1].setPassword ("bbb");
employees[3].idDepartment = "12"; // employees[1].setIdDepartment("10");
employees[4].idEmployee = "10004"; // employees[1].idEmployee = "10001";
employees[4].nmEmployee = "三宅武"; // employees[1].nmEmployee = "高橋準";
employees[4].knEmployee = "ミヤケタケシ"; // employees[1].knEmployee = "タカハシジュン";
employees[4].mailAddress = "miya@hoge.jp"; // employees[1].mailAddress = "jtaka@hoge.jp";
employees[4].password = "eee"; // employees[1].password = "bbb";
employees[4].idDepartment = "13"; // employees[1].idDepartment = "10";
for (EmployeeData e : employees) { //
e.showInfo(); // employees[2] = new EmployeeData();//各employee[]をコメントアウトしていたからエラー! employeeに何の箱を入れるかを表記
} // employees[2] = new EmployeeData("10002", "麻枝文明", "マエダフミアキ", "fmak@hoge.jp", "ccc", "11");
// 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[2].idEmployee = "10002";
// employees[2].nmEmployee = "麻枝文明";
// employees[2].knEmployee = "マエダフミアキ";
// employees[2].mailAddress = "fmak@hoge.jp";
// employees[2].password = "ccc";
// employees[2].idDepartment = "11";
// //
// employees[3] = new EmployeeData();
// employees[3] = new EmployeeData("10003", "丸戸章介", "マルトショウスケ", "marusyo@hoge.jp", "ddd", "12");
// 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[3].idEmployee = "10003";
// employees[3].nmEmployee = "丸戸章介";
// employees[3].knEmployee = "マルトショウスケ";
// employees[3].mailAddress = "marusyo@hoge.jp";
// employees[3].password = "ddd";
// employees[3].idDepartment = "12";
// //
// employees[4] = new EmployeeData();
// employees[4] = new EmployeeData("10004", "三宅武", "ミヤケタケシ", "miya@hoge.jp", "eee", "13");
// employees[4].setIdEmployee("10004");
// employees[4].setNmEmployee("三宅武");
// employees[4].setKnEmployee("ミヤケタケシ");
// employees[4].setMailAddress("miya@hoge.jp");
// employees[4].setPassword("eee");
// employees[4].setIdDepartment("13");
//
// employees[4].idEmployee = "10004";
// employees[4].nmEmployee = "三宅武";
// employees[4].knEmployee = "ミヤケタケシ";
// employees[4].mailAddress = "miya@hoge.jp";
// employees[4].password = "eee";
// employees[4].idDepartment = "13";
//employees[5]= new EmployeeData("10005", , "タカヤマアカネ", "takayamaa@hoge.jp", "taka", "14");
// Scanner scanner = new Scanner(System.in); //8段階目!スキャナー作成
// while (true) { //while(true)- 9段階目課題
// System.out.println("検索したい社員IDを入力してください"); //検索するID入力
// //キーボードから入力されたIDをsearchIdに入れている
// String searchId = scanner.nextLine();
//
// if (searchId.equals("0")) { //0が入力された場合はシステム終了
// System.out.println("システムを終了します");
// break; //while文を終了 システム終了
// }
// //社員が見つかったかを判定する変数
// boolean found = false;
// //employee配列を順番に確認
// for (int i = 0; i < employees.length; i++) {
// //employeesのi番目のIDと、入力された社員IDは一致するか確認
// if (employees[i].isMatchId(searchId)) {
// System.out.println(employees[i]); //2d6段階:showinfoから変更
//// employees[i].showinfo(); //一致した社員の情報を表示
// found = true; //見つかったことを記録
// break; //検索終了 for文を終了
// }
// }
//
// if (!found) { //社員が見つからなかったら
// System.out.println("該当する社員が見つかりませんでした。");
// }
// }
// //Scannerを閉じる
// scanner.close();
// System.out.println(employees[0]);
// System.out.println(employees[1]);
// System.out.println(employees[2]);
// System.out.println(employees[3]);
// System.out.println(employees[4]);
// System.out.println(employees[5]);
//5人分のインスタンスをすべて生成し終えた後にクラス名から呼び出し、件数表示
// System.out.println("現在の社員データ件数:" + EmployeeData.empCount + "件");
// employees[0].showinfo();
// employees[1].showinfo();
// employees[2].showinfo();
// employees[3].showinfo();
// employees[4].showinfo();
//
// String searchId = "10002"; //7段階目!※コメントアウト中
// boolean found = false;
//
// System.out.println(searchId + "を検索します");
//
// for(int i = 0; i < employees.length; i++) {
// if(employees[i].isMatchId(searchId)) {
// found = true;
// break;
// }
// }
//
// System.out.println(found);
//
// searchId = "99999";
// found = false;
//
// System.out.println(searchId + "を検索します");
//
// for(int i = 0; i < employees.length; i++) {
// if(employees[i].isMatchId(searchId)) {
// found = true;
// break;
// }
// }
// System.out.println(found); //7段階目の確認用コード
// employees[0].showinfo();
// employees[1].showinfo();
// employees[2].showinfo();
// employees[3].showinfo();
// employees[4].showinfo();
// System.out.println(employee +"," +idEmployee +"," + nmEmployee +"," + knEmployee +"," + mailAddress +"," + password + "," +idDepartment);
System.out.println(employee.toCSV());
System.out.println(employee.getPrimaryKeyValue());
// System.out.println(employee);
// System.out.println(idEmployee);
// System.out.println(nmEmployee);
// System.out.println(knEmployee);
// System.out.println(mailAddress);
// System.out.println(password);
// System.out.println(idDepartment);
} }

22
em-oop/src/Rectangle.java Normal file
View File

@@ -0,0 +1,22 @@
public class Rectangle extends Shape {
private double width;
private double height; {
}
public Rectangle(double width, double height) {
super("四角形");
this.width = width;
this.height = height;
}
public double area() {
return width * height;
}
// public void showInfo(){
// super.showInfo();
// System.out.println("(半径:" + this.area + ")");
// }
}

36
em-oop/src/Shape.java Normal file
View File

@@ -0,0 +1,36 @@
public abstract class Shape {
private String name; //フィールドname ・privateにしなきゃいけない
// public double area;
// public int radius;
public Shape() {
}
public Shape(String name) {
this.name = name; //Circleが"円"を呼び出すための文字列をいれるところ
}
public abstract double area();{ //メソッドarea 引数なし・戻り値double 中身return0.0;
// return 0.0;
}
// @Override
public void showInfo(){ //メソッドshowinfo 引数戻り値なし・中身はsyso
System.out.println(this.name + "の面積は" + this.area() + "です");
// System.out.println("(半径:" + this.radius + ")");
System.out.println("四角形" + "の面積は" + this.area() + "です。");
}
// @Override
// public void showInfo(){
//
// }
}

View File

@@ -1,9 +1,53 @@
public class Student { public class Student {//クラス新規作成
int studentId;
String name;
void printProfile() { int studentId; //フィールドを宣言 int
String name; //String
static int studentCount = 0; //生徒が何人作られたかを数えるための、クラス全体で共有するフィールド
void printProfile() {//メソッドを宣言・以下の内容をsysoで出力
// for(int i = 0; i <= 3; i++) {
System.out.println("学籍番号:" + this.studentId + " 名前:" + this.name); System.out.println("学籍番号:" + this.studentId + " 名前:" + this.name);
// }
// System.out.println("学籍番号:" + this.studentId + " 名前:" + this.name);
} }
public Student(int studentId, String name) { //コンストラクタを追加
this.studentId = studentId; //渡された引数をそれぞれ対応するフィールドに代入する
this.name = name;
studentCount++;
}
public static int getStudentCount() {
// studentCount++;
return studentCount;
}
} }
// public static void main(String[] args) {
// Student s = new Student(1,"鈴木一郎");
// s.printProfile();
//
//
// public Student(int studentId, String name) {
// student.studentId = 1;