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:

kotlin Deklarasi package
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:

kotlin Import simbol tunggal
import kotlin.math.sqrt
import kotlin.math.PI

fun hitungAkar(nilai: Double): Double = sqrt(nilai)
fun luasLingkaran(radius: Double): Double = PI * radius * radius

Import 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:

kotlin Import wildcard
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:

kotlin Import alias dengan 'as'
import java.util.HashMap as JHashMap
import kotlin.collections.HashMap as KHashMap

Setelah 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:

kotlin
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:

text
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:

  1. Baris 1 (package contoh.dasar) — seluruh deklarasi di file ini menjadi anggota package contoh.dasar; file lain dapat memanggil hitungAkar setelah mengimpornya dari package ini.
  2. Baris 4-5 (import tunggal sqrt dan PI) — dua simbol yang paling sering dipakai diimpor eksplisit agar asalnya jelas.
  3. Baris 8 (import kotlin.math.*) — wildcard membawa simbol pow, sin, cos, dan lain-lain ke ruang lingkup file. Karena pow dipakai di baris 21, ia tersedia tanpa import eksplisit tambahan.
  4. Baris 11 (import alias) — java.util.HashMap diberi alias JHashMap untuk membedakannya dari kotlin.collections.HashMap bawaan Kotlin.
  5. Baris 22-25 (JHashMap) — JHashMap dipakai sebagai pengganti HashMap biasa, 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 seperti Int, 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 #

AspekKotlinJava
Import tunggalimport kotlin.math.sqrtimport static java.lang.Math.sqrt; (static)
Import wildcardimport kotlin.math.*import java.util.*;
Import aliasimport java.util.HashMap as JHashMapTidak didukung (butuh fully qualified name)
Import staticOtomatis untuk anggota object dan top-level functionMemerlukan 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.