Saat proyek tumbuh, simbol seperti class dan function perlu dikelompokkan agar tidak saling menabrak. Pada chapter ini kita akan membedah tiga konstruksi yang mengatur ruang nama di Kotlin: deklarasi package yang menempatkan simbol ke dalam namespace, import yang membawa simbol dari package lain ke ruang lingkup file, dan import alias yang menyelesaikan benturan nama. Kita juga akan melihat perbedaan perilaku import Kotlin dibandingkan Java.
Deklarasi package #
Deklarasi package ditempatkan paling atas file, sebelum semua import dan deklarasi lain. Nama package mengikuti konvensi domain terbalik:
package contoh.dasar
fun sapa(nama: String): String = "Halo, $nama!"Setelah deklarasi package, seluruh simbol yang didefinisikan di file tersebut — function, class, property — secara otomatis menjadi anggota package contoh.dasar. File lain di package yang sama dapat memanggil sapa tanpa import.
Import Simbol Tunggal #
Untuk memakai simbol dari package lain, kita impor secara eksplisit. Berikut import function sqrt dan konstanta PI dari kotlin.math:
import kotlin.math.sqrt
import kotlin.math.PI
fun hitungAkar(nilai: Double): Double = sqrt(nilai)
fun luasLingkaran(radius: Double): Double = PI * radius * radiusImport simbol tunggal membuat dependensi file menjadi jelas — pembaca tahu persis simbol mana yang dipakai. Pendekatan ini cocok untuk file yang hanya memakai beberapa simbol dari package jauh.
Import Wildcard #
Ketika satu file memakai banyak simbol dari package yang sama, kita dapat memakai wildcard * untuk mengimpor seluruh simbol pada package:
import kotlin.math.*
val a = sqrt(144.0)
val b = PI * 7 * 7
val c = 2.0.pow(10)Wildcard mengurangi baris import, namun membuat asal simbol kurang jelas. Saat membaca pow, pembaca harus menebak dari package mana simbol tersebut berasal.
Import Alias #
Ketika dua package berbeda memiliki simbol dengan nama yang sama, kita pakai import alias untuk memberi nama alternatif. Sintaksnya memakai keyword as:
import java.util.HashMap as JHashMap
import kotlin.collections.HashMap as KHashMapSetelah import, kita memakai alias JHashMap dan KHashMap di kode — bukan nama asli. Alias tidak mengubah perilaku class, hanya memberi nama alternatif lokal pada file tersebut.
Contoh Lengkap dengan Tiga Pola #
Berikut program yang memadukan ketiga pola import:
package contoh.dasar
// Import satu simbol
import kotlin.math.sqrt
import kotlin.math.PI
// Import seluruh package dengan wildcard
import kotlin.math.*
// Import alias untuk menghindari benturan nama
import java.util.HashMap as JHashMap
// Top-level function
fun hitungAkar(nilai: Double): Double = sqrt(nilai)
fun luasLingkaran(radius: Double): Double = PI * radius * radius
fun main() {
println("Akar 144 = ${hitungAkar(144.0)}")
println("Luas lingkaran r=7 = ${luasLingkaran(7.0)}")
println("Hasil 2 pangkat 10 = ${2.0.pow(10).toInt()}")
// Memakai alias import
val peta = JHashMap<String, Int>()
peta["Budi"] = 1
peta["Siti"] = 2
println("Isi peta: $peta")
}Output yang Dihasilkan:
Akar 144 = 12.0
Luas lingkaran r=7 = 153.93804002589985
Hasil 2 pangkat 10 = 1024
Isi peta: {Budi=1, Siti=2}Mari kita amati bagian penting:
- Baris 1 (
package contoh.dasar) — seluruh deklarasi di file ini menjadi anggota packagecontoh.dasar; file lain dapat memanggilhitungAkarsetelah mengimpornya dari package ini. - Baris 4-5 (import tunggal
sqrtdanPI) — dua simbol yang paling sering dipakai diimpor eksplisit agar asalnya jelas. - Baris 8 (
import kotlin.math.*) — wildcard membawa simbolpow,sin,cos, dan lain-lain ke ruang lingkup file. Karenapowdipakai di baris 21, ia tersedia tanpa import eksplisit tambahan. - Baris 11 (import alias) —
java.util.HashMapdiberi aliasJHashMapuntuk membedakannya darikotlin.collections.HashMapbawaan Kotlin. - Baris 22-25 (
JHashMap) —JHashMapdipakai sebagai penggantiHashMapbiasa, sehingga pembaca tahu kita memakai versi Java.
Import Default yang Tidak Perlu Ditulis #
Beberapa package secara otomatis diimpor pada setiap file Kotlin tanpa kita menulisnya:
kotlin.*— core language (function, class dasar sepertiInt,String,List).kotlin.annotations.*— anotasi meta.kotlin.collections.*— koleksi (List,Map,Set,MutableList).kotlin.ranges.*— range (1..10,until).kotlin.io.*—print,println,readLine.kotlin.text.*— operasi string (StringBuilder,Regex).- Pada platform JVM:
java.lang.*otomatis diimpor.
Karena sudah otomatis, kita tidak perlu menulis import kotlin.collections.List untuk memakai List. Menulisnya tetap valid, hanya dianggap redundan.
Perbandingan dengan Java #
| Aspek | Kotlin | Java |
|---|---|---|
| Import tunggal | import kotlin.math.sqrt | import static java.lang.Math.sqrt; (static) |
| Import wildcard | import kotlin.math.* | import java.util.*; |
| Import alias | import java.util.HashMap as JHashMap | Tidak didukung (butuh fully qualified name) |
| Import static | Otomatis untuk anggota object dan top-level function | Memerlukan import static eksplisit |
Karena Kotlin function top-level disimpan sebagai method static pada class sintetik, kita dapat mengimpor function top-level seperti kotlin.math.sqrt tanpa memikirkan static import. Inilah salah satu kenyamanan Kotlin dibanding Java.
Referensi Lanjutan #
- Kotlin packages
— panduan resmi
package,import, dan impor nama yang berkonflik
Package dan import mengatur bagaimana simbol tersebar dalam kode base besar. Setelah memahami ruang nama, kita siap membedah kapan keputusan diambil saat kompilasi versus saat program berjalan — pembahasan lengkap menanti pada chapter Compile-Time vs Runtime.