Variabel dan Tipe

Variabel sebagai nama yang terikat pada nilai dengan tipe konkret saat runtime, beserta aturan penamaan dan penggantian nilainya.

Daftar isi

Topik ini membahas variabel pada Julia, mulai dari cara sebuah nama terikat pada nilai, cara memeriksa tipe nilai saat runtime (ketika program berjalan), hingga aturan penamaan yang berlaku, termasuk pengenal Unicode. Pembahasan juga mencakup konstanta yang dideklarasikan dengan const serta perilaku tipe ketika nilai sebuah variabel diganti. Setelah membacanya, deklarasi variabel dan konstanta dapat ditulis dengan mengikuti konvensi Julia secara tepat.

Variabel sebagai nama yang terikat pada nilai#

Variabel di Julia bukan wadah yang tipenya ditetapkan sejak awal. Variabel adalah nama yang terikat pada sebuah nilai, dan tipe konkret dimiliki oleh nilainya, bukan oleh namanya. Operasi = melakukan pengikatan (binding) tersebut, sehingga penulisan sisa_stok = 24 berarti nama sisa_stok menunjuk nilai 24 bertipe Int64. Karena tipe melekat pada nilai, nama yang sama dapat diikat ulang ke nilai dengan tipe lain tanpa deklarasi apa pun.

Potongan berikut mendeklarasikan satu variabel, lalu menampilkan nilainya beserta tipe konkretnya.

julia
sisa_stok = 24
println(sisa_stok)
println(typeof(sisa_stok))
text Keluaran
24
Int64

Keluaran memperlihatkan nilai 24 dengan tipe konkret Int64. Fungsi typeof() tidak menebak dari nama variabel, melainkan membaca tipe dari nilai yang sedang terikat pada nama tersebut. Nama sisa_stok sendiri tidak menyimpan informasi tipe apa pun. Diagram berikut menggambarkan hubungan nama, nilai, dan tipenya.

namanilai dan tipe konkretsuhu36.7 :: Float64nama"Citra" :: String
Pengikatan nama pada nilai beserta tipe konkretnya

Model ini berbeda dengan bahasa yang mengikat tipe pada nama variabelnya. Pertanyaan mengenai tipe sebuah variabel pada Julia sebenarnya menanyakan tipe nilai yang sedang terikat pada namanya. Perbedaan tersebut menjadi fondasi banyak perilaku Julia, termasuk kemudahan mengganti nilai dan sistem tipe yang menopang pemilihan metode.

Memeriksa tipe dengan typeof dan isa#

Fungsi typeof() mengembalikan tipe konkret dari sebuah nilai, sedangkan operator isa menguji apakah sebuah nilai termasuk tipe tertentu dan menghasilkan true atau false. Keduanya sering digunakan berdampingan ketika kode baru sedang disusun, karena yang satu melihat tipe persisnya dan yang lain menguji keanggotaan pada kelompok tipe yang lebih luas.

julia
suhu = 36.7
nama = "Citra"
println(typeof(suhu))
println(typeof(nama))
println(suhu isa Float64)
println(nama isa AbstractString)
text Keluaran
Float64
String
true
true

Nilai 36.7 bertipe Float64, sedangkan teks Citra bertipe String. Uji suhu isa Float64 bernilai true karena tipe konkretnya persis sama dengan yang diuji. Uji kedua menggunakan AbstractString, yaitu tipe abstrak yang mencakup String dan tipe string lain, dan hasilnya juga true. Tipe abstrak mengelompokkan tipe-tipe konkret yang berbagi sifat, sehingga pengujian terhadapnya dilakukan pada nilai, bukan pada nama variabelnya.

Mengganti nilai dan tipe yang ikut berubah#

Penggantian nilai dilakukan dengan menuliskan penugasan baru pada nama yang sama. Julia menentukan tipe dari nilai penggantinya saat runtime, sehingga apabila nilai barunya bertipe lain, tipe yang terbaca juga berganti. Tidak ada error yang muncul, dan tidak ada deklarasi ulang yang diperlukan.

julia
jumlah = 10
println(typeof(jumlah))
jumlah = 10.5
println(typeof(jumlah))
jumlah = "sepuluh"
println(typeof(jumlah))
text Keluaran
Int64
Float64
String

Tiga baris keluaran memperlihatkan perjalanan tipe dari Int64 ke Float64 lalu ke String. Nama jumlah tidak pernah berubah, sedangkan yang berubah hanyalah nilai yang terikat padanya. Perilaku ini sah menurut aturan Julia, tetapi kebiasaan membuat satu nama berganti-ganti tipe menyulitkan pembacaan kode. Apabila makna datanya memang berubah, memberi nama baru yang deskriptif lebih mudah diikuti.

Konstanta dengan const#

Deklarasi const membuat pengikatan yang tidak dimaksudkan untuk diganti nilainya. Konstanta membantu Julia menghasilkan kode yang lebih cepat karena tipe nilainya dapat diasumsikan tetap, sehingga menjadi tempat yang tepat untuk nilai yang tidak berubah sepanjang program berjalan. Konvensi penamaannya menggunakan huruf kapital dengan garis bawah sebagai pemisah kata. Julia juga menyediakan konstanta siap pakai seperti π yang bertipe Irrational{:π}.

julia
const GRAVITASI = 9.81

try
    global GRAVITASI
    GRAVITASI = 10.0
catch err
    println(typeof(err))
end

println(GRAVITASI)
text Keluaran
ErrorException
9.81

Penugasan ulang pada konstanta memicu ErrorException, sehingga blok catch menangkapnya dan program selesai secara normal. Nilai GRAVITASI tetap 9.81 karena penugasan barunya ditolak. Kata kunci global di dalam blok try menyatakan bahwa nama tersebut menunjuk konstanta tingkat atas, bukan variabel lokal blok. Tanpa kata kunci itu, penugasan justru menciptakan variabel lokal baru, dan konstanta tidak tersentuh.

julia
println(π)
println(typeof(π))
text Keluaran
π
Irrational{:π}

Konstanta π tersedia sejak awal tanpa perlu diimpor, dan presisinya dijaga selama perhitungan belum dikonversi ke Float64.

Berkas berikut merangkum deklarasi variabel dan konstanta dalam satu program kecil yang menghitung sisa stok buku.

julia pengenalan-variabel.jl
# Program kecil: mencatat sisa stok buku di perpustakaan
const JUDUL = "Pengantar Statistika"

stok = 12
pinjam = 5
stok = stok - pinjam

println("Judul: ", JUDUL)
println("Sisa stok: ", stok)
println("Tipe stok: ", typeof(stok))
text Keluaran
Judul: Pengantar Statistika
Sisa stok: 7
Tipe stok: Int64

Konstanta JUDUL menampung teks yang tidak berubah, sedangkan variabel stok diperbarui mengikuti jumlah peminjaman. Tipe stok tetap Int64 karena nilai penggantinya juga integer.

Aturan penamaan dan pengenal Unicode#

Nama variabel pada Julia peka huruf besar-kecil, sehingga Nilai dan nilai merupakan dua nama yang berbeda. Konvensi yang lazim menggunakan huruf kecil dengan garis bawah sebagai pemisah kata, misalnya sisa_stok. Nama tidak boleh menggunakan kata kunci bahasa seperti function, if, atau true, dan tidak boleh diawali angka. Angka boleh muncul setelah huruf pertama, sehingga x2 sah sebagai nama, sedangkan 2x dibaca sebagai perkalian 2 dengan x. Di luar aturan itu, Julia menerima huruf dari berbagai aksara Unicode, sehingga pengenal seperti δ atau α_sudut sah digunakan.

julia
δ = 0.5
α_sudut = 30
println(δ)
println(typeof(δ))
println(α_sudut)
text Keluaran
0.5
Float64
30

Pengenal Unicode membuat kode numerik terlihat mirip dengan notasi matematisnya, misalnya δ untuk koefisien redaman. Pengetikannya tidak memerlukan papan ketik khusus karena REPL dan editor Julia menyediakan pelengkapan dari notasi LaTeX.

Kesalahan umum#

Kesalahan pertama yang paling sering muncul adalah menggunakan nama yang belum pernah didefinisikan. Julia tidak menyediakan nilai bawaan untuk nama yang belum diikat, sehingga pembacaannya langsung memicu error.

julia
try
    println(nama_belum_didefinisikan)
catch err
    println(typeof(err))
end
text Keluaran
UndefVarError

Error UndefVarError semacam ini biasanya berasal dari salah ketik, misalnya stokSisa padahal yang dideklarasikan adalah stok_sisa, atau dari huruf kapital yang tak sengaja ditambahkan. Memeriksa ejaan nama pada baris yang ditunjuk pesan error umumnya sudah cukup untuk memperbaikinya.

Kesalahan kedua adalah mengira nama menyimpan tipe tetap sebagaimana pada bahasa yang tipe variabelnya statis. Ekspektasi tersebut membuat pembaca terkejut ketika jumlah yang semula Int64 berubah menjadi String. Tipe melekat pada nilai, dan penggantian nilai memang boleh mengganti tipenya.

Kesalahan ketiga adalah memberi nilai baru pada konstanta. Penugasan ulang pada nama hasil const selalu ditolak dengan ErrorException, sehingga nilai konstanta terlindungi dari perubahan tanpa sengaja. Apabila nilainya memang perlu berubah selama program berjalan, gunakan variabel biasa dan sisakan const untuk nilai yang benar-benar tetap.

Ringkasan#

  • Variabel adalah nama yang terikat pada nilai, dan tipe konkret dimiliki oleh nilai sehingga typeof() membacanya dari nilai yang terikat.
  • Penggantian nilai boleh mengganti tipe karena tipe ditentukan saat runtime, sedangkan isa menguji keanggotaan tipe dengan hasil true atau false.
  • const membuat pengikatan yang penugasan ulangnya ditolak dengan ErrorException, dan konstanta siap pakai seperti π telah tersedia.
  • Penamaan peka huruf besar-kecil, mengikuti konvensi huruf kecil dengan garis bawah, dan menerima pengenal Unicode seperti δ.

Referensi#