パッケージとインポート
プログラムをひとつのファイルに全て記述すると、通常とても長くなって読みにくくなりますし、 共同で開発作業をするにしても、同じファイルを大勢が寄ってたかって編集するのもコンフリクトの発生が多くなりメンテナンスが大変になります。
ファイルを分割し、プログラムを物理的にも機能毎に整理することは可読性、メンテナンス性、再利用性など、たくさんの側面から利点があります。
package の作成
Kotlin ではファイルを分割することに加え、機能毎にパッケージ (package) という単位で論理的にファイルをグループ化できます。
また通常は同じパッケージに属するファイルは、同じディレクトリ内に保存します。
次のスクリーンショットは、IntelliJ の Kotlin プロジェクトですが、src ディレクトリがルートディレクトリになっています。 test という名前のパッケージを作るために src/test というサブディレクトリを用意しています。
src/test ディレクトリ内に test1.kt というファイルを作成して、その中で package test と指定しています。 これにより、このファイルは論理的に test というパッケージに属することになります。
ここではファイル名にも test という文字がありますが、ファイル名は自由に決められます。 test パッケージだからファイル名も test という文字から始めないといけないということはありません。
src/test/test1.kt は次の通りです。
package test fun foo() { println("foo") }
またsrc/test/test2.kt は次の通りです。
package test fun bar() { println("bar") } private fun baz() { println("baz") }
パッケージを import して使う
パッケージ test を利用する側では、次のように import キーワードを使って、 import test.* としてパッケージを取り込みます。
import test.* fun main() { foo() bar() }
test.* という風に、ワイルドカードを表す * を指定することで、 「test パッケージ内で参照できるもの全て」と指定したことになります。
test2.kt 内の baz 関数は private が指定されているので、外部から直接利用できません。
パッケージを利用する側はこのように、どのファイルに関数や型などが記述されているかを意識することなく、パッケージという論理的な単位でまとめて利用することができます。
もしここで、foo 関数だけを利用したい場合は、明示的にそれだけ取り込むことも可能です。
import test.foo fun main() { foo() //bar() この場合利用不可。 }
デフォルトパッケージ
Kotlin ではデフォルトで次のパッケージがインポートされます。これによって、何でもかんでもいちいちインポートを書かないといけない、という煩わしさから解放されてます。
- kotlin.*
- kotlin.annotation.*
- kotlin.collections.*
- kotlin.comparisons.* (バージョン 1.1 以降)
- kotlin.io.*
- kotlin.ranges.*
- kotlin.sequences.*
- kotlin.text.*
- java.lang.* (ターゲットが JVM の場合)
- kotlin.jvm.* (ターゲットが JVM の場合)
- kotlin.js.* (ターゲットが JS の場合)
以上、package とそのインポートの仕方について説明しました。