Java超|13章のまとめ

クラスの置き場所を整えると、Javaの世界は大きくなっても迷子にならない。13章は、悟空たちの戦士本部を整理するように、ファイル・パッケージ・importでクラスを育てやすくする章です。

13章では、Javaのクラスをただ作るだけでなく、どこに置き、どう分類し、どう使いやすくするかを学びました。
小さなプログラムなら、1つのファイルの中に複数のクラスを書いても、それほど困ることはありません。

しかし、クラスが増えてくると、1つの場所にすべてを書くだけでは、だんだん見通しが悪くなります。
悟空、ベジータ、ピッコロ、悟飯、クリリン、ブルマなど、登場人物や役割が増えていくほど、戦士情報、任務情報、通信処理、道具管理、戦闘記録をきちんと整理する必要があります。

Javaでも同じです。
クラスが増えてきたら、ファイル分割、パッケージ、import、サブパッケージ、クラスライブラリ、モジュールを使って整理します。

13章で学ぶこと役割
ファイル分割クラスごとにファイルを分けて管理する
パッケージ関連するクラスをグループ化する
同じパッケージの利用同じグループ内のクラスを自然に使う
異なるパッケージの利用public と パッケージ名.クラス名 で別グループのクラスを使う
import別パッケージのクラスを短い名前で使いやすくする
サブパッケージパッケージを階層化してさらに整理する
クラスライブラリJava標準クラスもパッケージで整理されていることを理解する
モジュールパッケージより上位の整理単位を知る

ドラゴンボール風にたとえると、13章は、戦士本部に増えていく巻物や戦士情報を、ただ積み上げるのではなく、棚・部署・分類ごとに整理していく章です。

悟空の戦士情報、ベジータの戦闘記録、ピッコロの修行計画、ブルマの通信装置、悟飯の学習記録が全部1本の巻物に書かれていたら、必要な情報を探すだけで大変です。

そこで、巻物を分けます。
同じ役割の巻物を同じ棚にまとめます。
別の棚の巻物を使うときは住所を指定します。
よく使う巻物は import で呼びやすくします。

Javaのクラス整理も、これと同じ考え方です。

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

13章は、新しい文法を大量に覚える章というより、クラスをどう整理し、どう使いやすくするかを学ぶ章です。

Javaのプログラムは、クラスという部品を組み合わせて作ります。
しかし、部品が増えれば増えるほど、どこに何があるのかを整理する力が必要になります。

ドラゴンボールの世界観に置きかえると、次のようになります。

Javaの考え方ドラゴンボール風のイメージ
クラス悟空、ベジータ、任務、技、装備などを表す巻物
ファイル1つの巻物
パッケージ巻物を分類して置く棚
サブパッケージ棚の中のさらに細かい分類
import別の棚の巻物を使うための案内札
public他の棚からも使える公開巻物
モジュール複数の棚をまとめる大きな管理区画

13章の流れを整理すると、次のようになります。

段階学んだ内容何ができるようになるか
1クラスをファイルに分けるクラスごとの役割を見やすくできる
2パッケージでまとめる関連クラスをグループ化できる
3同じパッケージのクラスを使う同じ仲間のクラスを自然に連携できる
4異なるパッケージのクラスを使う別グループのクラスを安全に利用できる
5import を使う別パッケージのクラスを短く書ける
6サブパッケージを使うパッケージを階層的に整理できる
7クラスライブラリを見る標準クラスもパッケージで整理されていると分かる
8モジュールを知るパッケージより大きな整理単位を理解できる

この流れを押さえると、13章の内容はバラバラな知識ではなく、大きなJavaプログラムを整理するための一連の考え方として見えてきます。

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

クラスが増えてきたとき、最初に大切になるのが ファイル分割 です。

1つのファイルに複数のクラスを書くこともできます。
しかし、プログラムが大きくなると、1つのファイルに全部を詰め込む方法では読みにくくなります。

たとえば、ドラゴンボール風のプログラムを考えてみます。

クラス役割
GokuWarrior悟空の戦士情報を表す
VegetaWarriorベジータの戦士情報を表す
KiTechnique気の技を表す
BattleMission任務情報を表す
CapsuleItemカプセル道具を表す
BattleManager戦闘の流れを管理する

これらをすべて1つのファイルに書くと、どこに何があるのか分かりにくくなります。

そこで、クラスごとにファイルを分けます。

ファイル書くクラス
GokuWarrior.javaGokuWarrior クラス
VegetaWarrior.javaVegetaWarrior クラス
KiTechnique.javaKiTechnique クラス
BattleMission.javaBattleMission クラス
CapsuleItem.javaCapsuleItem クラス
BattleManager.javaBattleManager クラス

ドラゴンボール風にたとえると、悟空の戦士名簿、ベジータの戦闘記録、気の技の巻物、任務指令書、カプセル道具台帳、戦闘記録を別々の巻物に分けるようなものです。

分けない場合分けた場合
すべてが1つの巨大な巻物に入る役割ごとの巻物に分かれる
必要なクラスを探しにくい必要なファイルを開きやすい
修正箇所が見つかりにくい修正対象がはっきりする
複数人で作業しにくい担当を分けやすい

ファイル分割は、単にファイル数を増やすことではありません。
クラスごとの責任をはっきりさせ、読みやすく、修正しやすくするための工夫です。

図:クラスをファイルとパッケージで整理する

この図が示していること

この図では、クラスが増えたときに、1つの巨大なファイルへ詰め込むのではなく、クラスごとにファイルを分け、さらにパッケージで整理する流れを表しています。

左側では、複数のクラスが1つの巨大な巻物に入っています。
この状態では、必要なクラスを探しにくく、修正したい場所も見つけにくくなります。

右側では、クラスごとにファイルを分け、さらに pa.character、pa.battle、pa.item、pa.mission のように分類しています。

要素意味
ファイル分割クラスごとに書く場所を分ける
パッケージ関連するクラスをグループ化する
サブパッケージ役割ごとにさらに細かく分類する

この図から分かることは、Javaのクラス整理は、ファイルとパッケージを組み合わせることで見通しがよくなるということです。

パッケージはクラスの所属棚

ファイルを分けると、クラスごとの役割は見えやすくなります。

しかし、クラスがさらに増えてくると、ファイルを分けるだけではまだ足りません。
関連するクラスをグループとしてまとめる必要があります。

そこで使うのが パッケージ です。

パッケージは、クラスを分類するためのしくみです。

ドラゴンボール風にたとえると、パッケージは戦士本部の巻物棚です。

パッケージ入れるクラスの例
pa学習用の基本クラス
pb実行確認用のクラス
pc他から利用される共通クラス
pa.battle戦闘処理関連のクラス
pa.itemカプセル道具や装備関連のクラス

クラス名だけでは、どの役割のクラスなのか分かりにくい場合があります。

しかし、パッケージ名まで含めると、そのクラスの所属がはっきりします。

指定意味
GokuWarriorクラス名だけ
pa.GokuWarriorpa パッケージの GokuWarrior
pc.GokuWarriorpc パッケージの GokuWarrior
pa.sub.GokuWarriorpa.sub パッケージの GokuWarrior

このように、パッケージはクラスの住所のような役割を持ちます。

ファイルとパッケージの違い

ここで、ファイルとパッケージの違いを整理しておきましょう。

ファイルは、クラスを書く場所です。
パッケージは、クラスの所属グループです。

考え方何を整理するか
ファイルクラスを書く単位GokuWarrior.java
パッケージクラスを分類する単位package pa;
フォルダパッケージに対応する保存場所pa フォルダ

ドラゴンボール風にたとえると、ファイルは1本の巻物です。
パッケージは、その巻物を置く棚です。

GokuWarrior.java という巻物を、pa という棚に置くなら、ファイルの先頭に次のように書きます。

package pa;

package pa; と書いたファイルは、pa パッケージに属します。
このとき、基本的には pa フォルダの中に保存します。

つまり、package 文とフォルダ構成は対応します。

package 文保存場所
package pa;pa フォルダ
package pb;pb フォルダ
package pa.sub;pa\sub フォルダ

この対応を意識すると、パッケージの理解がかなり楽になります。

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

同じパッケージに属するクラス同士は、比較的自然に連携できます。

たとえば、pa パッケージに GokuWarrior クラスと BattleStart クラスがあるとします。

どちらのファイルにも、先頭に次のように書きます。

package pa;

すると、GokuWarrior クラスも BattleStart クラスも、同じ pa パッケージの仲間になります。

ファイルクラス所属
GokuWarrior.javaGokuWarriorpa
BattleStart.javaBattleStartpa

この場合、BattleStart から GokuWarrior を使うとき、同じパッケージ内なので次のように書きやすくなります。

GokuWarrior warrior1 = new GokuWarrior();

ドラゴンボール風にたとえると、同じ棚にある悟空の戦士名簿と出撃指令書は、同じ本部資料として扱いやすいということです。

同じパッケージのクラスは、同じグループの仲間として連携しやすい。
これがパッケージの基本です。

異なるパッケージのクラスは住所を示して使う

同じパッケージのクラスは使いやすいですが、異なるパッケージのクラスを使う場合は注意が必要です。

たとえば、pb パッケージの BattleStart クラスから、pc パッケージの GokuWarrior クラスを使うとします。

クラス所属パッケージ
BattleStartpb
GokuWarriorpc

この場合、BattleStart の中で GokuWarrior とだけ書いても、Javaはまず pb パッケージの中を探そうとします。

しかし、GokuWarrior は pc パッケージにあるため、見つかりません。

そこで、パッケージ名を含めて指定します。

pc.GokuWarrior warrior1 = new pc.GokuWarrior();

これは、pc パッケージにある GokuWarrior クラスを使う、という意味です。

書き方意味
GokuWarrior同じパッケージ内の GokuWarrior として探しやすい
pc.GokuWarriorpc パッケージの GokuWarrior として指定する

ドラゴンボール風にたとえると、pb の棚にある出撃指令書から、pc の棚にある悟空の戦士名簿を使うようなものです。

別の棚にある巻物を使うなら、どの棚のどの巻物なのかを住所つきで示す必要があります。

public は別パッケージから使えるようにする公開札

異なるパッケージのクラスを使うときは、利用される側のクラスが public であることも大切です。

たとえば、pc パッケージの GokuWarrior クラスを、pb パッケージから使いたいなら、GokuWarrior クラスは public にします。

package pc;

public class GokuWarrior
{
}

public が付いているクラスは、別パッケージからも利用できます。

クラスの指定利用できる範囲
class GokuWarrior基本的に同じパッケージ内
public class GokuWarrior別パッケージからも利用可能

ドラゴンボール風にたとえると、public は他の部署からも閲覧できる公開巻物にする札です。

ただし、クラスが public でも、コンストラクタやメソッドが public でなければ、別パッケージから十分に使えない場合があります。

要素別パッケージから使いたい場合
クラスpublic が必要
コンストラクタpublic が必要
メソッドpublic が必要
フィールド通常は private にして直接触らせない

たとえば、次のような構成です。

package pc;

public class GokuWarrior
{
    private String name;

    public GokuWarrior()
    {
        name = "悟空";
    }

    public void show()
    {
        System.out.println(name);
    }
}

この場合、別パッケージから GokuWarrior オブジェクトを作成し、show() を呼び出せます。

importは別パッケージのクラスを呼びやすくする案内札

異なるパッケージのクラスを使うとき、毎回 pc.GokuWarrior と書くこともできます。

しかし、何度も使う場合は少し長くなります。

そこで使うのが import です。

import pc.GokuWarrior;

このように書いておくと、そのファイルの中では GokuWarrior と短く書けるようになります。

import なしimport あり
pc.GokuWarrior warrior1 = new pc.GokuWarrior();GokuWarrior warrior1 = new GokuWarrior();

import は、クラスの所属を変えるものではありません。

GokuWarrior は import しても pc パッケージのクラスのままです。
import は、今書いているファイルの中で短い名前を使えるようにするための宣言です。

ドラゴンボール風にたとえると、pc の棚にある GokuWarrior の巻物を、pb の任務指令書から使うために、最初に案内札を出しておくようなものです。

役割
package pb;自分の所属を pb にする
import pc.GokuWarrior;pc の GokuWarrior を使いやすくする
GokuWarrior warrior1 = new GokuWarrior();import 後の短い書き方

package と import はどちらもファイルの先頭付近に書きますが、役割は違います。

意味
package 文自分のクラスの所属を決める
import 文使いたい別パッケージのクラスを指定する

図:同じパッケージと異なるパッケージの違い

この図が示していること

この図では、同じパッケージのクラスを使う場合と、異なるパッケージのクラスを使う場合を比較しています。

左側では、GokuWarrior.java と BattleStart.java がどちらも pa パッケージに属しています。
この場合、BattleStart から GokuWarrior をクラス名だけで使いやすくなります。

右側では、BattleStart.java が pb パッケージにあり、GokuWarrior.java が pc パッケージにあります。
この場合、GokuWarrior クラスを public にして、使う側では pc.GokuWarrior のように住所を明示するか、import pc.GokuWarrior; を使う必要があります。

比較同じパッケージ異なるパッケージ
クラスの関係同じ棚の仲間別の棚のクラス
書き方GokuWarriorpc.GokuWarrior
public場合による外部利用には重要
import基本不要短く書くために使う

この図から分かることは、同じパッケージか異なるパッケージかによって、クラスの使い方が変わるということです。

サブパッケージでさらに細かく整理する

クラスがさらに増えてくると、1つのパッケージだけでは整理しにくくなります。

そこで使うのが サブパッケージ です。

たとえば、pa の下に sub という分類を作ると、次のようになります。

package pa.sub;

この場合、フォルダ構成は次のようになります。

C:\Java\13
        └─ pa
           └─ sub
              └─ BattleTool.java
package 文保存場所実行時の指定
package pa;pa フォルダjava pa.BattleStart
package pa.sub;pa\sub フォルダjava pa.sub.BattleTool

ドラゴンボール風にたとえると、pa は本部の大きな棚、pa.sub はその中にある補助任務用の小さな棚です。

ただし、ここで大切なのは、pa と pa.sub は別パッケージ だという点です。

パッケージJavaでの扱い
pa1つの独立したパッケージ
pa.subpa とは別の独立したパッケージ

名前はつながっていますが、Javaでは別パッケージとして扱います。

そのため、アクセス修飾子を考えるときにも、pa と pa.sub は同じパッケージではない点に注意が必要です。

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

13章では、パッケージが 名前空間 として働くことも大切でした。

名前空間とは、同じ名前がぶつからないように、所属を含めて名前を管理する仕組みです。

たとえば、GokuWarrior というクラス名が複数あっても、パッケージが違えば別クラスとして扱えます。

完全な名前意味
pa.GokuWarriorpa パッケージの GokuWarrior
pc.GokuWarriorpc パッケージの GokuWarrior
pa.sub.GokuWarriorpa.sub パッケージの GokuWarrior

ドラゴンボール風にたとえると、同じ GokuWarrior という名前の巻物があっても、どの棚にある巻物なのかまで指定すれば取り違えを防げます。

大きな開発では、同じような名前のクラスが出てくることがあります。

そのとき、パッケージ名まで含めて管理できると、名前の衝突を避けやすくなります。

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

Javaが最初から用意しているクラスライブラリも、パッケージで整理されています。

自分で作るクラスだけでなく、標準クラスも同じようにパッケージに所属しています。

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

たとえば、String は java.lang に属しています。
BufferedReader は java.io に属しています。
ArrayList は java.util に属しています。

Javaの標準クラスライブラリは、ドラゴンボール風に言えば、戦士本部に最初から用意されている巨大な巻物棚です。

Javaの標準パッケージドラゴンボール風のイメージ
java.lang基本道具棚
java.io記録の読み書き棚
java.net遠方通信棚
java.util便利道具棚
java.math精密計算棚
java.awt画面部品棚

標準クラスライブラリを使いこなすには、どのパッケージにどんな機能があるのかを意識することが大切です。

java.langは特別にimport不要

標準クラスライブラリの中でも、java.lang は特別です。

java.lang に含まれるクラスは、通常 import を書かなくても使えます。

クラス完全な名前import
Stringjava.lang.String通常不要
Mathjava.lang.Math通常不要
Systemjava.lang.System通常不要

たとえば、次のように String や System をそのまま使えます。

String name = "悟空";
System.out.println(name);

これは、String や System が特別な文法だからではありません。
java.lang パッケージが自動的に使えるようになっているからです。

パッケージimport の必要性
java.lang通常不要
java.lang 以外基本的に必要

ドラゴンボール風にたとえると、java.lang は悟空やベジータが最初から持っている基本装備のようなものです。

任務のたびに申請しなくても、最初から使える状態になっています。

アスタリスクを使ったimport

同じパッケージから複数のクラスを使う場合、1つずつ import することもできます。

import java.io.BufferedReader;
import java.io.IOException;

この書き方は、使うクラスがはっきりしていて分かりやすいです。

一方、同じパッケージのクラスをたくさん使う場合は、アスタリスクを使うこともできます。

import java.io.*;

これは、java.io パッケージ内のクラスをまとめて使いやすくする書き方です。

書き方意味
import java.io.BufferedReader;BufferedReader を使いやすくする
import java.io.IOException;IOException を使いやすくする
import java.io.*;java.io のクラスをまとめて使いやすくする

ただし、アスタリスクは指定したパッケージの直下のクラスだけが対象です。

サブパッケージまでは含まれません。

アスタリスクではサブパッケージまで読み込まれない

ここはとても大切です。

たとえば、次のように書いたとします。

import java.awt.*;

この場合、java.awt パッケージのクラスは使いやすくなります。

しかし、java.awt.image パッケージのクラスまでは含まれません。

java.awt.image のクラスを使いたい場合は、別に次のように書く必要があります。

import java.awt.image.*;

表で整理すると、次のようになります。

import 文利用しやすくなる範囲
import java.awt.*;java.awt のクラス
import java.awt.image.*;java.awt.image のクラス
import java.awt.*; だけjava.awt.image は含まれない

これは、java.awt と java.awt.image が別パッケージだからです。

以前学んだ pa と pa.sub の関係と同じです。

関係Javaでの扱い
pa と pa.sub別パッケージ
java.awt と java.awt.image別パッケージ

ドラゴンボール風にたとえると、java.awt の棚をまとめて使う申請をしても、その中の別管理区画である java.awt.image の棚までは自動では使えません。

サンプルプログラム

ここでは、13章で学んだ内容のうち、import、標準クラスライブラリ、java.lang の使い方が見えるサンプルプログラムを確認します。

具体的なファイル名は Sample○.java の形式にはせず、通常のアプリ名として示します。

ファイル名:DragonTeamLibraryDemo.java

import java.util.ArrayList;
import java.util.Random;

class DragonTeamLibraryDemo
{
    public static void main(String[] args)
    {
        ArrayList<String> warriors = new ArrayList<String>();

        warriors.add("悟空");
        warriors.add("ベジータ");
        warriors.add("ピッコロ");
        warriors.add("悟飯");
        warriors.add("クリリン");

        Random random = new Random();
        int index = random.nextInt(warriors.size());

        String selectedWarrior = warriors.get(index);

        System.out.println("戦士名簿:" + warriors);
        System.out.println("今回の出撃戦士は" + selectedWarrior + "です。");

        int maxPower = Math.max(8000, 12000);
        System.out.println("比較した最大戦闘力は" + maxPower + "です。");
    }
}

実行結果の例

Random を使っているため、出撃戦士の表示は実行するたびに変わる可能性があります。

戦士名簿:[悟空, ベジータ, ピッコロ, 悟飯, クリリン]
今回の出撃戦士はピッコロです。
比較した最大戦闘力は12000です。

このサンプルでは、ArrayList と Random を使っています。

クラス所属パッケージ役割
ArrayListjava.util複数のデータをリストとして管理する
Randomjava.utilランダムな値を作る
Stringjava.lang文字列を扱う
Mathjava.lang数学的な計算をする
Systemjava.lang標準出力などを扱う

ArrayList と Random は java.util パッケージにあるため、import を書いています。

一方、String、Math、System は java.lang パッケージにあるため、通常 import は不要です。

このように、Javaの標準クラスライブラリも、パッケージの考え方を使って整理されています。

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

Java 9以降では、パッケージよりさらに大きな整理単位として モジュール があります。

クラスが集まってパッケージになります。
パッケージがさらにまとまってモジュールになります。

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

ドラゴンボール風にたとえると、クラスは1本の巻物です。
パッケージは巻物を置く棚です。
モジュールは複数の棚をまとめて管理する部署です。

モジュールでは、次のようなことを管理できます。

モジュールで管理すること内容
公開するパッケージ外部から使える機能を決める
内部用のパッケージ外部には見せない処理を分ける
依存関係どのモジュールがどのモジュールを使うか整理する

モジュールを定義するときは、module-info.java を使います。

ただし、学習の最初からモジュールを細かく意識する必要はありません。

まずは、クラス、ファイル、パッケージ、import の関係をしっかり理解することが大切です。

名前のないモジュール

module-info.java を作らずに書いた通常の学習用プログラムは、名前のないモジュールに属するものとして扱われます。

状態扱い
module-info.java がない名前のないモジュール
module-info.java がある名前のあるモジュール

この仕組みがあるため、初心者の段階ではモジュールを強く意識しなくても、Javaのプログラムを作って実行できます。

ドラゴンボール風にたとえると、最初は本部内の簡単な棚分けだけで任務を進められるようになっている、ということです。

大きな任務や本格的な部隊編成になったときに、モジュールという大きな管理区画を意識すればよい、と考えると分かりやすいです。

図:13章で学んだクラス整理の全体像

この図が示していること

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

左側のクラスは、Javaプログラムを作る1つ1つの部品です。
GokuWarrior、VegetaWarrior、KiTechnique、BattleMission など、それぞれが別の役割を持ちます。

中央では、それらのクラスをファイルに分け、さらにパッケージで整理する様子を示しています。

右側では、別パッケージのクラスを使うために、public、パッケージ名.クラス名、import を使う流れを表しています。

下部では、java.lang、java.util、java.io などの標準クラスライブラリも、パッケージで整理されていることを示しています。

さらに、モジュールという上位の整理単位も配置しています。

図の要素意味
クラスプログラムの部品
ファイルクラスを書く単位
パッケージクラスの所属グループ
import別パッケージのクラスを使いやすくする
サブパッケージ階層的に整理する
クラスライブラリJavaが用意している便利なクラス群
モジュールパッケージ群を大きく管理する

この図から分かることは、13章が単なる文法の章ではなく、クラスを整理して大きなプログラムを作りやすくする章だったということです。

13章で身についた力

13章を学ぶことで、Javaのコードをただ書くだけでなく、どう整理して育てるかという視点が身につきました。

これは、プログラムが大きくなるほど重要になります。

身についた力内容
クラスを役割ごとに分ける力ファイル分割の考え方
クラスの所属を整理する力パッケージの理解
同じグループのクラスを連携させる力同じパッケージの利用
別グループのクラスを使う力public と パッケージ名.クラス名
コードを読みやすくする力import の活用
階層的に整理する力サブパッケージの理解
標準ライブラリを探す力クラスライブラリのパッケージ理解
大きな構成を見通す力モジュールの考え方

ドラゴンボール風に言えば、13章で身につけたのは、戦士本部の資料整理術です。

悟空やベジータの巻物を分ける。
同じ役割の巻物を同じ棚に置く。
別の棚の巻物を使うときは住所を指定する。
よく使う巻物は案内札で呼びやすくする。
棚が増えたら階層化する。
さらに大きな任務では、棚全体を部署として管理する。

Javaのクラス整理も、まさにこの考え方です。

13章で特に押さえておきたいポイント

13章の内容を学習後に確認するときは、次のポイントを押さえておくと理解が安定します。

ポイント内容
クラスが増えたらファイルを分ける役割を見やすくする
関連クラスはパッケージにまとめるグループとして整理する
package 文は所属を示す自分のクラスの住所を決める
フォルダ構成はパッケージに合わせるpackage pa.sub; なら pa\sub
同じパッケージ内は使いやすい同じグループの仲間として扱える
別パッケージは住所を示すpc.GokuWarrior のように書く
外部から使うクラスは public が重要別パッケージから利用できるようにする
import は短く書くための準備クラスの所属は変えない
サブパッケージは別パッケージpa と pa.sub は同じではない
標準クラスもパッケージで整理されるjava.lang、java.io、java.util など
モジュールは上位の整理単位パッケージ群を管理する

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

オブジェクト指向でクラスを作れるようになることは大切です。
しかし、作ったクラスをどこに置き、どう分類し、どう使いやすくするかも同じくらい大切です。

13章では、そのための基本的な整理方法を学びました。

クラスを作るだけでなく、クラスを育てやすい場所に置く。
これができるようになると、Javaのプログラムはずっと読みやすく、拡張しやすくなります。