Blogging for sharing, sekedar berbagi ilmu dan pengalaman

[OOP] Pass by Reference di Java dan C#

March 26, 2014 Posted by Ahmad Saifuddin Azhar No comments
 Mungkin bagi Anda seorang programmer tentu sudah sangat familiar dengan nama Java dan C#. Ya.. Keduanya adalah bahasa pemrograman berbasis OOP yang menurut saya sangat mirip dalam hal penggunaannya. Kedua bahasa ini merupakan bahasa yang cukup populer dan cukup bersaing jika dibanding bahasa pemrograman lainnya.

Pada artikel kali ini saya akan membahas sedikit contoh pembuatan method dengan parameter pass by reference di java dan C#. Pass by reference sendiri merupakan suatu method yang melewatkan alamat dari suatu variabel, bukan isi dari variabel. Untuk lebih jelasnya silahkan simak contoh kasus sederhana di bawah :

Contoh kasus Pass by reference :
Misal saya memiliki 2 buah variabel integer, misal : 
int a = 5, b = 10;
Kasusnya saya akan menukar nilai kedua variabel ini melalui suatu method 
swap(int a, int b)
Nah.. bagaimana cara membuatnya?? Tidak bisa menggunakan return value bukan? Satu-satunya cara adalah dengan menggunakan pass by reference.

Nah disini saya akan membahas cara membuat method / fungsi swap dalam beberapa bahasa pemrograman, khususnya java dan C#. Sebelum melangkah ke java dan C# mari kita tengok sedikit fungsi swap pada bahasa C++.

Fungsi swap pada C++
Pada C++ pass by reference dapat kita lakukan dengan memberikan parameter berupa pointer dengan tanda * dan untuk melewatkan variabel gunakan tanda & yang menyatakan alamat atau reference dari suatu variabel.
 
void swap(int* a, int* b){
  int* temp = a;
  a = b;
  b = temp;
}

int main(){
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf("%d %d\n"), *a, *b); //print : 10 5
}



Fungsi swap pada C#
Pada C# fungsi swap menjadi jauh lebih mudah dibanding C++ karena memang dasarnya C# adalah bahasa pemrograman yang cukup modern. Untuk membuat parameter pass by reference cukup gunakan kata kunci ref.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1{
    class Program{
        static void Main(string[] args){
            int x=5, y=10;
            swap(x, y);
            
            Console.Write(x); //print : 10
            Console.Write(y); //print : 5
        }

        static void swap(ref int a, ref int b){
            int temp = a;
            a = b;
            b = temp;
        }
    }
}
 
Fungsi swap pada Java
Pada dasarnya java sama sekali tidak menggunakan pass by reference dan tidak dikenal istilah pass by reference pada method java. Namun perlu diingat tentang teori dasar java bahwa secara implisit untuk menghemat memori, java akan me-reference alamat yang sama dari satu obyek (instance) yang sama meskipun ditunjuk oleh variabel yang berbeda. Mungkin bingung yah deskripsi saya? saya juga bingung mau nulis kayak gimana :p Ok langsung aja ke contoh :
public class MainClass {
    public static void main(String[] args) {
        Mobil a = new Mobil(100);
        Mobil b = a;
        System.out.println(b); //print : 100
        a.setKecepatan(50);
        System.out.println(b); //print 50       
    }  

    private static class Mobil{
        private int kecepatan = 100;

        public Mobil(int kecepatan) {
            this.kecepatan = kecepatan;
        }

        public void setKecepatan(int kecepatan) {
            this.kecepatan = kecepatan;
        }      

        @Override
        public String toString() {
            return "Mobil kecepatan : " + this.kecepatan;
        }      
    }
}
 
 
Output :
run:
Mobil kecepatan : 100
Mobil kecepatan : 50
BUILD SUCCESSFUL (total time: 0 seconds) 
 
Kita lihat padascript di atas, kita sama sekali merubah value dari variabel b, yang kita rubah hanya variabel a dengan script a.setKecepatan(50). Namun yang terjadi b juga ikut berubah, terbukti ketika di print nilainya menjadi 50, sama seperti a. Hal ini menunjukkan bahwa a dan b menunjuk pada alamat memori yang sama, sehingga jika salah satu di rubah maka akan berdampak pada yang lainnya. Penunjukan alamat memori yang sama ada dalam statement Mobil b = a; Sifat menunjuk alamat memori yang sama inilah yang bisa kita manfaatkan untuk pass by reference di java. Kita juga dapat memanfaatkan type data Generic untuk membuat obyek reference yang fleksibel. Langsung saja contoh pass by reference di java :

Pertama buat dulu Ref.java
 
public class Ref<T> {
    public T value;

    public Ref(T value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return this.value.toString(); 
    } 
}

Kamudian ini fungsi swapnya ada di PassByReferenceClass.java

public class PassByReferenceClass {
    public static void main(String[] args) {
        Ref<Integer> x = new Ref<>(5);
        Ref<Integer> y = new Ref<>(10);
        
        swap(x, y);
        
        System.out.println(x + " " + y);
    }  
    
    public static void swap(Ref a, Ref b){
        Object temp = a.value;
        a.value = b.value;
        b.value = temp;
    }
}




Dan outputnya adalah sbb :
 
run:
10 5
BUILD SUCCESSFUL (total time: 0 seconds)

Ok... Mungkin sekian artikel saya ini, kurang lebihnya saya mohon maaf. Tetap semangat dan terus berkarya ^^