javaのパッケージについて

Javaのパッケージの役割は3つ

・名前の衝突を避ける。(名前空間の提供)

・アクセス修飾子を使ってクラスの公開・非公開を制御できる。

・クラスの分類が可能。



名前の衝突を避ける

開発をする際、自分だけでプログラムを全て書くわけではなく、過去に書かれたソースを利用したり、外部のライブラリを利用したりするはず。

その際に、クラス名が被ってしまうとコンパイラJVMがどのクラスを利用するか判断できずにエラーが発生したり、意図した設計が崩れてしまう可能性がある。



それを避けるために、コンパイラJVMFQCN(完全修飾クラス名, 完全限定クラス名)

でクラスを扱う。


パッケージ名.クラス名 ← FQCN(full qualified class name)



被りをふせがないといけないから、パッケージは基本的には一意でなければならない。
それを実現するための慣習として、ドメイン名を逆にしたものをパッケージ名にすることが多い。
(もちろん任意のパッケージ名をつけることはできる)

もしドメイン名が
hogehoge.co.com
だったら、パッケージ名は
com.co.hogehogeになる。



アクセス修飾子を使ってクラスの公開・非公開を制御できる。

先ほどのcom.co.hogehogeをパッケージ名とした二つのクラスを作る。

Aクラス
package com.co.hogehoge;
public class A {
  ~~~~~
}


Bクラス
package com.co.hogehoge;
class B {
  ~~~~~
}

こういうcom.co.hoghogeパッケージに属する二つのクラスが合ったとき
Aはpublicなので、外部パッケージからでも利用できるが、Bはpublicではないので、外部からは使えない。

クラスの分類が可能
Aクラス
package com.co.hogehoge;
public class A {
  ~~~~~
}

Aクラス
package com.co.fugafuga;
public class A {
  ~~~~~
}

この場合、どちらもAクラスで同じ物に見えるが、
クラスはパッケージ名.クラス名で扱う(FQCN)ので
この2つは全く別のものとなる。



※クラスは必ず何かしらのパッケージに属することになる。パッケージ宣言を省いたものは無名パッケージに属する解釈となる。