スッキリわかるJava入門 第6章 複数のクラスを用いた開発①
●ソースファイルを分割する
・複数のソースファイルに分けて開発する=複数のクラスに分けて開発する。
・ファイルごとに開発を分担し、それぞれが並行して開発を進められる。(=分業しやすい)
・1つのプログラムを複数の部品に分けることを部品化という。
・別クラスのメソッドを呼び出すときの記述。
・int total = CalcLogic.tasu(a,b); ⇒CalcLogicクラスのtasu()
・int delta = CalcLogic.hiku(a,b); ⇒CalcLogicクラスのhiku()
●複数クラスのコンパイル
・javacコマンドで複数のソースファイルを指定する。
> javac Calc.java CalcLogic.java … Calc.class CalcLogic.class
⇒それぞれのソースファイルに対応したクラスファイルが作成される。
●Javaプログラムの完成品
・Javaプログラムの完成品は、複数のクラスファイルの集合体。
・誰かに配布する際は、すべてのクラスファイルを渡す必要がある。
⇒上の例の場合、Calc.class CalcLogic.classを渡す。
・JVMは起動時に指定されたクラスの中にあるmainメソッドを呼び出してプログラムの実行を開始する。
・実行する場合は「渡された複数のクラスファイルのうち、mainメソッドが含まれているクラスの名前」を指定する必要がある。
●JARファイルとは?
・プログラムの完成品が複数のクラスファイルだと、メールで送る際などに不便。
・Javaでは「複数のクラスファイルを1つにまとめるファイル形式」としてJAR(Java ARchive)が定められている。
・JARファイルはZIPファイルととてもよく似たアーカイブファイルであり、JDKに付属するjarコマンドでも作成することができる。
●パッケージを利用する
・各クラスをパッケージ(package)というグループに所属させて、分類・管理する仕組み。
・クラスがあるソースコードの先頭にpackage文を記述する。
package 所属させたいパッケージ名;
(ただし package 文はソースコードの先頭に記述する)
・アルファベットは小文字を使う事が一般的。
・「calcapp.main」や「calcapp.logics」のようにドットで区切ったパッケージ名も多く用いられる。
・「calcapp.main」や「calcapp.logics」のように、パッケージ名の一部が同じであっても、それぞれのパッケージに関連性はない。
⇒パッケージに親子関係・階層関係は無い。
・どのパッケージにも所属していないことを「無名パッケージに属している」または「デフォルトパッケージに属している」と表現する。
・別パッケージに属しているクラスを利用する場合、所属パッケージ名を添えたクラス名を利用する。
・int total = Calcapp.logics.CalcLogic.tasu(a,b);
・int delta = Calcapp.logics.CalcLogic.hiku(a,b);
・あるクラスから別パッケージのクラスを利用する場合、「パッケージ名を頭につけた完全なクラス名」を使う必要がある。
⇒完全はクラス名のことを、完全限定クラス名(full qualified class name)、または略してFQCNと言う。
●名前空間
・パッケージを使うもう一つのメリット
⇒自分が作るクラスに対して、開発者が自由な名前を付けられるようにすること
・大規模な開発になると、複数の開発者が偶然「同じクラス名を使ってしまう」可能性が出てくる。
⇒内容が異なる別々のクラスで同じ名前を取り合ってしまうことを「名前の衝突」と言う。
・Javaではパッケージが異なれば、同じクラス名を使ってよい事になっている。
⇒クラス名が同一でも、パッケージ名が異なれば完全限定クラス名(FQCN)が異なるので両者は区別できる。
パッケージを使う事によって、それぞれのパッケージ内では自由にクラス名を付ける事が可能になる。
・パッケージ名が衝突すると、これらの前提はすべて崩れてしまう。
・推奨されるパッケージ名
⇒パッケージ名は「保有するインターネットドメインを前後逆順にしたもの」から始める。
・例)foo.example.comというインターネットドメインを取得している企業
⇒com.example.fooで始まるパッケージ名を使う。
インターネットドメインは世界に一つだけなので、パッケージ名が衝突する事はない。
com.example.fooより後は、企業や組織内部でパッケージ名が衝突しないように調整すればよい。
・import文を使うことで、FQCN入力のめんどうさを軽減できる。
import パッケージ名.クラス名;
※import文はソースコードの先頭に、ただしpackage文より後に記述する。
⇒頻繁に利用するクラスはimport文を使ってインポートしておくことによって、毎回完全限定クラス名を書く必要がなくなる。
・calcapp.logicsパッケージに所属するすべてのクラスをインポートしたい場合
import calcapp.logics.*;
⇒ただし「calcapp.*;」という記述では、calcapp.mainとcalcapp.logicsに所属するすべてのクラスを一度にインポートできないことに注意。
この指定では「calcappパッケージに所属する全クラス」がインポートされる。
●import宣言は、あくまで「めんどうさ軽減機能」
・Javaでは、一切の宣言をすることなく、JVMが扱えるすべてのクラスを常時使うことができる。
・ただし、利用に際しては必ずFQCNを利用しなければならず、import文はあくまでFQCNの記述を省略できるだけ。
⇒めんどうを軽減するため(開発者がラクをするため)の構文にすぎない。
・importしたからといって利用できるクラスやメソッドが増えたり、プログラムから利用できる機能が増えたりする事はない。