Java言語入門 〜C言語を学んだ君へ〜
[1] パッケージ
パッケージと聞いたら、お店に売っている商品のパッケージを思い浮かべます。
では、Javaのパッケージとはいったいなんのことでしょうか。
パッケージとは
パッケージとは簡単に言ってしまえば、クラスの分類のことです。
実際の開発で大きなプログラムになればなるほど、クラスも膨大な数になります。
その膨大になってしまったクラスを分類することで、
大きなプログラムでも効率的に作業を進めることができます。
クラスが入ったファイルの最初に、「分類する目印を付け」、グループごとに分類します。
パッケージの作り方
パッケージの作り方は簡単です。プログラムではこのように書きます。
package パッケージ名;
これをプログラムの最初に書き加えます。それだけです。この1文により
ファイル内にあるすべてのクラス(通常は1つのファイルに1つのクラス)がそのパッケージに分類される
と宣言されました。しかし宣言しただけでは、実際にファイルを分類する箱がないので、分類はできません。
箱といいましたが、分類はフォルダで行います。
なお、Eclipseと、コマンドプロンプトではパッケージの作り方に違いがあります。
それぞれの作り方についてはプログラムを作る際に説明します。
[2] ファイルの分割
パッケージの概念は分かりましたか。
次に、ファイルの分割について説明します。
ファイルの分割
今までは、1つのファイルに複数のクラスがあるプログラムを書いてきました。
しかし、実際の大規模開発では、1つのファイルに1つのクラスが基本です。
それにより、分かりやすく、見やすいプログラムが書けます。
そもそもファイルの分割をせずに、1つのファイルにすべてのクラスを書いていたら、パッケージの必要はなくなります。
パッケージの学習のためにも、ここではファイルの分割について説明します。
ファイルの分割方法
書き方は今までとほとんど同じです。
違う点は、ファイルを沢山作ることと、それに伴いファイル名を沢山付けることです。
今までは、mainを含むクラスの名前をファイル名にしていました。
しかし、ファイルを分割することで、mainを含まないファイルができてきます。
そのため、そのようなファイルには、中にあるクラス名をファイル名にしましょう。
下の図でよく理解しましょう。
実行方法ですが、パッケージを加えていない今の段階では、
Eclipseもコマンドプロンプトも、ともに今までと変わりません。
[3] アクセス修飾子
今まで1つだけ説明していない修飾子がありました。
protectedです。それについて説明します。
メンバ変数とメソッドのアクセス修飾子
話をパッケージに戻します。これまでに
1、ファイルを分割する
2、ファイルにどのパッケージへ分類するのかを書く
この2つのことを学習しました。
パッケージの機能はとても便利ですが、その機能を生かすために学ばなければならないことにアクセス修飾子があります。
今まではメンバ変数や、メソッドなどにアクセス修飾子をつけてきました。(第8回を参照)
その中でパッケージ間に関するアクセス制限はありましたが、説明はしませんでした。
パッケージを説明したので、前よりもイメージがしやすいと思います。
下の図はクラス間、パッケージ間でのアクセス修飾子の効果についてです。
上の図で重要な点は「▲」が付いたprotectedの働きです。
これは今まで細かい説明はしてきませんでした。
protectedの働き
protectedは違うパッケージからも呼び出すことができます。
しかし、それには1つ条件があります。
protectedを付けたメンバ変数やメソッドを持つクラスから見て、別パッケージのクラスがサブクラスである必要があります。
それぞれの修飾子の働きについてよく理解して、覚えてしまいましょう。
クラスにつける修飾子
メンバ変数やメソッドにアクセス修飾子を付けるだけではありません。
クラスにもアクセス修飾子を付けることができます。クラスに付けるアクセス修飾子は2つあります。
「publicを付けるか」、「付けないか」のどちらかです。
無指定 | 同じパッケージでのみ使用できる |
public | 別のパッケージからでも使用できる |
上の表で「無指定」つまりクラスにアクセス修飾子を付けないと、
違うパッケージでオブジェクトを作るなどの行為ができなくなります。
大きなプログラムになれば、publicを付けるかどうかがプログラムの保守につながります。
クラスへのアクセス修飾子の付け方
クラスへのアクセス修飾子の付け方は
public class クラス名{}
であり、「class」の前に「public」と付けるだけです。
今まで特に意識して書いてこなかったと思いますが、mainを含んでいるクラスはpublicを付けていました。
これでパッケージに関係したアクセス修飾子についての学習は終了です。
後のプログラムで使われるので、忘れないようにしましょう。
[4] パッケージのプログラム
それでは、パッケージ間での宣言方法を実際にプログラムで学びましょう。
このページでは先に宣言方法と、どのようなプログラムにするのかを説明します。
パッケージ間の宣言方法
これまで学習してきたクラスのインスタンス化は
クラス名 インスタンス名 = new コンストラクタ;
でした。今までの自作クラスのインスタンス化は、同じパッケージ内だったのでこの方法でよかったのです。
しかし、違うパッケージ内のクラスを呼び出さなくてはならないときもあります。
そのようなときは今までとは少しだけ違う呼び出し方法となります。
パッケージ間でのインスタンス化
パッケージ間でのインスタンス化は、非常にシンプルです。
クラス名の前と、コンストラクタの前に「パッケージ名.」を付けることです。
パッケージ名.クラス名 インスタンス名=new パッケージ名.コンストラクタ
インスタンス化以外の呼び出しにも、「パッケージ名.」を頭に付けることで、
それがどこのパッケージに属するのかが分かるようになっています。
簡単ですが、付ける場所が多くなるとついつい忘れてしまうこともあります。
また、同じ名前のクラスでも、違うパッケージ内にあれば違うものであると、識別することができます。
これからは、どこのパッケージに属するのかを意識してプログラミングを進めていきましょう。
では、これからプログラムに入っていきましょう。
プログラムの内容
ここで学んだことを復習しながら実際にパッケージを1から作ってみましょう。
パッケージを2つ作り、そのパッケージ間で、継承を行うプログラムを作成します。
継承のときに使ったプログラムを、パッケージを使って作り直します。
これから作るプログラムは、以下のようになっています。
パッケージ名 | pack1 | pack2 |
---|---|---|
ファイル名 | Super.java | Java11_01.java |
クラス1 | Super | Java11_01 |
クラス2 | - | Sub |
イメージ図は以下のようになっています。
続きはEclipseとコマンドプロンプトで方法が変わってきます。