Java入門|13章のまとめ

クラスの置き場所を整えるだけで、Javaのプログラムはもっと強く、もっとわかりやすくなる

13章では、これまで学んできたJavaの文法やクラスの使い方を、より大きなプログラムへ広げていくための考え方を学びました。小さなプログラムなら、1つのファイルの中にいくつかのクラスを書いても、それほど困ることはありません。でも、登場するクラスが増え、役割が細かく分かれ、さらに複数人で開発するようになると、それまでの書き方だけでは整理しきれなくなってきます。

そこで大切になるのが、クラスを分けて管理する考え方です。13章では、クラスを別ファイルに分ける方法、パッケージで分類する方法、別パッケージのクラスを使う方法、import によって書き方をすっきりさせる方法、さらにサブパッケージやクラスライブラリとの関係まで学びました。

ドラゴンボールでたとえるなら、登場人物が増えてきたときに、悟空、ベジータ、ピッコロ、悟飯たちが全員同じ場所で無秩序に動いていたら、誰が何をしているのか見えにくくなってしまいますよね。そこで、戦士ごとの役割、修行の場、技の系統、所属チームを整理すると、物語がぐっとわかりやすくなります。Javaのクラス整理も、それととてもよく似ています。13章は、そうした大きなプログラムを整然と構築するための土台を身につける章でした。

13章で学んだことの全体像

13章で扱った内容を大きく整理すると、次のようになります。

テーマ学んだこと
ファイルの分割クラスを別ファイルに分けて管理する
パッケージクラスをグループにまとめて整理する
同じパッケージの利用同じグループ内のクラスを自然に使う
異なるパッケージの利用public と パッケージ名.クラス名 で別グループのクラスを使う
import別パッケージのクラスを簡単に使う
サブパッケージパッケージを階層化してさらに整理する
クラスライブラリとの関係標準ライブラリもパッケージで整理されていることを理解する
モジュールパッケージより上位の整理の考え方を知る

13章は、文法を新しく大量に覚える章というより、クラスをどう整理し、どう使い分けるかを学ぶ章だったと言えます。

クラスをファイルに分ける意味

クラスが増えてきたら、まず必要になるのがファイルの分割です。
クラスごとにファイルを分けることで、役割がはっきりし、修正箇所も見つけやすくなります。

ドラゴンボールで考えると、悟空の設定資料、ベジータの設定資料、ピッコロの設定資料が、全部1枚の紙にびっしり書かれていたらとても読みづらいですよね。戦士ごとに資料を分けておけば、必要な情報をすぐ確認できます。Javaでも同じで、クラスごとにファイルを分けることで、プログラムの見通しがよくなります。

分けない場合分けた場合
クラスの役割が混ざりやすいクラスごとの責任が明確になる
修正箇所を探しにくい必要なファイルをすぐ開ける
複数人で作業しにくい分担しやすい

この考え方は、大規模な開発ではほぼ必須です。
つまり、ファイル分割は読みやすさのためでもあり、開発しやすさのためでもあります。

パッケージはクラスの所属チームのようなもの

ファイルを分けるだけでも整理しやすくなりますが、それだけではまだ十分ではありません。
関連するクラスをさらにグループとして整理するために使うのがパッケージです。

ドラゴンボールでたとえるなら、クラスはそれぞれの戦士、パッケージはその戦士たちの所属チームのようなものです。たとえば、

  • 戦士クラスの集まり
  • 修行関連クラスの集まり
  • 対戦管理クラスの集まり

というように、役割ごとにチーム分けするイメージです。

パッケージを使うと、同じ名前のクラスがあっても区別しやすくなります。
これは、大規模なプログラムでとても大切です。

整理方法意味
ファイルクラス単位の整理
パッケージクラス群の整理
パッケージ名.クラス名クラスの正式な所属を含めた名前

つまり、クラス名だけではなく、どのパッケージに属するクラスなのかまで意識することで、Javaの整理力は大きく高まります。

同じパッケージのクラスは連携しやすい

同じパッケージに含まれるクラスどうしは、比較的自然に利用できます。
これは、同じチームに所属している戦士どうしが連携しやすいのに似ています。

たとえば、戦士の情報を表すクラスと、その戦士を使って処理を進めるクラスが同じパッケージにあれば、利用側はあまりパッケージを意識せずに書きやすくなります。

ここで大事なのは、同じパッケージにいるクラスは、同じ分類の仲間として扱われるという感覚です。
13章では、このことがパッケージの基本としてとても重要でした。

異なるパッケージのクラスはそのままでは使えない

同じパッケージのクラスは使いやすい一方で、別のパッケージにあるクラスを使うときには少し注意が必要になります。
異なるパッケージにあるクラスは、そのまま単純にクラス名だけで使うことはできません。

ドラゴンボールでたとえると、別の組織や別の宇宙の戦士に連絡を取るようなものです。名前だけ呼んでも相手が誰なのかわかりにくいので、所属まで含めてはっきり示す必要があります。

そのために必要だったのが次の2つでした。

必要なこと理由
利用されるクラスを public にする別パッケージから使えるようにするため
利用するときに パッケージ名.クラス名 と書くどこのクラスなのか明示するため

この2つがそろって、はじめて異なるパッケージのクラスを安全に使えるようになります。

public の意味をクラスの公開範囲として理解する

13章では、public の意味も改めて重要になりました。
クラスに public をつけると、そのクラスは別のパッケージからも利用できるようになります。

反対に、public をつけないクラスは、同じパッケージの中で使うことを前提にしたクラスです。

これはドラゴンボールでいうなら、世界に向けて公開されている大会の情報なのか、それとも特定のチーム内だけで共有されている作戦資料なのか、という違いに近いです。公開されているものなら外から使えますが、内部用のものは外からそのまま使えません。

import は別チームの戦士を呼びやすくする仕組み

異なるパッケージのクラスを使うとき、毎回 パッケージ名.クラス名 と書くのは少し大変です。
そこで役立つのが import です。

import を使うと、ファイルの先頭で「このクラスを使います」と宣言しておけるので、そのあとはクラス名だけで書けるようになります。

ドラゴンボールでたとえるなら、別の場所にいる戦士に毎回正式な所属名つきで呼びかけるのではなく、最初にチーム登録しておいて、その後は短く呼べるようにする感じです。

書き方特徴
パッケージ名.クラス名明確だが長い
import して クラス名だけ短くて読みやすい

import は、Javaのコードをぐっと読みやすくしてくれる大切な仕組みです。

パッケージは階層に分けられる

クラスがさらに増えてくると、1つのパッケージの中だけでも分類しきれなくなります。
そこで使うのがサブパッケージです。

たとえば pa というパッケージの下に sub という分類を作れば、pa.sub という形で階層を表現できます。
これは、チームの中をさらに部門ごとに分けるようなものです。

ドラゴンボールで考えるなら、

  • 戦士全体のグループ
  • その中の修行担当
  • その中の対戦担当

というふうに、まとまりの中にさらに細かいまとまりを作るイメージです。

ただし、とても大事なのは、上位パッケージとサブパッケージは別パッケージとして扱われるという点です。

名前コード上の扱い
pa1つの独立したパッケージ
pa.subこれも別の独立したパッケージ

名前がつながっていても、同じパッケージではないという点は、13章の中でも大切なポイントでした。

パッケージは名前空間として働く

13章では、パッケージが名前空間として働くことも学びました。
これは、同じクラス名でも、所属パッケージが違えば別のクラスとして区別できるということです。

ドラゴンボールでたとえるなら、同じ「悟飯」という名前でも、もし別の宇宙や別の時代に同名のキャラクターがいたとしても、所属を含めて呼べば区別できる、という感覚です。

Javaでは、クラス名だけでなくパッケージ名を含めることで、同名のクラスがあっても混乱しにくくなっています。これは大規模開発でとても重要です。

クラスライブラリもパッケージで整理されている

Javaが最初から用意しているクラスライブラリも、やはりパッケージで分類されています。
これまで使ってきた String なども、その整理の一部でした。

特に大事なのは、標準クラスライブラリのクラスも、自分で作るクラスと同じようにパッケージで整理され、必要に応じて import して使うということです。

よく使う代表的なパッケージをまとめると、次のようになります。

パッケージ名主な役割
java.lang基本機能
java.io入出力
java.netネットワーク
java.util便利な補助機能
java.math数値計算
java.text書式や国際化
java.awt画面部品
java.awt.eventイベント処理
java.awt.image画像処理関連

ここで特に覚えておきたいのは、java.lang は特別で、通常は import なしで使えるということです。
String をそのまま書けたのはそのためでした。

* を使った import の意味

同じパッケージのクラスをいくつも使うときは、1つずつ import を書くのが大変になります。
そのときに使えるのが、アスタリスクを使った書き方です。

これは、同じパッケージ内のクラスをまとめて使いやすくするためのものです。
ただし、サブパッケージまでまとめて取り込めるわけではありません。

この点は、サブパッケージが独立した別パッケージだと理解していれば納得しやすいです。

モジュールはパッケージより上の整理単位

13章の最後では、Java 9 以降に登場したモジュールにも少し触れました。
モジュールは、パッケージよりさらに大きな整理単位です。

クラスが集まってパッケージになり、パッケージがさらにまとまってモジュールになる、と考えるとイメージしやすいです。

単位役割
クラス実際の処理をもつ部品
パッケージクラスを整理する単位
モジュールパッケージ群の公開範囲や依存関係を整理する単位

モジュールの理解はこの先さらに深めていく内容ですが、13章では「Javaにはパッケージのさらに上の整理方法もある」ということを知るのが大切でした。

13章全体をドラゴンボールで見直すと

ここまでの内容をドラゴンボールにたとえて整理すると、13章はこんな章だったと言えます。

Javaの考え方ドラゴンボール風のたとえ
クラス戦士や技、修行方法などの1つ1つの設定
ファイル分割戦士ごとに設定資料を分ける
パッケージ戦士たちの所属チームや分類
同じパッケージ同じチーム内の仲間
異なるパッケージ別の組織や別のチーム
import別チームの戦士を呼びやすくする準備
サブパッケージチームの中をさらに部門分けする
名前空間同じ名前でも所属で区別する仕組み
モジュールチーム群全体を管理する大きな枠組み

こうして見ると、13章は単に文法を学ぶ章ではなく、登場人物が増えても混乱しないように世界を整理する章だったことがよくわかります。

13章で身についた力

13章を学んだことで、Javaのコードをただ書くだけではなく、どう整理して育てていくかという視点が身につきました。
この力は、プログラムが大きくなるほど大切になります。

13章で特に身につけた力を整理すると、次のようになります。

身についた力内容
クラスを役割ごとに分ける力ファイル分割の考え方
クラスの所属を整理する力パッケージの理解
別グループのクラスを使う力public と パッケージ名つき記述
コードを読みやすくする力import の活用
大規模開発を見通す力サブパッケージとモジュールの理解

この章で学んだことは、今後のJava学習の土台になります。
オブジェクト指向の部品をどう作るかだけでなく、その部品をどう配置し、どう管理するかまで考えられるようになったことが、13章の大きな成果です。

この図は、左側に個々のクラスがあり、それぞれが独立した部品であることを表しています。戦士をイメージした記号を添えることで、ドラゴンボールの世界観と結びつけながら、クラスがそれぞれ異なる役割を持つ存在であることを示しています。

中央の大きな箱はパッケージで、複数のクラスが同じグループに整理される様子を示しています。その下に配置したサブパッケージは、さらに細かく分類できることを表しています。右側の import の矢印は、別パッケージのクラスを使う流れを示しています。

Javaでは自分で作るクラスだけでなく、標準ライブラリやさらに上位の整理単位まで含めて、全体が階層的に整理されています。この図を通して、13章が扱った内容全体を一つの流れとして、つかんでみましょう。