Setiap program Kotlin nyata terdiri atas banyak file, dan kompilator membutuhkan cara untuk mengelompokkan deklarasi yang berhubungan. Mekanisme pengelompokan itu bernama package. Pada chapter ini kita akan membahas cara mendeklarasikan package, konvensi penamaan yang dipakai ekosistem JVM, serta hubungan antara deklarasi package dengan struktur folder pada proyek Gradle. Pemahaman ini menjadi fondasi sebelum kita bisa memahami import, visibility, dan modularitas pada bab-bab berikutnya.

Apa Itu Package #

Package adalah ruang nama (namespace) yang mengelompokkan class, function, dan property terkait. Sebuah file .kt biasanya diawali dengan deklarasi package yang menentukan ruang nama semua deklarasi top-level di file tersebut. Tanpa deklarasi package, deklarasi top-level akan masuk ke default package — praktik yang tidak disarankan untuk proyek sungguhan karena rentan menimbulkan benturan nama.

Konvensi penamaan package mengikuti pola reverse-DNS: jika domain perusahaan adalah example.com, maka package dasar biasanya com.example. Penambahan segmen di belakang (misalnya com.example.aplikasi) memungkinkan kita membagi proyek menjadi sub-namespace yang lebih spesifik.

Deklarasi Package di Kotlin #

Deklarasi package ditulis pada baris paling atas file, sebelum import dan deklarasi lainnya. Berikut contoh konkretnya:

kotlin
// File: paket_deklarasi.kt
// Mendemonstrasikan deklarasi package di Kotlin.
package com.example.aplikasi

fun sapa(nama: String): String {
    return "Halo, $nama! Selamat datang di Aplikasi."
}

fun namaPaketLengkap(): String {
    val kelas = AplikasiInfo::class
    return kelas.qualifiedName ?: "paket tidak diketahui"
}

fun main() {
    val pesan = sapa("Budi")
    println(pesan)

    val namaPaket = namaPaketLengkap()
    println("Qualified name class AplikasiInfo: $namaPaket")

    val info = AplikasiInfo()
    println("Versi aplikasi: ${info.versi}")
}

class AplikasiInfo(val versi: String = "1.0.0")

Output yang Dihasilkan:

text
Halo, Budi! Selamat datang di Aplikasi.
Qualified name class AplikasiInfo: com.example.aplikasi.AplikasiInfo
Versi aplikasi: 1.0.0

Mari kita telaah baris-baris kode di atas:

  1. Baris 3 (package com.example.aplikasi): deklarasi package. Semua deklarasi top-level pada file ini (function sapa, namaPaketLengkap, main, dan class AplikasiInfo) berada dalam ruang nama com.example.aplikasi.
  2. Baris 5-7 (fun sapa(...)): function top-level pada package. Karena function berada dalam package, qualified name-nya menjadi com.example.aplikasi.sapa.
  3. Baris 9-12 (fun namaPaketLengkap()): menggunakan reflection ::class untuk mengambil KClass dari AplikasiInfo, lalu properti qualifiedName mengembalikan nama class beserta package-nya.
  4. Baris 14-22 (fun main): titik masuk program. Fungsi main memanggil sapa, mencetak qualified name, lalu membuat instance AplikasiInfo.
  5. Baris 25 (class AplikasiInfo(val versi: String = "1.0.0")): deklarasi class top-level. Konstruktor memiliki parameter dengan default value sehingga AplikasiInfo() menghasilkan instance dengan versi = "1.0.0".

Hubungan dengan Struktur Direktori #

Pada proyek Gradle berbasis JVM, kompilator Kotlin umumnya mengharuskan file .kt ditempatkan pada direktori yang mencerminkan nama package. File dengan deklarasi package com.example.aplikasi sebaiknya berada di src/main/kotlin/com/example/aplikasi/. Hal ini bukan sekadar konvensi — sebagian tooling (terutama yang berbasis Java reflection atau resource loading) mengasumsikan struktur tersebut.

Tanpa Package (Default Package) #

Sebuah file tanpa deklarasi package dikatakan berada pada default package. Deklarasi pada default package dapat diakses dari file lain tanpa import, tetapi praktik ini tidak disarankan untuk kode produksi karena sulit membedakan asal deklarasi dan rentan konflik nama.

Referensi Lanjutan #

  • Packages — panduan resmi deklarasi package di awal file Kotlin
  • Gradle — konfigurasi project Gradle yang memengaruhi struktur package

Selanjutnya #

Setelah memahami deklarasi package, langkah berikutnya adalah memanggil deklarasi dari package lain melalui statement import — topik yang akan kita bahas pada chapter import Statements.