javaのパッケージについて
Javaのパッケージの役割は3つ
・名前の衝突を避ける。(名前空間の提供)
・アクセス修飾子を使ってクラスの公開・非公開を制御できる。
・クラスの分類が可能。
名前の衝突を避ける
開発をする際、自分だけでプログラムを全て書くわけではなく、過去に書かれたソースを利用したり、外部のライブラリを利用したりするはず。
その際に、クラス名が被ってしまうとコンパイラやJVMがどのクラスを利用するか判断できずにエラーが発生したり、意図した設計が崩れてしまう可能性がある。
それを避けるために、コンパイラやJVMは FQCN(完全修飾クラス名, 完全限定クラス名)
でクラスを扱う。
パッケージ名.クラス名 ← 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つは全く別のものとなる。
※クラスは必ず何かしらのパッケージに属することになる。パッケージ宣言を省いたものは無名パッケージに属する解釈となる。