Java超|8章のまとめ

設計図からサイヤ人戦士を生み出し、情報を持たせ、技を使わせ、必要なら結果を受け取る。8章で学んだJavaクラスの土台を、ここでしっかり固めよう。

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

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

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

ドラゴンボールの世界観でたとえると、8章はまさに、

サイヤ人戦士の設計図を作る。
設計図から悟空やベジータのような実体を生み出す。
戦士に名前、戦闘力、流派の印、流派名を持たせる。
戦士に情報表示や登録などの技を使わせる。
必要なら、戦士から名前や戦闘力を報告してもらう。

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

クラス、オブジェクト、フィールド、メソッド、引数、戻り値という言葉は、別々の知識ではありません。
「設計図から実体を作り、その実体に情報と動きを持たせ、値を渡したり受け取ったりする」という、ひとつの流れとしてつながっています。

クラスはサイヤ人戦士の設計図だった

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

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

ドラゴンボールでたとえると、悟空そのもの、ベジータそのもの、悟飯そのものがクラスなのではありません。

クラスは、

サイヤ人戦士は名前を持つ。
サイヤ人戦士は戦闘力を持つ。
サイヤ人戦士は流派の印を持つ。
サイヤ人戦士は流派名を持つ。
サイヤ人戦士は自分の情報を表示できる。
サイヤ人戦士は情報を設定したり、報告したりできる。

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

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

分類内容例ドラゴンボールでのイメージ
情報name、power、styleMark、styleName名前、戦闘力、流派の印、流派名
動きshow、setPower、getPower状態表示、戦闘力設定、戦闘力報告

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

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

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

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

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

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

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

ドラゴンボールでたとえると、フィールドは戦士のプロフィールです。

名前。
戦闘力。
流派の印。
流派名。

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

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

情報を表示する。
戦闘力を設定する。
名前を返す。
流派名を返す。
戦士情報をまとめて登録する。

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

用語役割ドラゴンボールでのイメージ
フィールド状態や性質を持つ戦士の名前、戦闘力、流派
メソッド処理や動きを持つ状態表示、戦闘力設定、報告
メンバフィールドとメソッドの総称戦士を構成する部品全体

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

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

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

流派の情報もフィールドとして整理できる

8章の学習では、名前や戦闘力だけでなく、流派の印と流派名もフィールドとして扱いました。

この記事では、流派を次のように整理します。

styleMarkstyleName
亀仙流
鶴仙流
武泰斗流
カリン流
ピッコロ魔族流
神流(ナメック流)
惑星戦士流
北の界王流

たとえば悟空オブジェクトなら、次のような情報を持てます。

フィールド意味
name悟空戦士の名前
power9000戦闘力
styleMark流派の印
styleName亀仙流流派名

styleMark は、道着の右胸にある丸い流派マークのようなものです。
styleName は、そのマークが表す正式な流派名です。

このように、クラスには「戦士として必要な情報」をフィールドとしてまとめておけます。

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

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

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

サイヤ人という設計図を用意しても、それだけでは悟空という戦士も、ベジータという戦士も、悟飯という戦士もまだプログラムの中には生まれていません。

設計図をもとにして、実際に作られた一人ひとりの戦士がオブジェクトです。

用語意味ドラゴンボールでのイメージ
クラス設計図サイヤ人戦士の型
オブジェクト設計図から作られた実体悟空、ベジータ、悟飯などの個別の戦士

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

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

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

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

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

つまり、名前を持てる、戦闘力を持てる、流派の印を持てる、流派名を持てる、という枠が決まっている状態です。

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

同じ Saiyan クラスから作られたオブジェクトでも、次のように別々の値を持てます。

オブジェクトnamepowerstyleMarkstyleName
goku悟空9000亀仙流
vegetaベジータ8500惑星戦士流
gohan悟飯7000ピッコロ魔族流

同じ設計図から作っていても、オブジェクトごとに中身の値は別々です。

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

ドラゴンボールでたとえると、「サイヤ人戦士という設計図」と「悟空という個別の戦士」は別物です。

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

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

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

この図が示していること

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

クラスには、name、power、styleMark、styleName といったフィールド、show() や getPower() といったメソッドが定義されています。

そこから作られたオブジェクトは、それぞれ 悟空、ベジータ、悟飯 のような具体的な値を持ちます。

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

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

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

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

ドラゴンボールでたとえると、goku という変数は、悟空本人そのものではなく、悟空オブジェクトへたどり着くための札のようなものです。

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

この考え方があるから、

goku.name
goku.show()

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

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

最初は少し独特に感じるかもしれません。

ただ、この感覚が分かると、オブジェクトを使ったコードの読み方がぐっと安定します。

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

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

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

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

goku.name
goku.power
goku.styleMark
goku.styleName

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

goku.show()
goku.setPower(9000)
goku.getPower()

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

ドラゴンボールでたとえると、goku という札をたどって悟空のところへ行き、そこから名前を見たり、戦闘力を設定したり、情報を報告させたりするようなイメージです。

書き方意味
goku.namegoku が指す戦士の名前を見る
goku.powergoku が指す戦士の戦闘力を見る
goku.styleMarkgoku が指す戦士の流派の印を見る
goku.styleNamegoku が指す戦士の流派名を見る
goku.show()goku が指す戦士に情報表示をさせる
goku.setPower(9000)goku が指す戦士の戦闘力を設定する

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

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

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

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

そのため、

goku.name
goku.show()

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

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

そのため、

name
power
show()

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

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

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

ドラゴンボールでたとえると、クラスの外側から見るときは「どの戦士に命令するのか」を指定する必要があります。

しかし戦士本人の中で処理しているときは、「自分の名前」「自分の戦闘力」「自分の流派」をそのまま扱えます。

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

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

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

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

ドラゴンボールでたとえると、戦士が使える技や行動を、ひとつの形にまとめたものです。

たとえば、

自分の情報を表示する。
戦闘力を設定する。
名前を返す。
流派情報を返す。
戦士情報をまとめて登録する。

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

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

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

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

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

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

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

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

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

ドラゴンボールでたとえると、管理画面から悟空オブジェクトへ、

名前は悟空として登録せよ。
戦闘力は9000として記録せよ。
流派の印は亀として記録せよ。
流派名は亀仙流として登録せよ。

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

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

用語意味ドラゴンボールでのイメージ
仮引数メソッド定義側で受け取る変数戦士側の受け取り欄
実引数呼び出し側から実際に渡す値管理画面から渡す具体的な情報

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

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

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

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

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

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

呼び出し側で使うものメソッドに渡るもの
90009000
warriorPowerwarriorPower の中に入っている値
warriorNamewarriorName の中に入っている値
warriorStyleNamewarriorStyleName の中に入っている値

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

ドラゴンボールでたとえると、管理画面の項目名では 戦闘力 と書かれていて、Saiyan クラス側の受け取り欄では p と書かれていても問題ありません。

大事なのは、そこに渡される値と型が正しく対応していることです。

複数の引数も使えた

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

たとえば、戦士の名前、戦闘力、流派の印、流派名をまとめて設定したい場合は、複数の引数を持つメソッドを作れます。

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

順番呼び出し側の値メソッド側の受け取り
1名前名前用の仮引数
2戦闘力戦闘力用の仮引数
3流派の印流派の印用の仮引数
4流派名流派名用の仮引数

ドラゴンボールでたとえると、戦士登録カードに、

名前。
戦闘力。
流派の印。
流派名。

という順番で記入欄があるようなものです。

順番が大切です。

名前の欄には名前を、戦闘力の欄には戦闘力を、流派の印の欄には 亀 のような印を、流派名の欄には 亀仙流 のような正式名を渡す必要があります。

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

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

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

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

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

ドラゴンボールでたとえると、

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

という違いです。

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

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

この図が示していること

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

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

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

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

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

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

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

ドラゴンボールでたとえると、引数は管理画面から悟空へ渡す戦士情報です。
戻り値は、悟空から管理画面へ返ってくる報告です。

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

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

返す情報戻り値の型
名前String
戦闘力int
流派の印String
流派名String

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

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

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

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

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

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

ドラゴンボールでたとえると、

戦闘力を報告する技 → 戻り値あり。
状態を表示するだけの技 → 戻り値なし。
戦士情報を登録する技 → 戻り値なしの場合が多い。

という違いです。

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

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

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

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

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

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

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

図:引数と戻り値で情報をやり取りする

この図が示していること

この図は、引数と戻り値の向きの違いを示しています。

setSaiyanData("悟空", 9000, "亀", "亀仙流") では、呼び出し元から goku オブジェクトへ値を渡しています。
これは引数の流れです。

一方、getName() や getPower() では、goku オブジェクトの中にある値が呼び出し元へ返ってきます。
これは戻り値の流れです。

また、void は値を返さないメソッド、String や int は値を返すメソッドに使う型であることも示しています。

この図から分かることは、メソッドは値を受け取るだけでなく、処理結果を返すこともできるということです。

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

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

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

たとえば、

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

といった内容です。

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

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

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

ドラゴンボールでたとえると、いきなりスーパーサイヤ人への進化や高度な連携技を覚える前に、まずはサイヤ人戦士としての基本動作をしっかり身につける段階です。

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

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