Java道|8章のまとめ

設計図から隊士を生み出し、情報を持たせ、技を使わせる。
8章で学んだJavaクラスの土台を、ここでしっかり固めよう。

8章では、Javaのオブジェクト指向の入口として、とても大切な内容を学びました。

これまでの学習では、変数、配列、条件分岐、繰り返しなどを使って、処理の流れを作ってきました。そこに8章では、クラスという考え方が加わりました。

クラスを使うと、情報と処理をひとまとまりにして整理できます。

鬼滅の刃でたとえると、8章はまさに、

隊士の設計図を作る
設計図から実際の隊士を生み出す
隊士に名前や体力を持たせる
隊士に技や行動を使わせる
必要なら、隊士から情報を報告してもらう

という流れを学んだ章です。

クラス、オブジェクト、フィールド、メソッド、引数、戻り値という言葉が別々の知識ではなく、ひとつの流れとしてつながって見えてくることが大切です。

クラスは隊士の設計図だった

8章で最初に押さえた大きな考え方が、クラスです。

クラスは、ひとことでいうと設計図です。

鬼滅の刃でたとえると、特定の隊士そのものではなく、

鬼殺隊士は名前を持つ
鬼殺隊士は体力を持つ
鬼殺隊士は自分の情報を表示できる
鬼殺隊士は任務に向かう行動ができる

というような、共通の型をまとめたものがクラスです。

たとえば、隊士の設計図には次のような内容を入れられます。

分類内容例鬼滅の刃でたとえると
情報name、stamina、breathingStyle名前、体力、呼吸の種類
動きshow、setStamina、getStamina状態表示、体力設定、体力報告

クラスは、単なるデータの置き場ではありません。
情報と処理をまとめて持てるところが大きな特徴です。

ここが、単独の変数や配列だけを使っていた段階との大きな違いです。

変数だけなら、名前や体力を別々に扱います。
しかしクラスを使うと、「隊士」というまとまりの中に、名前、体力、行動を一緒に整理できます。

Javaでは、このクラスを中心にしてプログラムを組み立てていきます。

クラスの中にはフィールドとメソッドが入る

クラスを理解するときに欠かせないのが、フィールドとメソッドです。

フィールドは、オブジェクトが持つ情報です。
メソッドは、オブジェクトができる動きです。

鬼滅の刃でたとえると、フィールドは隊士のプロフィールです。

名前
体力
階級
呼吸の種類

こうした情報がフィールドです。

一方でメソッドは、隊士が行える動きです。

情報を表示する
体力を設定する
名前を返す
任務へ向かう

こうした処理がメソッドです。

用語役割鬼滅の刃でたとえると
フィールド状態や性質を持つ隊士の名前、体力、呼吸
メソッド処理や動きを持つ状態表示、体力設定、報告
メンバフィールドとメソッドの総称隊士を構成する部品全体

この整理は8章全体を通して大切でした。

クラスを見るときは、まず「どんな情報を持っているのか」を確認します。
次に「どんな動きができるのか」を確認します。

この見方ができるようになると、Javaのコードがかなり読みやすくなります。

オブジェクトは設計図から作られる実体だった

クラスは設計図です。
ただし、設計図を書いただけでは、まだ実際の隊士は存在していません。

そこで必要になるのがオブジェクトです。

鬼殺隊士という設計図を用意しても、それだけでは水月という隊士も、炎真という隊士もまだ生まれていません。
設計図をもとにして、実際に作られた一人ひとりの隊士がオブジェクトです。

用語意味鬼滅の刃でたとえると
クラス設計図鬼殺隊士の型
オブジェクト設計図から作られた実体水月、炎真、風音などの個別の隊士

この関係は、オブジェクト指向の土台です。

クラスは「こういう情報や動きを持てます」と決めるものです。
オブジェクトは「実際にその情報を持って動くもの」です。

ここを分けて考えられるようになると、クラスを書くことと、オブジェクトを使うことの違いが見えてきます。

オブジェクトを作ると具体的な値を持てる

クラスの段階では、name や stamina という項目があるだけです。

つまり、名前を持てる、体力を持てる、という枠が決まっている状態です。

しかし、オブジェクトを作ると、その枠に具体的な値を入れられるようになります。

たとえば同じ DemonSlayer クラスから作られたオブジェクトでも、

水月オブジェクトの name は 水月
炎真オブジェクトの name は 炎真
水月オブジェクトの stamina は 100
炎真オブジェクトの stamina は 80

というように、それぞれ別々の値を持てます。

役割内容
クラス持てる情報の種類を決める
オブジェクト実際の具体的な値を持つ

鬼滅の刃でたとえると、「鬼殺隊士という設計図」と「水月という個別の隊士」は別物です。

設計図には、名前欄や体力欄があります。
個別の隊士には、その欄に実際の値が入っています。

この違いを意識できるようになったことは、8章の大きな成果です。

参照型の変数でオブジェクトを扱った

8章では、オブジェクトを扱う変数についても学びました。

クラス型の変数は、オブジェクトそのものを直接持っているというより、オブジェクトへのつながりを持つ参照型の変数です。

鬼滅の刃でたとえると、mizuki という変数は、水月という隊士本人ではなく、水月の居場所を示す札のようなものです。

その札をたどると、水月オブジェクトにたどり着けます。

この考え方があるから、

mizuki.name
mizuki.show()

のように、mizuki を通してオブジェクトの中にある情報や動きを使えます。

ものイメージ
オブジェクト実際の隊士
参照型の変数隊士へたどり着くための札
メンバアクセス札をたどって隊士の情報や動きを使うこと

最初は少し独特に感じるかもしれません。
ただ、この感覚が分かると、オブジェクトを使ったコードの読み方がぐっと安定します。

メンバアクセスでフィールドやメソッドを使えた

オブジェクトを作ると、その中にあるフィールドやメソッドを使えるようになります。

ここで出てきたのが、ドットを使ったメンバアクセスです。

フィールドへアクセスするなら、次のような形です。

mizuki.name
mizuki.stamina

メソッドを呼び出すなら、次のような形です。

mizuki.show()
mizuki.setStamina(100)

ドットは、「そのオブジェクトの中にあるメンバへ進む」ための道しるべです。

鬼滅の刃でたとえると、mizuki という札をたどって水月のところへ行き、そこから名前を見たり、体力を設定したり、報告させたりするようなイメージです。

書き方意味
mizuki.namemizuki が指す隊士の名前を見る
mizuki.staminamizuki が指す隊士の体力を見る
mizuki.show()mizuki が指す隊士に情報表示をさせる
mizuki.setStamina(100)mizuki が指す隊士の体力を設定する

このように、フィールドもメソッドも、どちらもオブジェクトの中にあるメンバとして扱います。

クラスの内側と外側で書き方が変わった

8章では、メンバへのアクセス方法が、クラスの外側と内側で少し違うことも学びました。

クラスの外側、たとえば main メソッドの中では、どのオブジェクトのメンバなのかを指定する必要があります。

そのため、

mizuki.name
mizuki.show()

のように、オブジェクトを指す変数名をつけて書きます。

一方で、クラスの内側では、自分自身のフィールドやメソッドを扱うことが多いです。

そのため、

name
stamina
show()

のように、そのまま書けます。

また、自分自身であることをはっきり示したいときには this を使えます。

場所フィールドの使い方メソッドの使い方
クラス外mizuki.namemizuki.show()
クラス内name / this.nameshow() / this.show()

鬼滅の刃でたとえると、クラスの外側から見るときは「どの隊士に命令するのか」を指定する必要があります。
しかし隊士本人の中で処理しているときは、「自分の名前」「自分の体力」をそのまま扱えます。

this は「この隊士自身」を表すものだと考えると分かりやすいです。

メソッドで処理をひとまとめにできた

8章では、メソッドの基本も学びました。

メソッドは、処理をひとまとめにして名前をつけたものです。

鬼滅の刃でたとえると、隊士が使える技や行動を、ひとつの形にまとめたものです。

たとえば、

自分の情報を表示する
体力を設定する
名前を返す
任務へ向かう

といった動きを、メソッドとして用意できます。

メソッドを使うと、同じ処理を何度も書かずにすみます。
必要なときに呼び出して使えばよいからです。

メソッドの基本的な流れは、次のようなものでした。

順番流れ
1呼び出し元からメソッドを呼ぶ
2メソッドの中の処理が実行される
3処理が終わると呼び出し元へ戻る

この流れが分かると、処理を部品として整理する考え方が身につきます。

引数を使うとメソッドへ値を渡せた

8章の後半では、引数を学びました。

引数を使うと、呼び出し元からメソッドへ値を渡せます。

たとえば、隊士の名前を設定するメソッドや、体力を設定するメソッドでは、外から値を受け取って処理を変えられました。

鬼滅の刃でたとえると、司令部から隊士へ、

名前は水月として登録せよ
体力は100として記録せよ

というように、具体的な値を渡しているイメージです。

ここで大切だったのが、仮引数と実引数です。

用語意味鬼滅の刃でたとえると
仮引数メソッド定義側で受け取る変数隊士側の受け取り欄
実引数呼び出し側から実際に渡す値司令部から渡す具体的な情報

たとえば、体力を100に設定するなら、100 が実引数です。
それを受け取るメソッド側の変数が仮引数です。

このしくみが分かると、同じメソッドでも渡す値によって処理結果が変わることが理解できます。

実引数には値そのものも変数も使えた

引数では、実引数として値そのものを直接渡すこともできました。
また、変数を使って渡すこともできました。

たとえば、体力100を直接渡すこともできます。
一方で、あらかじめ slayerStamina のような変数に100を入れておき、その変数を渡すこともできます。

ここで重要なのは、メソッドに渡るのは変数名そのものではなく、その中に入っている値だということです。

呼び出し側で使うものメソッドに渡るもの
100100
slayerStaminaslayerStamina の中に入っている値

また、呼び出し側の変数名と、メソッド側の仮引数名は同じである必要はありません。

鬼滅の刃でたとえると、司令部の書類では 体力 と書かれていて、隊士側の記録欄では s と書かれていても問題ありません。
大事なのは、そこに渡される値が正しく対応していることです。

複数の引数も使えた

8章では、引数は1つだけではないことも学びました。

たとえば、隊士の名前と体力をまとめて設定したい場合は、2つの引数を持つメソッドを作れます。

複数の引数を使うときは、カンマで区切って並べます。
そして、左から順番に実引数の値が仮引数へ渡されます。

順番呼び出し側の値メソッド側の受け取り
1名前名前用の仮引数
2体力体力用の仮引数

鬼滅の刃でたとえると、隊士登録の巻物に、

  1. 名前
  2. 体力

という順番で書き込むようなものです。

順番が大切です。
名前の欄には名前を、体力の欄には体力を渡す必要があります。

引数のないメソッドもあった

一方で、引数を持たないメソッドもありました。

たとえば、すでにオブジェクトが持っている情報を表示するだけなら、外から新しい値を受け取る必要はありません。

そのような場合は、引数なしのメソッドにできます。

メソッドの種類使う場面
引数あり外から値を受け取って処理したいとき
引数なしすでに持っている情報だけで処理できるとき

鬼滅の刃でたとえると、

体力を設定せよ → 外から体力の値が必要
現在の状態を報告せよ → すでに持っている情報だけでよい

という違いです。

この使い分けができるようになると、「このメソッドには何を渡すべきか」「何も渡さなくてよいか」を考えられるようになります。

戻り値を使うとメソッドから結果を受け取れた

8章の最後では、戻り値を学びました。

引数は、呼び出し元からメソッドへ値を渡すしくみです。
戻り値は、その逆で、メソッドから呼び出し元へ値を返すしくみです。

しくみ向き役割
引数呼び出し元 → メソッド値を渡す
戻り値メソッド → 呼び出し元値を返す

鬼滅の刃でたとえると、引数は司令部から隊士へ渡す任務情報です。
戻り値は、隊士から司令部へ返ってくる報告です。

たとえば、隊士の名前や体力を知りたいとき、メソッドからその値を返してもらえます。

戻り値を返すときには return を使いました。
また、戻り値を持つメソッドでは、返す値の型をメソッド名の前に書きました。

返す情報戻り値の型
名前String
体力int

戻り値が分かると、メソッドは「処理して終わり」ではなく、「結果を返して次の処理につなげるもの」として見えてきます。

戻り値があるメソッドとないメソッドを使い分けた

8章では、戻り値があるメソッドと、戻り値がないメソッドの違いも整理しました。

値を返すメソッドでは、String や int など、返す値に合った型を書きます。

値を返さないメソッドでは、void を書きます。

メソッドの種類書き方の考え方役割
戻り値あり返す値の型を書く結果を呼び出し元へ返す
戻り値なしvoid を書く処理だけを行う

鬼滅の刃でたとえると、

体力を報告する技 → 戻り値あり
状態を表示するだけの技 → 戻り値なし

という違いです。

この違いを理解できると、メソッドを見るときに「このメソッドは結果を返すのか」「処理だけを行うのか」を判断できるようになります。

図:クラスからオブジェクトが作られる流れ

↓クリックすると拡大表示されます。

この図が示していること

この図では、DemonSlayer クラスという設計図から、mizuki オブジェクトや enma オブジェクトが作られる流れを表しています。

クラスには、name や stamina といったフィールド、show や getStamina といったメソッドが定義されています。
そこから作られたオブジェクトは、それぞれ 水月 や 炎真 のような具体的な値を持ちます。

ここから分かるのは、クラスは「何を持てるか」を決めるもので、オブジェクトは「実際に何を持っているか」を表すものだということです。

図:8章で学んだ全体の流れ

↓クリックすると拡大表示されます。

この図が示していること

この図では、8章で学んだ内容をひとつの流れとして整理しています。

最初にクラスという設計図を作ります。
次に、その設計図からオブジェクトを作ります。
作られたオブジェクトには、フィールドやメソッドがあります。
それらをメンバアクセスで使い、必要に応じて引数で値を渡し、戻り値で結果を受け取ります。

ここから分かるのは、8章の内容は別々の用語の集まりではなく、「設計図から実体を作り、情報と処理をやり取りする」という一連の流れだということです。

8章で学んだ内容をひとつにつなげる

8章全体を流れとして見ると、次のようになります。

順番学んだこと鬼滅の刃でたとえると
1クラスを作る鬼殺隊士の設計図を作る
2フィールドを持たせる名前や体力の項目を用意する
3メソッドを持たせる状態表示や報告の技を用意する
4オブジェクトを作る実際の隊士を登場させる
5メンバにアクセスする隊士の情報や技を使う
6引数を渡す隊士へ情報を渡す
7戻り値を受け取る隊士から報告を受け取る

この流れがつながって見えることが、8章のいちばん大きなポイントです。

クラスは設計図。
オブジェクトは実体。
フィールドは情報。
メソッドは動き。
引数は渡す値。
戻り値は返ってくる値。

この関係をセットで理解できると、Javaのオブジェクト指向の入口がかなり見通しやすくなります。

これから先の学習につながる土台

8章で学んだ内容は、この先のJava学習の土台になります。

今後は、さらに本格的なオブジェクト指向のしくみを学んでいきます。

たとえば、

コンストラクタ
this
カプセル化
継承
オーバーライド
ポリモーフィズム
インターフェイス

といった内容です。

これらを理解するときにも、土台になるのは8章で学んだ内容です。

今後出てくる内容土台になる8章の知識
コンストラクタオブジェクトを作る考え方
thisクラス内で自分自身を扱う考え方
カプセル化フィールドとメソッドの関係
継承クラスを設計図として見る考え方
オーバーライドメソッドの役割
ポリモーフィズムオブジェクトとメソッド呼び出し
インターフェイスメソッドを約束として見る考え方

だからこそ、8章では用語を暗記するだけではなく、流れとして理解することが大切です。

鬼滅の刃でたとえると、いきなり高度な呼吸や連携技を覚える前に、まずは隊士の基本動作をしっかり身につける段階です。

設計図を作る。
実体を作る。
情報を持たせる。
動きを持たせる。
値を渡す。
結果を受け取る。

この流れをつかめていれば、次の章でより深いオブジェクト指向に進んだときも、かなり理解しやすくなります。