【Java】ソース分けとpackage宣言import宣言

2018年3月11日

本稿は、ソース分けする方法を説明します。合わせてpackage、importの指定方法についても説明します。

プログラムの規模が大きくなってくると、一つのファイルにすべてを記述するのでは、プログラムが非常にわかりにくくなっていきます。

ソースを分けておけば、1ファイルのコード量が減るため、多少見やすくなるはずです。

また、複数人開発でも役に立ちます。

ソースを同じフォルダに別ファイルとして分割

同ディレクトリに別ファイルを作成してファイル分割します。

Javaでは基本的に1クラス1ファイルが一般的なのでそれに習って分割するのをオススメします。

まずはメイン用のjavaファイルと別のjavaファイルを一つずつ用意しましょう。

ここではTest.javaとPack.javaとしました。

Test.java
public class Test {
	public static void main(String[] args){
		Pack p = new Pack();
		p.print();
	}
}
Pack.java
public class Pack {
	void print(){
		System.out.println("ファイル分割確認");
	}
}

ソースを記述したらTest.javaをコンパイルして実行しましょう。

実行結果

ファイル分割確認

分割だけなら非常に簡単ですね。

ファイルの分割が増えてくると、全てのファイルがコンパイルされない場合があるので、その場合はコンパイルされていないファイルもコンパイルしなければなりません。

コンパイルについてはこちらをご覧ください。

フォルダごとにファイルを分ける方法

フォルダごとにファイルを分ける方法もあります。その場合、ソースにpackage情報を記さなければなりません。

また、別フォルダのクラスを参照するにはパッケージ階層を.区切りでしていするか、import文の使用が必要になります。

それではまずは、フォルダを作成します。

フォルダ構成は作業フォルダを基点とし、下記のようにしました。
/Test.java
/pack/Pack.java

こんな感じで分けてください。

フォルダわけができたら、ソースですが、別フォルダのクラスを呼び出すにはパッケージ宣言が必要になります。

分けた方のソースファイルに「package フォルダ名;」と記述しましょう。

階層が深い場合は「package フォルダ名.フォルダ名;」等と記述します。

呼び出し元は「フォルダ名.クラス名」と記述します。

今回であれば、pack.Packです。

Pack.java
package pack;
public class Pack{
	public void print(){
		System.out.println("呼び出されました。");
	}
}
Test.java
public class Test {
	public static void main(String[] args){
		pack.Pack p = new pack.Pack();
		p.print();
	}
}

呼び出されました。


毎回フォルダ階層を書くのは面倒なので、通常はインポート宣言が使用されます。

Test.java
import pack.Pack;
public class Test {
	public static void main(String[] args){
		Pack p = new Pack();
		p.print();
	}
}

この構文でも、同じ結果が得られます。

ただし、クラス名が被ってしまうとimport宣言が使えない場合があります。

その場合はやはり階層を記述するパターンを使用するしかありません。


import 宣言にはワイルドカード「*」が使用できます。ワイルドカードを使用すると、そのパッケージのクラス全てが使用できるようになります。

試しに先ほどのpackフォルダにPack2を作成してみました。

フォルダ構成
/Test.java
/pack/Pack.java
/pack/Pack2.java

Pack.java
package pack;
public class Pack{
	public void print(){
		System.out.println("Packが呼び出されました。");
	}
}
Pack2.java
package pack;
public class Pack2{
	public void print(){
		System.out.println("Pack2が呼び出されました。");
	}
}
Test.java
import pack.*;
public class Test {
	public static void main(String[] args){
		Pack p = new Pack();
		p.print();
		
		Pack2 p2 = new Pack2();
		p2.print();
	}
}

Packが呼び出されました。
Pack2が呼び出されました。

「*」指定で複数のクラスが使用できるようになっていますね。

staticインポート

特定クラスのstatic要素をそのまま使用できるようにする方法があります。

staticインポートは「import static フォルダ名.クラス名.static要素名」などと記述します。

Pack.java
package pack;
public class Pack{
	public static void print(){
		System.out.println("Packが呼び出されました。");
	}
}
Test.java
import static pack.Pack.print;
public class Test {
	public static void main(String[] args){
		print();
	}
}

Packが呼び出されました。

staticインポートもワイルドカード「*」が使用できます。

必要な場合は使用してみるといいです。

Java

Posted by nompor