BACK

HOOPSII MOBILE

HOME

[第11回]パッケージ

パッケージと聞いたら、お店に売っている商品のパッケージを思い浮かべます。
では、Javaのパッケージとはいったいなんのことでしょうか。

[1] パッケージとは

パッケージとは簡単に言ってしまえば、クラスの分類のことです。
実際の開発で大きなプログラムになればなるほど、クラスも膨大な数になります。
その膨大になってしまったクラスを分類することで、
大きなプログラムでも効率的に作業を進めることができます。
クラスが入ったファイルの最初に、「分類する目印を付け」、グループごとに分類します。
パッケージのイメージ

パッケージの作り方

パッケージの作り方は簡単です。プログラムではこのように書きます。

package パッケージ名;

これをプログラムの最初に書き加えます。それだけです。この1文により

ファイル内にあるすべてのクラス(通常は1つのファイルに1つのクラス)がそのパッケージに分類される

と宣言されました。しかし宣言しただけでは、実際にファイルを分類する箱がないので、分類はできません。
箱といいましたが、分類はフォルダで行います。
なお、Eclipseと、コマンドプロンプトではパッケージの作り方に違いがあります。
それぞれの作り方についてはプログラムを作る際に説明します。

[2] ファイルの分割

パッケージの概念は分かりましたか。
次に、ファイルの分割について説明します。

ファイルの分割

今までは、1つのファイルに複数のクラスがあるプログラムを書いてきました。
しかし、実際の大規模開発では、1つのファイルに1つのクラスが基本です。
それにより、分かりやすく、見やすいプログラムが書けます。
そもそもファイルの分割をせずに、1つのファイルにすべてのクラスを書いていたら、パッケージの必要はなくなります。
パッケージの学習のためにも、ここではファイルの分割について説明します。

ファイルの分割方法

書き方は今までとほとんど同じです。
違う点は、ファイルを沢山作ることと、それに伴いファイル名を沢山付けることです。
今までは、mainを含むクラスの名前をファイル名にしていました。
しかし、ファイルを分割することで、mainを含まないファイルができてきます。
そのため、そのようなファイルには、中にあるクラス名をファイル名にしましょう。
下の図でよく理解しましょう。

パッケージのイメージ2
実行方法ですが、パッケージを加えていない今の段階では、
Eclipseもコマンドプロンプトも、ともに今までと変わりません。

[3] アクセス修飾子

今まで1つだけ説明していない修飾子がありました。
protectedです。それについて説明します。

メンバ変数とメソッドのアクセス修飾子

話をパッケージに戻します。これまでに

1、ファイルを分割する
2、ファイルにどのパッケージへ分類するのかを書く

この2つのことを学習しました。
パッケージの機能はとても便利ですが、その機能を生かすために学ばなければならないことがあります。
今まではメンバ変数や、メソッドなどにアクセス修飾子(第8回を参照)をつけてきました。
その中でパッケージ間に関するアクセス制限はありましたが、説明はしませんでした。
パッケージを説明したので、前よりもイメージがしやすいと思います。
下の図はクラス間、パッケージ間でのアクセス修飾子の効果についてです。

アクセス修飾子の働き
上の図で重要な点は「▲」が付いたprotectedの働きです。
これは今まで細かい説明はしてきませんでした。

protectedの働き

protectedは違うパッケージからも呼び出すことができます。
しかし、それには1つ条件があります。

protectedを付けたメンバ変数やメソッドを持つクラスから見て、別パッケージのクラスがサブクラスである必要があります。

アクセス修飾子protecetedの働き
それぞれの修飾子の働きについてよく理解して、覚えてしまいましょう。

クラスにつける修飾子

メンバ変数やメソッドにアクセス修飾子を付けるだけではありません。
クラスにもアクセス修飾子を付けることができます。クラスに付けるアクセス修飾子は2つあります。
「publicを付けるか」、「付けないか」のどちらかです。

無指定 同じパッケージでのみ使用できる
public 別のパッケージからでも使用できる

上の表で「無指定」つまりクラスにアクセス修飾子を付けないと、
違うパッケージでオブジェクトを作るなどの行為ができなくなります。
大きなプログラムになれば、publicを付けるかどうかがプログラムの保守につながります。

クラスへのアクセス修飾子の付け方

クラスへのアクセス修飾子の付け方は

public class クラス名{}

であり、「class」の前に「public」と付けるだけです。
今まで特に意識して書いてこなかったと思いますが、mainを含んでいるクラスはpublicを付けていました。
これでパッケージに関係したアクセス修飾子についての学習は終了です。
後のプログラムで使われるので、忘れないようにしましょう。

[4] パッケージのプログラム

それでは、パッケージ間での宣言方法を実際にプログラムで学びましょう。
このページでは先に宣言方法と、どのようなプログラムにするのかを説明します。

パッケージ間の宣言方法

これまで学習してきたクラスのインスタンス化は

クラス名 インスタンス名 = new コンストラクタ;

でした。今までの自作クラスのインスタンス化は、同じパッケージ内だったのでこの方法でよかったのです。
しかし、違うパッケージ内のクラスを呼び出さなくてはならないときもあります。
そのようなときは今までとは少しだけ違う呼び出し方法となります。

パッケージ間でのインスタンス化

パッケージ間でのインスタンス化は、非常にシンプルです。
クラス名の前と、コンストラクタの前に「パッケージ名.」を付けることです。

パッケージ名.クラス名 インスタンス名=new パッケージ名.コンストラクタ

インスタンス化以外の呼び出しにも、「パッケージ名.」を頭に付けることで、
それがどこのパッケージに属するのかが分かるようになっています。
簡単ですが、付ける場所が多くなるとついつい忘れてしまうこともあります。
また、同じ名前のクラスでも、違うパッケージ内にあれば違うものであると、識別することができます。
パッケージのイメージ3
これからは、どこのパッケージに属するのかを意識してプログラミングを進めていきましょう。
では、これからプログラムに入っていきましょう。

プログラムの内容

ここで学んだことを復習しながら実際にパッケージを1から作ってみましょう。
パッケージを2つ作り、そのパッケージ間で、継承を行うプログラムを作成します。
継承のときに使ったプログラムを、パッケージを使って作り直します。
これから作るプログラムは、以下のようになっています。

パッケージ名 pack1 pack2
ファイル名 Super.java Java11_01.java
クラス1 Super Java11_01
クラス2 - Sub

イメージ図は以下のようになっています。

プログラムのイメージ図
続きはEclipseとコマンドプロンプトで方法が変わってきます。

[5] Eclipseを使ってパッケージを作成

ここでは、Eclipseを使ったパッケージ作成方法を説明します。
まずは手順から説明します。

[6] パッケージの作成手順

説明の流れは以下のように行います。

1、新規プロジェクト
2、パッケージ作成
3、ファイル作成
4、クラス作成
5、プログラムの実行

それでは、1つずつ説明していきます。

新規プロジェクト

説明を分かりやすくするために新規でプロジェクトを作りましょう。
名前は何でもいいですが、Packageとして進めていきます。

パッケージの作成

次は、パッケージを作成しましょう。
[ファイル][新規][パッケージ]をクリックします。
パッケージの作成手順1
新しいウィンドウが出ます。
ソース・フォルダーが先ほどのプロジェクト「Package」となっていることを確認しましょう。
なっていなかったら、[参照]から選択して「Package」になるようにしましょう。
次にパッケージの名前を決めます。今回は「pack1」としましょう。
名前が入力できたら[終了]をクリックします。
パッケージの作成手順2
同じようにパッケージをもうひとつ作りましょう。
パッケージ名は、「pack2」とします。
これもソース・フォルダーがPackageになるようにしましょう。

ファイルの作成

次にパッケージpack1の中にファイルを作成します。
今までで、以下のような形になっていると思います。
Pack1が選択された状態で、ファイルを新規で作成します。
今回のファイル名は「Super.java」としましょう。
パッケージの作成手順3
これで、Super.javaは、pack1に含まれました。
同じように、pack2にはファイル「Java11_01.java」を作成しましょう。
パッケージの作成手順4

クラスの作成

次はいよいよプログラム作成です。
まずはSuper.javaのファイルを開きます。
パッケージの作成手順4
次にその中にクラスSuperを書いていきます。

[7] プログラムの記述

ここから、実際にプログラムを書いていきます。
プログラムの記述を反対に書かないように気をつけましょう。
プログラムを実行するときは、main文があるプログラムを選択して実行しましょう。

pack1のプログラム
package pack1;	//パッケージ

//以下変化なし
public class Super {
	public int a;
	protected int b;
	private int c;
	int d;

	public Super() {
		a = b = c = d = 10;
	}
}
pack2のプログラムを記述

次は、Java11_01.javaのファイルを開き、以下を入力します。

pack2のプログラム
package pack2;	//パッケージ

//クラスSub
class Sub extends pack1.Super {	//pack1がパッケージ名
	public Sub() {
		super ();
		System.out.println("a = " + a);
		System.out.println("b = " + b);
		//System.out.println("c = " + c); コンパイラーエラー1
		//System.out.println("d = " + d); コンパイラーエラー2
	}
}

//クラスJava11_01 mainを含むクラス
public class Java11_01{
	public static void main(String args[]) {
		Sub sub = new Sub();	//同じパッケージ内の呼び出し
	}
}
実行結果

実行結果
継承のときに行ったプログラムです。
そのときは、aとbとcが表示される結果となりました。 しかしパッケージ間では、参照できないアクセス修飾子があるため(private)、
aとbしか表示されないという結果に変わりました。
これでパッケージの基本的な書き方と、アクセス修飾子について分かったと思います。
次のページでは、さらに大きなプログラムのときのパッケージの使い方について、説明します。

[8] パッケージの階層構造

パッケージの階層構造とは

パッケージの中にさらにパッケージを作ることができます。
これをパッケージの階層構造といいます。
それによって、より整理されて分かりやすいプログラムが書けます。
もちろんそのように整理した場合、書き方は今までと少し変わります。

階層構造の書き方

階層構造のためパッケージが増え、書かなくてはならないパッケージも増えます。
今まではそのファイルがどこのパッケージに属するのかをファイルの最初に

package パッケージ名;

このよう宣言していましたが、パッケージが多いため、パッケージの大きい順で

package パッケージ名1.パッケージ名2.パッケージ名3.パッケージ名4;

というようになります。
また、同じように呼び出し方法もパッケージ名が1つではなく、「.」(ドット)によって沢山のパッケージを書き連ねる必要が生まれてきます。

[9] インポート

インポートとはC言語でいう#include<ヘッダファイル>に相当します。

インポートとは

インポートとは、「パッケージ名.」を省略してしまうものです。
プログラムによっては、同じ「パッケージ名.」が何度も出てきて、面倒です。
だからと言って書かないとエラーが出ます。
そんなときには、こんな1文加えてやると、すべてがうまくいきます。

import パッケージ名.クラス名;

これをファイルの最初の部分に書き加えます。
最初と言っても、パッケージの宣言の次の行がいいでしょう。
この行為「インポート」によって、ソースに「パッケージ名.」を書く手間が省けます。

複数のクラスを1文でインポート

パッケージ内にはクラスがいくつも入っているものです。
そのパッケージ内のクラスを全てインポートする場合、
先ほどの方法だととても手間がかかってしまいます。
そのため、パッケージ内のすべてのクラスをインポートする方法があります。

import パッケージ名.*;

上のように、クラス名の代わりに「*」(アスタリスク)をつけることで、それが可能になります。
何か検索するときにも「*」を使いました。ワイルドカードです。

[10] その他補足

今までimportなしのプログラムを書いてきました。
System.out.printlnなどはimportしていなくても使えました。
これは、よく使うパッケージはimportしなくても使えるようになっているのです。
これら以外にも様々な機能を持つとても便利なパッケージがあります。
それについては、第15回「クラスライブラリ」で少しだけ取り扱います。

C言語ではほとんどの関数などを#includeしていたのに、
Javaでは、必要最低限のものをimportする必要がなく便利になりました。

以上で第11回は終了です。

[11]練習問題 第1問

以下の指示に従って答えなさい。次の設問に〇か×で答えよ。

1.アクセス修飾子protectedを付けたメソッドは、違うパッケージからは絶対にアクセスできない。

2.異なるパッケージにあるクラスをインスタンス化するには、そのクラスにアクセス修飾子publicが付いている必要がある。

3.パッケージさえ違えば、同じ名前のクラスを複数作ることができる。

4.「import パッケージ名.クラス名」でインポートされたクラスは、インスタンス化を省略できる。

[12]第1問解答

Copyright (C) 2011 ほぷしぃ. All Rights Reserved.