■ パッケージ
はじめに
パッケージとは、クラス(.class)ファイルの集まりを示すものです。
パッケージを使用することで複数のクラス(.class)ファイルを分類し、管理することができます。
数多くクラスを作るとそのうちクラス名が重複することがあります。
その場合、 クラス名は同名でもパッケージ名で区別することが可能 です。
またこれにより、クラス(.class)ファイルは「パッケージ名+ファイル名」のように
名前空間(Namespace)が与えられて、名前の一意性も高まります。
では実際に見ていきましょう!
Step1: 概念を知る
【サンプルイメージ】
Javaはその仕様上、クラス(.class)ファイルを必ずどこかのパッケージに収める必要があります。
その為、パッケージを明示していない(いままでのような)クラス(.class)ファイルは
「デフォルトパッケージ」という形で取り扱っています。
…少々お固いしイメージ湧き辛いですね。
崩してみていきましょう!
上記と重複する内容もありますが、Javaにおいては以下の概念が存在します!
- 名前空間(namespace)
- パッケージ(package)
名前空間(namespace)
「対象のものを指定した名称で確実に識別・特定するための概念」
コンピュータって人間には無いすごい能力持ってますが、 使う側が適切に命令してあげないと上手く機能してくれません。
以下に(アナタと愉快な仲間達のふざけた)例をあげてみます。
// package なし; public static void main(String[] args) { // start 茶番 /* アナタがhogeに帰社して、「佐藤さーん!」って呼びかけたとしましょう。 この日本には腐るほどいますがhogeにも実はたくさんいるんですよ笑。 じゃ、このときアナタが意図して呼んだ「佐藤さん」って誰でしょう? あなたは「佐藤優輝さん」を呼んだつもりでも、同じフロアに数人いたとしたら以下のような感じになります。 佐藤優輝さん (゚∀゚)ん? 佐藤志希さん (゚∀゚)ん? 佐藤和明さん (゚∀゚)ん? ※椅子をくるっと回して振り向きます */ // end 茶番 }
はい。コンピュータってこんな感じで誤作動します。
(名前空間)
に記述した特定の人だということを察せないんです!KYなんです!
でも、 本来は一人だけを意図して呼んでいる(はず) ですよね?
名前空間は、こういったことが起きないような役割を担っている訳です!
パッケージ(package)
「名前空間の中にあるJavaクラスをまとめる仕組み」
- 【名前空間=パッケージ(package)】
佐藤 class を10だの100だの扱わなきゃいけないってなっても、
パッケージ名(名前空間)がしっかりと区別できていれば問題ありません!
【パッケージ名(名前空間)】
- 優輝
- 志希
- 和明
アナタは(実際のJavaファイルで)以下のように指定して呼んであげれば、
意図した動作(振り向き笑)+ 佐藤優輝さんだけにしか訊けないこと などを得られます!
package 佐藤;
ファイル的な階層だと下記の感じ。
(「 .(ピリオド or ドット)
」で繋いでいきますね
// 佐藤.優輝(所属チームのこと色々教えてくれる処理 // 佐藤.志希(スキルチェックとか見てくれる処理 // 佐藤.和明(phpとかjavaとかレビューしまくっちゃう処理
って感じの例えをイメージしてもらった上で、以下の(真面目な)内容を見ていきましょう!
Step2: 使い方を知る
パッケージの指定の方法
パッケージに含めるファイルでソースの先頭部分に書きます。
package パッケージ名;
パッケージ内のクラスおよびインタフェースの呼び出し
パッケージ名.クラス名 パッケージ名.インタフェース名
補足
- ・インターフェース
- 簡潔に言えば、 処理の実装されていないメソッドを束ねるクラスのようなもの です。
「処理の実装されていない」というのは、{ }(ブロック)
内の処理が未実装 ということです。
【サンプル】
定義の方法は以下のようになります。
public interface インターフェース名 { // 処理の実装されていないメソッド public void sample(); }
※詳細は インターフェース・抽象クラス・ポリモーフィズム で解説します。
例
hoge/Worker.java
package hoge; public class Worker { public String getName() { return "hogeの従業員です。"; } }
Step3: インポート
インポートとは、他のパッケージに記入されているクラスや関数を実行するための方法です。
プログラミングしているとき、よく他のクラスを利用してクラスのインスタンスを生成します。
import [パッケージ名].[クラス名]; import [パッケージ名].*;
使い方
// javaパッケージの中のlangパッケージの中のMathクラスをimport import java.lang.Math; public class StaticClass { public static void staticMethod(){ int num1 = 10; int num2 = 20; // importしたMathクラスのmaxメソッドを使用 int nmax = Math.max(num1, num2); System.out.println("nmax : " + nmax); } }
【出力結果】
nmax : 20
Step4: パッケージの作成
次は作り方になります。
まずは手順を提示していきますので、順に見ていきましょう!
作成手順
事前に適当なプロジェクトを作成しておきます。
今回はプロジェクト名を「 SamplePackage 」とします。
【1】プロジェクト直下の src よりメニューを開き、 [新規] → [パッケージ] を選択
【1】Eclipse TOPメニューからでもパッケージの作成は可能です
【2】パッケージ名を入力
【3】今回は「 parent 」 とします。
【4】作成後は、このように白い小包のようなアイコンが表示されます。
これが基本の作成方法になります。
続いて、パッケージの直下にパッケージを作成していきます。
【5】「 parent 」 の子要素を作成していきます。パッケージ名は「 child_1 」とします。
【6】「親.子」のようになりました。
【7】同様に、パッケージ名「 child_2 」を作成します。
【8】1行の「 .(ピリオド)
」で繋がれていたものが、階層構造になりました。
ポイント
- ・パッケージはカテゴリ
- 一つひとつ意味のある命名にすることはマストですが、大枠の考え方は「 大分類 > 中分類 > 小分類 」のような、
ディレクトリを作成するイメージです! - ・階層構造
- 1つの親に対し、2つ以上の子パッケージが存在する場合は、Eclipseが見た目上の構造を階層構造へ切り替えて表示してくれます。
プロジェクトのファイル(javaファイルなど)は、
基本的にはパッケージ直下に作成して管理していきます。
グルーピングすることにより、 作業効率とメンテナンス性の向上 を図ります!
今後プロジェクトの作成時にはパッケージを作成してもらう機会も出てくるので、
今のうちにしっかりと作成方法も身に着けましょう!
課題
Java2章からはEclipseでの課題対応となります。
※ プロジェクトの作成方法については Eclipseの使い方 を参考にしてください。
プロジェクト名・・・ 2-4
パッケージ名1 ・・・ study
Java クラス名 ・・・ Study.java (下記コードをコピー)
Study.java
package study; //①FruitsConstantsをインポートしなさい。 //②Fruits.javaをインポートしなさい。 /** * 本課題では、基本的なJavaの構造と、importについて理解を深めていきましょう。 * * 問①〜問③まであります。 * 全て回答し、課題にある画像と同じ表示になるようにしてください。 * */ public class Study { public static void main(String[] args) { /* ③ Fruits.javaのprintFruitsメソッドを呼び出しなさい。 * また、課題の画像と同じ表示になるように * printFruitsの引数にはFruitsConstantsから呼び出した値を設定してください。 */ } }
パッケージ名2 ・・・ fruits
Java クラス名 ・・・ Fruits.java (下記コードをコピー)
Fruits.java
package fruits; public class Fruits { public static void printFruits(String fruits, int count) { System.out.println("食べ物は" + fruits); System.out.println(count + "個です"); } }
パッケージ名3 ・・・ constants
Java クラス名 ・・・ FruitsConstants.java (下記コードをコピー)
FruitsConstants.java
package constants; /** * フルーツの定数クラス */ public class FruitsConstants { // フルーツ定数(種類) public static final String FRUITS_APPLE_01 = "りんご"; public static final String FRUITS_GRAPE_02 = "ぶどう"; public static final String FRUITS_WATERMELON_03 = "スイカ"; public static final String FRUITS_LEMON_04 = "レモン"; public static final String FRUITS_MELON_05 = "メロン"; // フルーツ定数(個数) public static final Integer FRUITS_COUNT_10 = 10; public static final Integer FRUITS_COUNT_20 = 20; public static final Integer FRUITS_COUNT_45 = 45; public static final Integer FRUITS_COUNT_78 = 78; public static final Integer FRUITS_COUNT_100 = 100; }
以下の添付画像のようにコンソールへ出力されるよう課題を実施し提出してください。
課題を提出するときには、「2-4」ディレクトリ配下にあるすべてのファイルをコミット、プッシュしてください。