KATOエンジニヤリング開発日誌

「アウトプット無きエンジニアにインプットもチャンスも無い」の精神で書いています

Javaのパッケージについて学ぶ

「Javaプログラミング技法」の第10回目の授業内容まとめになります。

※前回授業の内容はこちら

www.kato-eng.info

パッケージとは

パッケージとは名前空間の中にあるJavaのクラスをまとめる機能である。

パッケージを利用しないことによる問題点

  1. 同じ場所に目的が異なるクラスが混在する f:id:masayuki_kato:20170719225424p:plain
  2. クラス名が重複してしまう(衝突する) f:id:masayuki_kato:20170719225523p:plain
  3. 別ディレクトリにあるクラスを利用できない f:id:masayuki_kato:20170719225703p:plain

クラスをディレクトリでまとめて連携させる仕組みをパッケージと呼ぶ。

パッケージの利点

  • 見た目がよい
    • 上記問題点の1を解決
  • 同じクラス名を使いまわすことができる
    • 上記問題点の2を解決
  • 別ディレクトリに配置したクラスを呼び出すことができる
    • 上記問題点の3を解決

クラスのパッケージ化

クラスをパッケージに含めるにはソースファイルの冒頭に「package パッケージ名」と記載し、パッケージ名と同じディレクトリに格納する。パッケージ名は原則としてクラス名と見分けるために小文字で書く。また、クラスのアクセス修飾子に「protected」が指定されている場合には、そのクラスとそのクラスと同じパッケージに含まれているクラスからアクセスすることができる。

Javaがクラスを探す仕組み

Javaは実行時にクラスパスで指定されたディレクトリからクラスを検索する。

※クラスパスの記述内容

/tmp/classes
/hogehoge

「Sample」というクラスを検索すると仮定した場合、最初に「/tmp/classes」ディレクトリが検索される。「/tmp/classes」にSampleクラスが存在すれば、それを参照する。「/tmp/classes」ディレクトリにSampleクラスが存在しない場合、次に「/hogehoge」ディレクトリからSampleクラスを検索する。それでも見つからない場合にはJavaが実行されたディレクトリが検索される。

パッケージに含めたクラスの利用

同じパッケージ内のクラスを呼び出すにはソースコード中でクラス名を指定すればよい。別のパッケージに含まれているクラスを利用したい場合にはソースコードに「パッケージ名.クラス名」の要領で階層的に指定をする。別パッケージからアクセスされるクラスには「public」修飾子をつける。

クラス名の種類

  • 単純名(Simple Name)
    • 「Foo」のように単一の識別子によるクラス名のこと
  • 完全限定名(Fully Qualified Name)
    • 「packagename.ClassName」のようにパッケージ名と合わせたクラス名のこと
    • 完全限定名を使うと別パッケージのpublicなクラスにアクセスすることができる

デフォルトパッケージ

パッケージ名を指定しなかったクラスが集められるパッケージのことをデフォルトパッケージと呼ぶ。デフォルトパッケージはクラス名の衝突が起きやすいので推奨されない。

パッケージの高度な利用

インポート

ソースコードのクラス名やメソッド名に完全限定名で記述すると冗長なうえ、本来の処理が読みにくくなってしまう。「import」を使うことで別パッケージのクラスを単純名で利用できるようになる。

サブパッケージ

パッケージの中にさらにパッケージを作成することができる。これをサブパッケージと呼ぶ。サブパッケージを使うことでクラスをさらに細かく分類することができる。サブパッケージの階層構造はディレクトリの階層構造と対応させる必要がある。また、ワイルドカードを利用するとパッケージ内の全てのクラスをインポートすることができるが、ワイルドカードで指定したパッケージ内のサブパッケージはインポートの対象外なので、サブパッケージ直下のワイルドカード指定をしてあげる必要がある。

※次回授業の内容はこちら

www.kato-eng.info