どうも。つじけ(tsujikenzo)です。このシリーズでは「ノンプログラマーのためのはじめてのJava体験」を、お送りします。今日は3回目です。
前回のおさらい
前回は、「Javaでクラスを体験しよう」ということで、フィールド、メソッド、コンストラクタなどの基礎を学びました。
今回は、「Javaでパッケージを体験しよう」をお送りします。
今日のアジェンダ
- クラスのフォルダ分け
- パッケージとパッケージ宣言
- 完全修飾クラス名とimport文
- 補足
クラスのフォルダ分け
前回の記事では、このように、プロジェクト(フォルダのことです)内に、複数のクラスファイルを作成しました。
コンパイルすると、このように同一フォルダに、classファイルが作成されると思います。
アプリケーションを開発していくと、Javaファイルもclassファイルも増え続けていくと思います。
そこで、クラスもフォルダで整理整頓できると便利ではないでしょうか。
みなさんが増えすぎた写真や書類を整理するためにフォルダ分けするのとおなじです。
このようなイメージです。
パッケージとパッケージ宣言
Javaには、クラスを、アプリケーション設計者の目的ごとに整理するための、パッケージ機能が提供されています。
パッケージを使うと、こんなメリットがあります。
- クラスの名前の衝突を避ける(クラス名の重複回避)
- クラスの外部からのアクセスを制御する
- クラスを階層に作成できる
- クラスをまとめて再利用することができる
フォルダとファイルを作成する
では、パソコンのエクスプローラーを開き、フォルダとJavaファイルを作成しましょう。(Javaファイルの中身は空っぽでかまいません)
これで、[Japanese.java]ファイルは、[greeting]フォルダの[jp]フォルダにパッケージ化されます。
パッケージ宣言
フォルダ分けされたJavaファイルを、コンパイルして実行するために、パッケージ宣言が必要です。
パッケージ宣言は、か・な・ら・ず (強調します)Javaファイルの先頭に記述します。
パッケージが階層構造になっているばあいは、階層順に.(ドット)でパッケージを表現します。
フォルダ名とパッケージ宣言が、同じ文字列になるように、大文字小文字も注意しましょう。パッケージは基本的に小文字が使われます。
//Japanese.java
package greeting.jp;
public class Japanese {
public String greet() {
return "こんにちわ!";
}
}
同様に、その他のファイルも写経しましょう。
//English.java
package greeting.en;
public class English {
public String greet() {
return "Hello!";
}
}
//Main.java
public class Main {
public static void main(String[] args) {
String greetJp = new greeting.jp.Japanese().greet();
System.out.println(greetJp);
String greetEn = new greeting.en.English().greet();
System.out.println(greetEn);
}
}
クラスの完全修飾名
パッケージ化すると、クラス名が変わります。そのクラス名を完全修飾名と呼びます。
さきほどの、Mainクラスに注目してみましょう。
Japaneseクラスはパッケージ化されたので、完全修飾クラス名を記述しなければなりません。
String greetJp = new greeting.jp.Japanese().greet();
コンパイルして、実行してみましょう。
import文
パッケージ化されたクラスの呼び出しは、必然的にコード量が増え、冗長になります。
//インスタンス生成時の型指定と完全修飾クラス名の呼び出し
greeting.jp.Japanese j = new greeting.jp.Japanese());
そこで、ファイルの先頭にimport文を記述して、完全修飾クラス名の呼び出しを省略します。
import文を記述して、Mainクラスを書き換えてみましょう。
//Main.java
import greeting.jp.Japanese;
import greeting.en.English;
public class Main {
public static void main(String[] args) {
String greetJp = new Japanese().greet();
System.out.println(greetJp);
String greetEn = new English().greet();
System.out.println(greetEn);
}
}
コンパイルして、実行してみましょう。
宿題
宿題の提出は、Twitterまでお願いいたします。
ノンプロ研メンバーは、お好きなSlackチャンネルに提出いただければ添削いたします!
補足(階層深くにあるJavaファイルの実行)
このように、階層深くに、実行したいJavaファイル(Test.java)があるパターンもご説明します。
かならず、先頭行でパッケージ宣言をします。
package japan.hokkaido;
public class Test {
public static void main(String[] args) {
System.out.println("We love Hokkaido!");
}
}
コンパイル
コンパイルは、Javaファイルまでのパスを、コマンドラインに記述します。
カレントディレクトリから、実行したいJavaファイル(Test.java)までディレクトリ移動する必要はありません。
コンパイルするとclassファイルが生成されます。(画面は割愛します)
実行する
パッケージ化したので、Test.javaファイルの正式なクラス名(完全修飾クラス名)は[japan.hokkaido.Test.java]になりました。
classファイルも同様ですので、このように記述して、実行します。
他クラスを呼び出す
最後に、このように他パッケージのクラスを呼び出す方法を復習します。
メインメソッドが書かれているクラスをパッケージ化し、呼び出すGreetクラスをimportします。
//Testファイル
package japan.hokkaido;
import japan.okinawa.Greet;
public class Test {
public static void main(String[] args) {
System.out.println("We love Hokkaido!");
Greet.main();
}
}
呼び出されるクラスは、このように記述します。
//japan.okinawa.Greetファイル
package japan.okinawa;
public class Greet {
public static void main() {
System.out.println("We love Okinawa!");
}
}
コンパイルして、実行しましょう。
まとめ
以上で、「ノンプログラマーのためのはじめてのJava体験3」をお届けしました。
Javaは基本的に1ファイル1クラスでコーディングします。そうなると自然とクラスが増えていきます。
中規模なアプリケーションになってくると、何百というクラスを扱うようです。それは、クラスの効率的な整理が必要ですね。
わたしも一度は耳にしたことがあるパッケージの仕組みが、少し分かったような気がします。
次回(内容未定です)を、お楽しみに。