Developer

【はじめてのJava】パッケージの使い方【パッケージとモジュール編】
2021.07.29
Lv1

【はじめてのJava】パッケージの使い方【パッケージとモジュール編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


パッケージの使い方


Javaでは、プログラム内の処理など様々なものを「オブジェクト」として捉えていました。
また、プログラム内でオブジェクトを扱う場合には「クラス」単位でソースコードを作成していくという説明をしていました。
大規模なプログラムになると、細かくクラスを作成し行う処理を部品化していくような形式をとることが多くなり、
アプリケーションを動作させるために必要なクラスが非常に多くなることがよくあります。
そのような場合、クラスファイルを機能や分類ごとに「フォルダ分け」して管理することで扱いやすくすることが可能です。
Javaの中でのクラスファイルのフォルダ分けのような仕組みが「パッケージ」です。
この記事では、パッケージの使い方を解説していきます。

目次


パッケージとインポート

「パッケージ」は、機能などによって、関連するクラスをまとめて管理することができる仕組みです。
パッケージを利用することで得られるメリットには、以下のようなものが挙げられます。

  • 開発を進める際などに、単位が明確になり、管理がしやすくなる
  • パッケージを利用したアクセス制限をかけることが可能になる(同一パッケージ内のクラスからのみアクセス可能など)

また、「すべてのクラスは必ず1つのパッケージに属する」と決められています。
クラスを作成する際に属するパッケージを指定しなかった場合には、「デフォルトパッケージ(無名パッケージ)」に属するとされます。

「パッケージ」は「ディレクトリ」と同じような感覚で利用できます。
今回の記事では、Eclipseを利用してJavaプログラムを作成する際を例にして解説していきます。


パッケージを作成する(Eclipse)

Eclipseで新しくパッケージを作成する場合は、以下の方法で行うことができます。

  • 作成したいフォルダで右クリックして「新規 > パッケージ」を選択する

  • 新規パッケージ」アイコンをクリックする

するとパッケージを作成するウィンドウが開くので、パッケージ名を入力して作成します。

パッケージを階層化させたい場合は、階層ごとに「.(ドット)」で区切って命名します。
(例)「java.silver.test」というパッケージを作成した場合、「java > silver > test」のような階層化されたパッケージとして扱うようになります。

一般的にパッケージ名は先頭の文字を小文字にして命名します。

package文を利用する

クラスをパッケージに所属させるためには、「package文」という構文を利用します。
Eclipseでは、クラスを作成する際に所属させるパッケージを設定することで自動的に追加されます。
階層化されている場合には、.(ドット)で区切ってパッケージ名を指定します。
★package文は必ずソースコードの先頭に書かなければいけません。
import文やclassブロックよりも前に書かなければコンパイルエラーになります。

(例)Testクラスを「java.util.test」パッケージに所属させる場合

 package java.silver.test;
 
 class Test{
 	
 }
 

もし、package文を省略したクラスを作成した場合、そのクラスはデフォルトパッケージ(無名パッケージ)に所属するクラスという扱いになります。
ここで注意しなければいけないことは、デフォルトパッケージに所属するクラスは、同じデフォルトパッケージに属するクラスからしかアクセスできないことです。

クラスの呼び出し

パッケージに所属させたクラスを呼び出す際には以下の2つの方法があります。

  • 完全修飾名を利用してクラスを呼び出す
    完全修飾名とは、パッケージ名も含めたクラス名のことです。
    Javaのプログラムの中では、クラス名を書くことで別のクラスを呼び出すことができますが、クラス名をそのまま書いた場合、そのクラスと同じ
    パッケージに所属しているクラスを呼び出すことができます。
    そのため、同じパッケージに所属しているクラスを呼び出す際にはクラス名だけで問題ありませんが、異なるパッケージに所属しているクラスを呼び出す際には、
    呼び出したいクラスが所属するパッケージ名とクラス名を両方記述する必要があります。
    記述するときは、「パッケージ名.クラス名」のようにパッケージ名とクラス名を.(ドット)でつなげて指定します。
    (例)java.silver.testパッケージに所属するTestクラスを呼び出す場合

     package java.silver.sample;
     
     class Sample{
     	
     	public static void main(String[] args){
     		
     		java.silver.test.Test ts = new java.silver.test.Test();
     		//「java.silver.test」パッケージ内の「Test」クラスを呼び出してインスタンス化する記述
     		
     	}
     
     }
     
  • import宣言を利用してクラスを呼び出す
    上記のように完全修飾名を利用することで、別のパッケージに所属するクラスを呼び出すことは可能ですが、毎回パッケージ名とクラス名を両方記述するのは
    ソースも長くなってしまいますし、記述するのも大変です。
    そのような場合にimport文を使用します。import文を使用してクラスをインポートすると、指定したパッケージ名の所属したクラスをクラス名だけで使用することができます。
    import文を記述する際は、クラスブロックの前に「import パッケージ名.クラス名」のように呼び出します。
    また、「パッケージ名.*」のように「*」の記号を使用することで、指定したパッケージに所属するすべてのクラスをインポートすることができます。
    (例)java.silver.testパッケージに所属するTestクラスをimport宣言を利用して呼び出す場合

     package java.silver.sample;
     
     import java.silver.test.Test;
     
     class Sample{
     	
     	public static void main(String[] args){
     		
     		Test ts = new Test();
     		//import文で呼び出すクラスを宣言しているので、クラス名だけで別のパッケージに所属するクラスを利用できる。
     		
     	}
     
     }
     

staticインポート

import文を利用することで、異なるパッケージに所属するクラスを、クラス名だけで呼び出すことが可能になりました。
ここで、さらにクラスの中に定義された変数やメソッドの中でもstatic変数やstaticメソッドについて詳しく見ていきます。
static変数やstaticメソッドの特徴として、そのクラスのオブジェクトで共有の変数やメソッドであり、呼び出す際は「クラス名.変数名」や「クラス名.メソッド名」と
言った形で、クラスをインスタンス化せずに利用することが可能でした。
このとき、「staticインポート」という機能を使用することでstatic変数やstaticメソッドをクラス名を省略して呼び出すことができます。
staticインポートは、「import static パッケージ名.クラス名.staticメソッド名」もしくは「import static パッケージ名.クラス名.static変数名」のように
import文の中でstatic変数やstaticメソッドを指定してインポートします。
(例)

package java.silver.test;

class Test {
	static int testNum;
	
	static void testMethod(){
		System.out.println("Hello");
	}
}

package java.silver.sample;

import static package java.silver.test.Test.testNum;
import static package java.silver.test.Test.testMethod;

class Sample{
	
	public static void main(String[] args){
 		
 		testMethod();
 		//import static文でtestMethodをインポートしているのでメソッド名だけで利用できる。
 		
 	}
	
}


パッケージとモジュール編・次回の内容

今回はパッケージの概要と使い方を紹介しました。
次回は、パッケージを利用してフォルダ分けしたクラスに対してアクセス制限を行う方法を解説していきます。


初めてのJavaシリーズの目次はこちら
パッケージとモジュール編の記事一覧はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら