Users  

   

Hobi  

   

Statistik  

Visitors
246
Articles
59
Articles View Hits
417199
   

User Online  

We have 38 guests and no members online

   

BAB IV.1

Details

Variabel dan Memory Management
Di bagian ini kita akan banyak membahas tipe-tipe data yang bisa berada dalam JVM dan
bagaimana JVM meletakkannya dalam memory. Bagian terakhir akan membahas bagaimana
Garbage Collector bekerja membersihkan JVM dari data yang sudah tidak digunakan lagi.


Variabel
Setelah belajar dasar-dasar bagaimana membuat kode java, kita akan membahas dasar-dasar
bahasa java mulai dari bab ini. Hal pertama yang akan kita pelajari adalah memory
management di java, untuk memahami bagaimana variabel disimpan dalam memory oleh JVM
kita akan belajar tentang stack dan heap. Program java akan berada dalam stack atau heap
selama daur hidupnya, instance variabel dan object selalu berada di heap sedangkan local
variabel berada di dalam stack.
Mari kita lihat kode java di bawah ini, dan bagaimana bagian-bagian itu disimpan dalam heap
atau stack:


public class Person{
private Long id; //instance variable
private String nama; //instance variable
public static void main(String[] args){
Person ifnu; //local variable/reference variabel ifnu
ifnu = new Person(); //object Person diinstansiasi
ifnu.setId(17l);
ifnu.setNama("ifnu bima");
Person klonenganIfnu = ifnu; //local variable yang menunjuk ke object
klonenganIfnu.setNama("klonengan ifnu); // yang sama
}
public void setId(Long aId){ //local variable aId
this.id = aId;
}
public Long getId(){
return this.id;
}
public void setNama(Long aNama){ //local variable aNama
this.nama = aNama;
}
public String getNama(){
return this.nama;
}
}

Local variabel adalah variabel yang berada di dalam method, variabel ini hanya hidup selama
method dieksekusi, begitu program keluar dari method maka variabel ini akan diserahkan ke
garbage collector untuk dibersihkan. Variabel di dalam parameter method adalah salah satu
contoh local variabel. Reference variabel adalah variabel yang menunjuk ke object, seperti ifnu
dan klonenganIfnu, keduanya juga merupakan local variabel karena di diklarasikan di dalam
method main. id dan nama adalah instance variabel, keduanya dideklarasikan di dalam class
Person.
Reference variabel ifnu dan klonenganIfnu menunjuk ke object yang sama, maka ketika
klonenganIfnu mengganti nilai nama maka object yang dipegang oleh variabel ifnu juga akan ikut
terganti namanya. Analoginya misalnya begini, reference variabel itu adalah alamat, sedangkan
object adalah sebuah rumah. Misalnya sebuah rumah mempunyai dua alamat, yang satu alamat
menggunakan nama jalan satu lagi alamat menggunakan PO BOX. Kita bayangkan misalnya pak
pos mengirim barang ke alamat PO BOX ataupun alamat jalan, maka barang akan sampai ke
rumah yang sama. Begitu juga dengan instance variable ifnu dan klonganenganIfnu, jika satu
dirubah maka yang lain ikut berubah karena keduanya menunjuk ke alamat object yang sama.
Konsep reference ini penting untuk selalu diingat ketika bekerja dengan object, banyak sekali
masalah yang bisa dipecahkan hanya dengan menggunakan pemahaman tentang yang baik
tentang reference ini.
Berikut ini adalah gambar yang memvisualisasikan keadaan heap setelah kode di atas selesai
dieksekusi :

Setelah mengetahui bagaimana reference variabel bekerja, kita akan membahas bagaimana
perilaku reference variabel ini jika digunakan sebagai parameter dalam method.

Passing by value dan Passing by reference
Method dalam java bisa mempunyai parameter, setiap parameter pada dasarnya adalah local
variabel, tipe dari variabel itu bisa berupa reference (object) atau bisa juga berupa tipe data
bawaan dari java. Kedua jenis variabel ini akan diperlakukan berbeda oleh java, jika kita
menggunakan tipe variabel dengan tipe data bawaan java maka yang terjadi adalah passing by
value, artinya data yang dilempar dari kode pemanggil ke dalam method, yang dibawa adalah
nilai dari variabelnya, jika nilai variabel di dalam method berubah maka nilai variabel di
pemanggil tidak ikut berubah. Mari kita lihat contoh kodenya :

public class PassByValue{
public static void ubahNama(String nama){
nama = "dian";
System.out.println("nama baru di dalam method: " + nama);
}
public static void main(String[] arg){
String nama = "ifnu";
System.out.println("nama lama dari method main: " + nama);
ubahNama(nama);
System.out.println("nama lama dari method main: " + nama);
}
}


Terdapat variabel nama di dalam method main yang dilempar ke method ubahNama, karena
tipe datanya String (tipe data bawaan dari java), maka ketika variabel nama diubah di dalam
method ubahNama maka tidak akan mempengaruhi nilai variabel nama di dalam method main.
Kalau kita compile dan jalankan kodenya akan keluar output seperti di bawah ini :

$ javac PassByValue.java
$ java PassByValue
nama lama dari method main: ifnu
nama baru di dalam method: dian
nama lama dari method main: ifnu

Variabel dengan tipe reference seperti : object atau tipe data array, jika digunakan sebagai
parameter dalam method maka akan terjadi prosess passing by reference. Artinya data yang
dilempar dari kode pemanggil ke dalam method, yang dibawa adalah reference (alamat) dari variabel di dalam method berubah maka nilai variabel di pemanggil juga ikut
berubah. Mari kita modifkasi sedikit kode di atas dengan mengganti tipe data nama dari String
menjadi array String.

public class PassByReference{
public static void ubahNama(String[] nama){
nama[0] = "dian";
System.out.println("nama baru di dalam method: " + nama[0]);
}
public static void main(String[] arg){
String[] nama = new String[1];
nama[0] = "ifnu";
System.out.println("nilai lama dari method main: " + nama[0]);
ubahNama(nama);
System.out.println("nilai lama dari method main: " + nama[0]);
}
}

Setelah kita ganti variabel nama dari tipe data String menjadi String[], maka method ubahNama
akan menggunakan pass by reference, sehingga kalau nilai di dalam variabel nama diubah
didalam method ubahNama maka variabel yang sama di dalam method main juga ikut berubah.
Eksekusi kode di atas akan menghasilkan output seperti di bawah ini :

$ javac PassByReference.java
$ java PassByReference

nilai lama dari method main: ifnu
nama baru di dalam method: dian
nilai lama dari method main: dian
$

Kita sudah membahas apa itu pass by value dan apa itu pass by reference, di dalam penjelasan di
atas disebutkan tentang “tipe data bawaan java”, nah tipe data jenis ini ada dua, tipe data primitif
dan wrapper class. Kita akan bahas kedua jenis tipe data ini di bagian selanjutnya.

Add comment


Security code
Refresh

   

Indeks  

   
© ALLROUNDER