Konsep Variabel Pada Java

Setelah dihindari selama 2 tahun, akhirnya saya harus belajar Java juga, tapi sepertinya tidak akan ada masalah, in fact, it’s exciting. :) Tapi, ada beberapa masalah saat harus konversi paradigma dan syntax dari C/C++ (bahasa favorit) ke Java. Beberapa masalah itu disebabkan karena hilangnya fasilitas pointer pada Java (terbiasa make pointer di C/C++) dan bedanya paradigma pemrograman pada Java dan C/C++. So let’s begin.. :)

Java merupakan bahasa pemrograman dengan paradigma pemrograman berorientasi-objek atau singkatnya OOP (konsep OOP tidak akan dibahas di postingan ini, silahkan baca Wikipedia :)  ). Berbeda dengan Pascal, C atau C++, java tidak memiliki tipe data Pointer. Mengapa? Well, konsep pointer dianggap menyusahkan sehingga konsep pointer dihilangkan. But, to me that what makes Java a little hard because I used to use pointer in parameter passing.

Dalam C/C++ parameter passing atau gimana ngelewatin sebuah variabel dalam satu fungsi atau prosedur dapat dilakukan dengan dua cara yaitu dengan nilai a.k.a by value dan dengan alamat a.k.a by reference. Apa perbedaan keduanya? Hmm,, ini juga gk akan dibahas dalam tulisan ini, kalau ingin lebih jelas tentang parameter passing di C/C++ silahkan download tulisan tentang pointer ini. Yang pasti, ketiadaan pointer di Java membuat parameter passing di Java “agak” beda. Pertanyaannya adalah, apakah parameter passing di Java dilakukan by value atau by reference?

Awalnya, saya berpikir object di Java menerapkan konsep “Passing by Reference” dan yang hal lain selain object menerapkan konsep “Passing by Value”. Code berikut ini menjadi dasar dari pernyataan sebelumnya!

public class parameterPassing{

String kata; int angka;

public void ubahParameter(String message){

this.kata = “Ini Kata Baru”;
this.angka++;
message = “Ini adalah Kalimat Baru”;
System.out.println(“Saat Pemanggilan Prosedur Objek Var ialah : “+this.kata+” , “+this.angka+”. Dan nilai variabel kalimat ialah : “+message);

}

public static void main(String arg[]){

parameterPassing var = new parameterPassing(); //Membuat object baru
var.kata = “Ini adalah Kata”;
var.angka = 5;
String kalimat = “Ini adalah Kalimat”; //deklarasi variabel baru
System.out.println(“Sebelum Pemanggilan Prosedur Objek Var ialah : “+var.kata+” , “+var.angka+”. Dan nilai variabel kalimat ialah : “+kalimat);
var.ubahParameter(kalimat);
System.out.println(“Setelah Pemanggilan Prosedur Objek Var ialah : “+var.kata+” , “+var.angka+”. Dan nilai variabel kalimat ialah : “+kalimat);

}

}

Code diatas jika dijalankan akan menghasilkan output berikut ini :

Sebelum Pemanggilan Prosedur Objek Var ialah : Ini adalah Kata , 5. Dan nilai variabel kalimat ialah : Ini adalah Kalimat
Saat Pemanggilan Prosedur Objek Var ialah : Ini Kata Baru , 6. Dan nilai variabel kalimat ialah : Ini adalah Kalimat Baru
Setelah Pemanggilan Prosedur Objek Var ialah : Ini Kata Baru , 6. Dan nilai variabel kalimat ialah : Ini adalah Kalimat

Dengan memperhatikan code diatas, jelas bisa disimpulkan bahwa “objek di java menerapkan konsep passing by parameter, sementara variabel lain selain objek menerapkan konsep passing by value”. Namun, ternyata tidak semudah itu menganalisa parameter passing pada Java. Mengapa? Perhatikan code berikut ini!

public class parameterPassing{

String kata; int angka;

public void ubahParameter(parameterPassing var2){

this.kata = “Ini Kata Ketiga”;
this.angka++;
var2.kata = “Ini kata Keempat”;
var2.angka++;
System.out.println(“Saat Pemanggilan Prosedur ubahParameter”);
System.out.println(“Nilai object var ialah : “+this.kata+” , “+this.angka+”. Dan nilai object var2 adalah : “+var2.kata+” , “+var2.angka);

}

public static void main(String arg[]){

parameterPassing var = new parameterPassing(); //Membuat object pertama
parameterPassing var2 = new parameterPassing(); //Membuat object kedua
var.kata = “Ini kata Pertama”;
var.angka = 1;
var2.kata = “Ini kata kedua”;
var2.angka = 2;
System.out.println(“Sebelum Pemanggilan Prosedur ubahParameter”);
System.out.println(“Nilai object var ialah : “+var.kata+” , “+var.angka+”. Dan nilai object var2 adalah : “+var2.kata+” , “+var2.angka);
var.ubahParameter(var2);
System.out.println(“Setelah Pemanggilan Prosedur ubahParameter”);
System.out.println(“Nilai object var ialah : “+var.kata+” , “+var.angka+”. Dan nilai object var2 adalah : “+var2.kata+” , “+var2.angka);

}

}

Code diatas akan menghasilkan output :

Sebelum Pemanggilan Prosedur ubahParameter
Nilai object var ialah : Ini kata Pertama , 1. Dan nilai object var2 adalah : Ini kata kedua , 2
Saat Pemanggilan Prosedur ubahParameter
Nilai object var ialah : Ini Kata Ketiga , 2. Dan nilai object var2 adalah : Ini kata Keempat , 3
Setelah Pemanggilan Prosedur ubahParameter
Nilai object var ialah : Ini Kata Ketiga , 2. Dan nilai object var2 adalah : Ini kata Keempat , 3

Var dan Var2 adalah object, namun saat dilakukan parameter passing untuk kedua object tersebut didapatkan hasil yang berbeda. Nilai dari objek var berubah setelah pemanggilan prosedur ubahParameter. Namun, nilai dari object var2 tidak berubah setelah pemanggilan prosedur ubahParameter (meskipun saat pemanggilan dilakukan perubahan pada nilai var2). So, what’s really happening? Kenapa objek pertama berubah sementara objek kedua tidak berubah, padahal keduanya digunakan sebagai parameter passing pada prosedur ubahParameter? To answer this, I need to say three cruel fact about Java, which is…

  1. Java hanya menerapkan sistem passing by value, sehingga tidak ada istilah passing by reference pada Java
  2. Pada Java object tidak pernah di Passing
  3. Nilai dari variabel di Java selalu merupakan primitif atau alamat, bukan Object

Hmm, kinda broke my heart. Hehe.. :D . So, what it really meant? Poin pertama jelas sekali bahwa hanya ada passing by value di Java dan tidak ada passing by reference ini menjelaskan apa yang terjadi pada variabel kalimat pada code pertama dan object var2 pada code kedua. Namun, ini tidak menjelaskan apa yang terjadi pada objek var pada code pertama dan code kedua, sebab object var “terlihat seperti” passing by reference. Well, then we go for the second point bahwa Object pada java tidak pernah di passing. What it really mean? Kalau tidak pernah di passing lalu bagaimana operasi-operasi terhadap object bisa dilakukan? Jawabannya adalah pada object yang diambil ialah reference atau alamat dari nilainya atau dengan kata lain pada object dilakukan passing by reference. Hmm, this is sound dangerous, it’s like saying that the first point is not true. Tapi, dengan memperhatikan poin ke tiga, maksud dari poin kedua akan lebih di mengerti.

Poin ketiga menyatakan “nilai dari variabel di Java selalu merupakan primitif atau alamat, bukan object” yang berarti ketika dilakukan deklarasi sebuah object, yang disimpan pada object tersebut ialah alamat dari nilainya bukan nilai itu sendiri. Hal ini akan dijelaskan dengan kode berikut ini:

public class parameterPassing{

int angka;

public static void main(String arg[]){

parameterPassing var = new parameterPassing(); //Membuat object pertama
var.angka = 5;
parameterPassing var2 = new parameterPassing(); //Membuat object kedua
var2 = var;
var2.angka = 10;
System.out.println(“Nilai akhir dari object var dan var2 ialah : “+var.angka+” dan “+var2.angka);

}

}

Ketika code ini dijalankan akan menghasilkan output berikut ini:

Nilai akhir dari object var dan var2 ialah : 10 dan 10

Nah, itulah yang dimaksud dengan “apa yang disimpan sebuah objek adalah alamat dari nilainya, bukan nilainya itu sendiri”. Maka ketika ada object lain yang di assign dengan object tersebut, yang terjadi ialah alamat dari nilai object pertama “dicopy” ke object kedua. Sehingga perubahan terhadap object kedua akan mengakibatkan perubahan pada object pertama. Untuk lebih memahami ini cukup bayangkan analogi balon dan talinya. Balon merupakan nilai dan tali tersebut merupakan object yang memiliki nilai tersebut. Ketika ada object baru yang di assign dengan object lain, yang terjadi ialah, adanya tambahan tali yang menunjuk ke balon tersebut. Sehingga apa yang dilakukan pada tali di object kedua pada balon akan terjadi juga pada tali di object pertama pada balon.

Itulah yang terjadi pada saat assign, tapi, apa yang terjadi pada parameter passing tidak seperti itu. Yang dikirim bukanlah alamat (isi object/variabel tersebut) melainkan nilai dari object tersebut “yang digandakan”. Sehingga pada parameter passing, apa yang terjadi pada parameter formal tidak akan mempengaruhi parameter aktual. :D

That’s all for today… and I hope you’ll find it useful…. :D

Keterangan : Code dicompile dengan menggunakan JCreator Pro versi 4.5
Environment : JDK 6.23

About this entry