Javaでの名前空間とパッケージ

名前空間について

名前空間とは?

名前空間とは、対象のものをある名称で確実に識別・特定するための概念です。

"対象のもの"というと非常に抽象的ですが、例えばJavaでのプログラミングにおいてクラス名や変数名などは重複しないように命名し、他と明確に区別しておく必要があります。

例えば、hogeというクラスがいくつもあった場合は、スクリプト中にhogeクラスの構文が書かれていてもコンピューターはどのhogeクラスを実行すればいいのか特定することはできません。

名前空間はこのようなクラス名の衝突を防ぐ役割を担います。

名前空間における名前集合の分割

名前空間では、名前の集合を分割することによって名前の衝突を防いでいます。

例えば、自分に「山田 太郎」さんという友人がいて、その人に手紙を送りたいと思ったとします。

その場合、手紙の宛名に「山田 太郎」とだけ書いて郵便局に持っていっても「山田 太郎」さんに手紙を送ることはできません。

なぜなら、日本全国には「山田 太郎」という名前の人がたくさんいるため、どの「山田 太郎」さんに手紙を届ければいいのか特定することができないからです。

この「山田 太郎」は「氏名」という名前の集合における名称です。

このように、「氏名」というある名前空間では対象のものを特定できない場合は、別の名前の集合を付け加えることで、名前の衝突を低減することができます。

例えば、「町名」という別の名前の集合も付け加えると「中央町に住んでいる山田太郎さん」とより特定が進みます。

同様に、「市区町村」や「都道府県」など大きな名前の集合を付け加えていくと、最終的に「○×県△□区中央町1-2-3に住んでいる山田太郎さん」という風に、最終的に必ず対象のものを特定することができるようになります。

名前空間という聞きなれない単語は一見難しそうに見えますが、普段から我々が日常生活で利用しているもののようです。

package構文について

パッケージとは?

Javaにおけるパッケージとは、クラスをまとめるためのものです。

作成したクラスは任意のパッケージに所属させることができます。

パッケージという名前空間でクラスを区別することによって、hogeパッケージのexampleクラス / hageパッケージのexampleクラスといったように同じ名前のクラス名を別の実体として対応付けることができます。

Javaではpackage構文を利用してパッケージの指定を行うことができます。

パッケージの命名規則

パッケージ名は組織のトップレベルドメイン名と、そのときの組織のドメインといくつかのサブドメインリストが逆順になったもので始まることが推奨されている。
http://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8_(Java)

と、上記引用文にもありますが、自分で作成したクラスにパッケージを指定する場合は、自分が保持しているドメインを利用すると名前空間の分割が行いやすいでしょう。

ドメイン名をパッケージに使用して組織内でクラス名を一意に保つようにすれば、重複の心配はなくなります。

package文は下記のように引数にパッケージ名を指定するだけで使用することができます。これをソースコードの冒頭に記述してパッケージの指定を行います。

package jp.linuxserver

import構文について

パッケージに所属しているクラスを使用する場合は、import構文を利用してパッケージ名を指定します。

例えば、ioパッケージ内すべてのクラスを使用するにはソースコードの冒頭で下記のように記述します。

import java.io.*;

なお、同じパッケージに属しているクラスはimport文を省略しても利用することができます。