Java入門|10章のまとめ

クラスの応用がわかると、ドラゴンボールみたいにオブジェクトの世界が一気につながる

10章では、クラスそのものを作る基本だけでなく、すでに用意されているクラスを使う方法や、オブジェクト同士をつないで扱う考え方を学びました。ここまでくると、Javaのオブジェクト指向は、単にクラスを作って終わりではなく、複数の戦士をどう管理するか、どう受け渡すか、どうまとめて扱うかまで見えてきます。

ドラゴンボールでたとえると、悟空、ベジータ、悟飯、ピッコロといった戦士を1人ずつ見る段階から進んで、戦士どうしの関係仲間への受け渡しチームとしての管理まで考える段階に入ったイメージです。10章で学ぶ内容はどれも地味に見えるかもしれませんが、実際のプログラムではとても大切です。ここを理解すると、オブジェクト指向のコードがぐっと自然に読めるようになります。

クラスライブラリのクラスを使うとコードを作りやすくなる

Javaでは、自分でクラスを作るだけでなく、最初から用意されている便利なクラスを使うことができます。これがクラスライブラリです。

ドラゴンボールの世界で考えると、自分で一から修行場や道具を作るのではなく、最初から存在する便利な施設や道具を活用する感じです。たとえば、精神と時の部屋のように「すでに用意された仕組み」を使えたら、毎回ゼロから環境を作らなくてすみますよね。Javaのクラスライブラリもそれに近いです。

たとえば文字を扱うための String、数値変換に使える Integer、計算のための Math などは、すでに用意されている便利なクラスです。これらを使えば、自分で細かな処理を全部書かなくても、必要な機能をすぐに使えます。

クラスライブラリを使う良さ

観点内容
手間一から機能を作らなくてよい
安心感よく使われる仕組みがすでに整っている
読みやすさ何をしたいコードなのか伝わりやすい
実用性実際の開発ではライブラリ活用がとても重要

Javaの勉強を始めたばかりのころは、自分で書いたクラスに意識が向きやすいですが、実務では既存のクラスを使いこなす力もとても大事です。ドラゴンボールでも、戦士の強さは本人の力だけでなく、道具や技術、環境の活用でも大きく変わります。それと同じです。

クラス型の変数には同じクラスの変数を代入できる

ここはオブジェクト指向でとても大事なポイントです。

クラス型の変数には、同じクラスのオブジェクトを参照している別の変数を代入できます。これは、オブジェクトそのものを丸ごとコピーしているというより、同じオブジェクトを指す情報を渡している感覚で理解するのが大切です。

ドラゴンボールでたとえると、悟空本人が2人に増えるわけではなく、**「あの悟空を見ている人が増える」**ようなイメージです。界王様もクリリンも、同じ悟空を見ているだけで、悟空が複製されたわけではありません。

たとえば、Goku 型の変数があるとして、その変数を別の同じ型の変数へ代入したとします。すると、2つの変数は同じ悟空オブジェクトを指すことになります。

イメージ表

変数名指しているもの
gokuA悟空オブジェクト
gokuB悟空オブジェクト

この状態では、gokuA から見ても gokuB から見ても、相手は同じ実体です。だから、どちらかを通じて状態を変えれば、もう一方から見てもその変化が見えます。

この感覚は、あとでフィールドや仮引数や配列を理解するときにもつながってきます。10章の内容はそれぞれ別々ではなく、実はここで全部つながっています。

null を代入するとオブジェクトを指さなくなる

クラス型の変数に null を代入すると、その変数はどのオブジェクトも指していない状態になります。

ドラゴンボールでたとえるなら、スカウターの表示先が消えて、誰にもロックオンしていない状態です。前までは悟空を追っていたのに、null を入れると「今は誰も見ていない」状態になります。

null のイメージ

状態意味
warriorRef が悟空を指している悟空オブジェクトを参照中
warriorRef に null を代入したどの戦士も参照していない

ここで注意したいのは、変数がオブジェクトを指さなくなったからといって、必ずしもそのオブジェクト自体が即座に消えるわけではないことです。ほかにそのオブジェクトを指している変数があれば、まだ使えます。

たとえば、

  • kaiou が悟空を指している
  • krillin も悟空を指している
  • kaiou に null を代入した

という状態なら、kaiou は悟空を見失いますが、krillin はまだ悟空を見ています。つまり、悟空オブジェクトはまだ使えます。

この null はとてもよく出てくるので、何も入っていないではなく、どのオブジェクトも指していないと理解するのがポイントです。

フィールドにクラス型の変数を使える

オブジェクトの中には、int や String だけでなく、別のオブジェクトへの参照をフィールドとして持たせることができます。

これはオブジェクト指向らしさが強く出る部分です。

ドラゴンボールでたとえるなら、戦士オブジェクトの中に「師匠」や「仲間」や「ライバル」を入れておけるイメージです。たとえば悟飯オブジェクトが、師匠としてピッコロを参照しているような形です。

たとえのイメージ

クラスフィールド意味
Warriormentor師匠となる戦士を指す
Warriorrivalライバルを指す
Teamleaderチームのリーダーを指す

こうすると、オブジェクトどうしの関係を自然に表現できます。

たとえば悟飯に mentor というフィールドがあり、そこにピッコロを入れておけば、悟飯には師匠がいるという関係をプログラムの中で表せます。これは単なる数値の保存ではなく、オブジェクトどうしのつながりそのものを表しているわけです。

オブジェクト指向では、こうした「もの」と「もの」の関係を扱うことがとても重要です。ドラゴンボールの世界でも、戦士を1人ずつ見るだけではなく、誰が誰に教わったか、誰が誰と組んでいるかを考えると、世界が一気に立体的になります。Javaでも同じです。

メソッドの仮引数としてクラス型の変数を使える

メソッドの仮引数にもクラス型の変数を使えます。つまり、メソッドにオブジェクトを渡すことができます。

ドラゴンボールでいえば、界王様が「次はこの戦士を修行させよう」と、戦士そのものを指定して処理をする感じです。数値だけを渡すのではなく、悟空というオブジェクトそのものを渡すイメージです。

たとえば train というメソッドが Warrior 型の仮引数 trainee を受け取るとします。すると、そのメソッドは trainee が指している戦士に対して修行処理を行えます。

ここで大事なのは、渡しているのはオブジェクトのコピーではなく、そのオブジェクトを指す情報だという点です。だから、受け取った側でそのオブジェクトの状態を変えると、呼び出し元から見ても変化が反映されます。

イメージ表

役割内容
呼び出し元悟空オブジェクトをメソッドへ渡す
仮引数受け取った側でその悟空を参照する
結果修行後の状態変化がそのまま見える

これは現実のプログラムで非常によく使います。たとえば、

  • 戦士を回復する
  • 戦士の名前を表示する
  • 戦士をチームに登録する
  • 戦士の能力を更新する

といった処理は、オブジェクトをメソッドに渡すことで自然に実現できます。

オブジェクトを配列で扱える

10章の中でも特に実用的なのが、オブジェクトを配列でまとめて扱う考え方です。

ドラゴンボールでいえば、悟空、ベジータ、悟飯、ピッコロを1人ずつ別々に見るのではなく、Z戦士のメンバー一覧としてまとめて管理するようなものです。

もし戦士が1人だけなら、単独の変数で十分です。でも人数が増えてくると、1人ずつ別の変数を用意するのは大変です。そこで配列を使うと、複数のオブジェクトをひとまとめに管理できます。

オブジェクト配列のイメージ

配列の位置入っているオブジェクト
warriors[0]悟空
warriors[1]ベジータ
warriors[2]悟飯
warriors[3]ピッコロ

こうしておけば、繰り返し処理を使って全員に同じ処理を行えます。たとえば、

  • 全員の名前を表示する
  • 全員の戦闘力を確認する
  • 全員に修行メニューを与える
  • 全員の必殺技を順番に表示する

といったことがやりやすくなります。

これはポリモーフィズムの考え方とも相性がよく、同じ親クラス型の配列でさまざまな戦士をまとめて扱えるようになると、オブジェクト指向らしいコードが書きやすくなります。

10章の内容をドラゴンボールでつなげて整理する

ここまでの内容を、ドラゴンボールの世界で一気につなげてみます。

まず、Javaには便利なクラスライブラリがあり、必要な機能をすぐ使えます。これは修行や道具の仕組みがすでに整っている世界を活用する感じです。

次に、クラス型の変数はオブジェクトを指します。同じオブジェクトを複数の変数が指すこともできます。これは複数の仲間が同じ戦士を認識している状態です。

さらに、null を入れると、その変数は誰も指さなくなります。スカウターの対象が消えたような状態です。

そして、フィールドにクラス型を使えば、戦士が師匠や仲間を覚えておけます。メソッドの仮引数にクラス型を使えば、特定の戦士を修行や戦闘の対象として渡せます。最後に、配列を使えば複数の戦士をチームとしてまとめて管理できます。

つまり10章は、オブジェクトを1つ作る段階から進んで、オブジェクトどうしを関係づけ、まとめて扱い、実際のプログラムらしく使う段階を学ぶ章だったといえます。

10章で押さえたいポイント一覧

学んだ内容ドラゴンボールでのたとえ大事な理解
クラスライブラリの利用便利な修行場や道具を活用する既存の仕組みを使うと効率がよい
同じクラス型の代入同じ悟空を複数の人が見ているコピーではなく同じ対象を指す
null の代入誰にもロックオンしていない参照が切れる
フィールドにクラス型を使う師匠や仲間を持つオブジェクト間の関係を表せる
仮引数にクラス型を使う戦士を指定して修行させるオブジェクトを受け渡せる
オブジェクトの配列Z戦士を一覧で管理する複数のオブジェクトをまとめて扱える

この図では、10章で学んだ内容が1枚でつながるように配置されています。

まず左上のクラスライブラリ部分では、Javaには最初から使える便利なクラスがあることを表しています。ここは「自分で全部作らなくてもよい」という発想を視覚的に理解するための部分です。

中央の Warrior 型の変数から同じ悟空オブジェクトへ矢印が伸びている部分は、同じクラス型の変数を代入すると、同じオブジェクトを指すことを示しています。ここで「2つに増える」のではなく、「同じ1つを見る」が大切な感覚です。

その近くにある null の表示は、変数がどのオブジェクトも指さなくなる状態を表しています。参照が切れる、という感覚をつかみやすくなります。

左下の悟飯オブジェクトとピッコロオブジェクトのつながりは、フィールドにクラス型の変数を使えることを表しています。悟飯が mentor としてピッコロを持つことで、オブジェクトどうしの関係が表現できるわけです。

右下の train(Warrior fighter) は、メソッドの仮引数にクラス型が使えることを示しています。戦士オブジェクトをメソッドに渡し、その戦士に対して処理を行うイメージです。

一番下の配列部分は、複数の戦士オブジェクトをまとめて扱う考え方を表しています。ここが見えると、配列は単なる数字の入れ物ではなく、仲間たちを整理して並べる入れ物だとイメージしやすくなります。

この10章で見えてくるオブジェクト指向の広がり

10章の内容は、クラスを定義するだけの段階から一歩進んで、オブジェクトを現実的に使い回すための知識が集まっています。ここがわかると、Javaのコードの見え方がかなり変わってきます。

オブジェクトは1つずつ独立しているだけではありません。

  • 同じオブジェクトを複数の変数で参照できる
  • 参照を切ることもできる
  • 別のオブジェクトを中に持てる
  • メソッドに渡せる
  • 配列でまとめられる

このように、オブジェクトはつながりの中で使われます。

ドラゴンボールでも、悟空を1人だけ見ていても物語の全体像はつかみにくいですが、悟飯との関係、ピッコロとの関係、仲間たちとの連携まで見ると、一気に世界が広がって見えます。Javaのオブジェクト指向もまさにそれと同じで、10章はその広がりを感じられる大切な内容です。