名前空間とは?
名前空間とは、クラス名やメソッド名などに一意性を与えるための仕組みです。多くの人が関わるプロジェクトでは、同じ名前のクラスや変数が生まれる可能性が高いため、スコープを分けて管理することが重要になります。
Javaにおける名前空間の種類
名前空間の種類 | 対象 |
---|---|
パッケージ空間 | クラス、インターフェース |
クラス空間 | メソッド、フィールド、内部クラス |
メソッド空間 | ローカル変数、引数 |
パッケージと名前空間
Javaでは**名前空間=パッケージ(package)**によって実現されます。
package com.example.utils; //パッケージ名(フォルダのようなもの)、クラスをグループ化する名前空間
public class MathUtil { //クラス名。実際に機能(addメソッドなど)を提供するコードの本体
public static int add(int a, int b) {
return a + b;
}
}
このように、Javaではクラスの冒頭で package 文を使って「パッケージ(名前空間)」を定義することができ、com.example.utils という名前空間の中に MathUtil クラスがあると明示されます。構造のイメージは下記のようになります。
com ← 最上位のパッケージ
└── example ← サブパッケージ
└── utils ← サブパッケージ
└── MathUtil.java ← この中に「MathUtil」クラスが定義されている
Javaにおける**名前空間(Namespace)**の目的は、主に以下の2つです:
1.前の衝突を避ける(識別のため)
たとえば、異なる開発者が**同じ名前のクラス(例:Utils)**を作った場合でも、パッケージ名で区別すれば衝突しません。
com.companyA.utils.Utils
com.companyB.utils.Utils
➡ これで 同じUtilsという名前でも共存可能になります。
2. コードの整理・管理がしやすくなる
クラスを機能ごとにパッケージに分類できるので、大規模なプロジェクトでも見通しよく管理できます。
com.example.model → データ構造(Model)関連のクラス
com.example.service → ビジネスロジック関連のクラス
com.example.controller → 外部とのインターフェース
完全修飾名
Javaでは、同じ名前のクラスでも異なるパッケージに属していれば共存可能です:
com.example.utils.MathUtil
com.example.common.MathUtil
インポートせずに使う場合、以下のように完全修飾名で指定することもできます:
com.example.utils.MathUtil.add(1, 2);
名前の衝突とその回避方法
import java.util.Date;
import java.sql.Date; // エラーになる
Date date = new Date(); // どっちのDate?
このように、異なるパッケージに同じクラス名が存在する場合はインポート時に注意が必要です。
このような場合には、完全修飾名で使い分けることが推奨されます:
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
まとめ
・名前空間は、同じ名前の要素が衝突しないようにする仕組みです
・Javaでは主にパッケージが名前空間として機能されます
・名前が衝突する場合は完全修飾名で使い分け可能です