Java - Passing by Value atau Passing by Reference ?
Pendahuluan
Judul artikel diatas adalah pertanyaan klasik mengenai bagaimana sebuah variable dipassing melalui sebuah fungsi/method di Java.
contoh :
untuk variable tipe primitif sbb:
// setting variable primitif
int age = 25;
// panggil fungsi
printMyAge(age);
// fungsi printMyAge
void printMyAge(int age) {
System.out.println(age + " Tahun");
}
atau variable tipe object sbb:
// setting variable Objek
Person person = new Person();
person.setAge(25);
// panggil fungsi
printPersonAge(person);
// fungsi printPersonAge
void printPersonAge(Person person) {
System.out.println(person.getAge() + " Tahun");
}
- Code yang pertama, kita passing tipe int ke method printMyAge(int age)
- Code yang kedua, kita passing tipe object Person ke method printPersonAge(Person person)
Nah ketika passing tipe variable diatas, maka kita perlu tahu apakah :
- Code yang pertama, int age yang kita passing apakah bisa kita ubah didalam method dan akan mempunyai efek diluar method tersebut ?
- Code yang kedua, tipe object Person yang kita passing apakah bisa kita ubah juga nilai attributenya dan mempunyai efek setelah keluar dari method tersebut ?
Kenapa ini penting ?
Memahamai passing variable apakah menggunakan passing by reference atau passing by value sangat penting, untuk :
- Memastikan apakah code kita sudah tepat dalam menangani passing variable ke dalam sebuah fungsi/method.
- Membuat code kita lebih efektif, tanpa melakukan pengulangan code atau duplikasi code yang tidak perlu.
Kembali lagi pertanyaannya, jadi Passing by Value atau Passing by Reference ?
Jawabannya bisa saja bermacam-macam :
- hmm, sepertinya passing by reference, karena Java kan berbasiskan object, jadi yang dipassing adalah reference/alamat memory object nya.
- hmm, sepertinya kalau tipe variable adalah tipe primitif seperti int, long, char, dll, maka akan dipassing by value, sementara kalau object akan passing by reference.
- hmm, sepertinya passing by value, karena yang dipassing adalah value, baik value dari variable primitif, atau value dari object nya.
Hmmm, jadi mana yang benar.
Ok, Jeng..jeng..jeng..
Yang benar, secara konsep kita menyebutnya Passing by Value
Loh kok by value, gimana dengan passing by reference nya Object di Java ??
Ok..ok, sabaar..
Coba kita bahas pelan-pelan..
Passing variable melalui method/fungsi
Yang penting diingat adalah :
Setiap kali ada passing variable melalui method di Java akan membuat sebuah item tambahan di stack memory, yang merupakan copy-an dari variable awal yang dipassing.
sehingga setiap kali ada passing parameter melalui method di java, maka akan ada 2 item di stack, yaitu :
- item variable di program awal.
- item variable baru yang merupakan copy-an dari variable diatas.
Agar bisa dicopy, maka yang perlu dipassing diwaktu passing variable/parameter, adalah value nya.
Coba kita lihat code ini :
// setting variable primitif
int age = 25;
// panggil fungsi
printMyAge(age);
// fungsi printMyAge
void printMyAge(int age) {
System.out.println(age + " Tahun");
}
Passing variable int age ke method printMyAge.
Yang dilakukan adalah :
- int age = 25 , sebuah item di stack akan ditambahkan berisikan nilai integer = 25
- printMyAge(age) , variable age akan dibuat copy-an nya dan item tersebut ditambahkan ke stack lagi.
- sehingga akan ada 2 item di stack.
- kedua-duanya mempunyai nilai yang sama, dan tidak saling mengacu satu sama lain.
- nilai keduanya sama-sama integer = 25, yang item terakhir merupakan copy-an dari item yang awal.
- item kedua bisa didapatkan, karena waktu memanggil fungsi, yang dipassing adalah value/nilai integer yaitu integer=25
Coba kita lihat code terkait dengan object :
// setting variable Objek
Person person = new Person();
person.setAge(25);
// panggil fungsi
printPersonAge(person);
// fungsi printPersonAge
void printPersonAge(Person person) {
System.out.println(person.getAge() + " Tahun");
}
Passing variable Person person ke method printPersonAge.
Perlu diingat, di Java, semua object akan ditaruh di Heap memory, dengan referensi sebuah item dari stack.
Yang dilakukan adalah :
- Person person = new Person();, sebuah alokasi memori di Heap memory dibuat untuk objek Person, dan sebuah item di stack akan ditambahkan berisikan alamat memory di Heap yang barusan dialokasi untuk Person. Hanya alamat memori.
- printPersonAge(person); , variable person akan dibuat copy-an nya dari alamat memori yang sebelumnya telah ada dan ditambahkan ke stack lagi.
- sehingga akan ada 2 item di stack.
- kedua-duanya mempunyai nilai yang sama, yaitu alamat memori dari objek Person di Heap, dan tidak saling mengacu satu sama lain.
- nilai keduanya sama-sama alamat memori, dan diistilahkan mempunyai referensi ke object yang sama
- item kedua bisa didapatkan, karena waktu memanggil fungsi, yang dipassing adalah value/nilai alamat memory dari item stack yang pertama.