Passing by value and Passing by reference

Beberapa waktu lalu, di milis dotnet ada pertanyaan dari anggota mengenai passing by value dan reference. Simple memang, tapi penjelasannya memang harusnya tidak sesimple yang dipikirkan oleh orang awam ( termasuk saya 😛 ). Dari sekian banyak jawaban, akhirnya mas Norman memberikan jawaban yang lengkap ( apa dan mengapa ). Agar rekan – rekan yang lain yang mungkin tidak ikut milis dapat juga mengetahuinya, berikut petikan jawaban dari mas Norman. ( contoh dalam C# )

Main()
{
A a = new A();  // Main-baris 1
pass(a) // Main-baris 2
}

void pass(A x)
{
A b = new A(); // Pass-baris 1
x = b; // Pass-baris 2
}


Penjelasan :

Main-baris 1:

Di suatu address di Heap, let say Heap[1], di buatkan sebuah object dgn type
A.

Kemudian di Stack, let say Stack[1], dibuatkan sebuah local variable, yaitu
reference ke object di Heap[1] tadi, dan diberi nama “a”.

So far in memory,

a” di Stack[1] -> refer to object di Heap[1]

Main-baris 2:

Local variable “a” di PASS BY VALUE ke method “Pass”. Artinya, dibuatkanlah
sebuah copy object reference baru di Stack, namanya “x” (sesuai nama argumen
di method “Pass”), let say di Stack[2]. “x” ini point ke Heap[1] juga karena
dia benar2 copy dari “a”. So far in memory,

“a” di Stack[1] -> refer to object di Heap[1]
“x” di Stack[2] -> refer to object di Heap[1]

Pass-baris 1:

Di suatu address di Heap, let say Heap[2], dibuatkan sebuah object dgn type
A lagi. Kemudian di Stack, let say Stack[3], dibuatkan sebuah local variable
yaitu reference ke object di Heap[2] tadi, dan diberi nama “b”. So far in memory,

“a” di Stack[1] -> refer to object di Heap[1]
“x” di Stack[2] -> refer to object di Heap[1]
“b” di Stack[3] -> refer to object di Heap[2]

Pass-baris 2:

“x” yg ada di Stack[2], awalnya refer ke object di Heap[1]. Karena ada
statement “x=b;”, artinya Stack[2] atau “x” skrg isinya adalah reference ke
Heap[2] juga, yg tdnya di refer oleh “b”. Jadi, skrg in memory:

“a” di Stack[1] -> refer to object di Heap[1]
“x” di Stack[2] -> Skrg refer ke object di Heap[2] karena statement “x=b;”
“b” di Stack[3] -> refer to object di Heap[2]

Finally:

Kemudian method “Pass” selesai, semua local variable dlm method tsb Out of
Scope (“x” di Stack[2] dan “b” di Stack[3]”), akibatnya, object di Heap[2]
jd gak ada yg refer, maka object di Heap[2] ready for Garbage Colletion. Jd, in memory:

“a” di Stack[1] -> refer to object di Heap[1]
“x” di Stack[2] -> Out of Scope, destroyed
“b” di Stack[3] -> Out of Scope, destroyed

Object di Heap[1] -> baik2 saja di Heap[1]

Object di Heap[2] -> Gak ada lg yg refer, ready for Garbage Collection

So, local variable “a” yg ada di Main” tetap nongkrong di Stack[1], dan
tetap point ke object di Heap[1]. Gak ada yg berubah.

Ceritanya akan beda, kalau kamu PASS BY REFERENCE. Utk do ini di C#, di
method-nya hrs kamu beri keyword “ref”, demikian juga saat panggil
methodnya, kamu harus specify “ref” juga. Penjelasan as follow, note the
keyword “ref”

Main()
{
A a = new A();  // Main-Ref-baris 1
pass(ref a) // Main-Ref-baris 2
}

void pass(ref A x)
{
A b = new A(); // Pass-Ref-baris 1
x = b; // Pass-Ref-baris 2
}

Main-Ref-baris 1:

Di suatu address di Heap, let say Heap[1], di buatkan sebuah object dgn type
A.

Kemudian di Stack, let say Stack[1], dibuatkan sebuah local variable, yaitu
reference ke object di Heap[1] tadi, dan diberi nama “a”.

So far in memory,

“a” di Stack[1] -> refer to object di Heap[1]

Main-Ref-baris 2:

Local variable “a” di PASS BY REFERENCE ke method “Pass”. Artinya, local
variable “a” yang merupakan object reference yg ada di Stack[1] itulah yg di
lempar ke dalam method “Pass”. Tidak dibuatkan copy-nya lagi di Stack untuk
bikin object reference baru. Argumen variable “x” tidak pernah benar-benar
dibuatkan. Tidak ada variable baru di Stack. Object reference “a” yang di
pass.

So far in memory, still

“a” di Stack[1] -> refer to object di Heap[1]

Dgn kata lain, “x” never exists. “a” atau Stack[1]-lah satu2nya yg ada.
Tidak ada copy baru di Stack. In short, “x” dan “a” ya object reference yang
sama yg ada di Stack[1].

Pass-Ref-baris 1:

Di suatu address di Heap, let say Heap[2], dibuatkan sebuah object dgn type
A lagi. Kemudian di Stack, let say Stack[2], dibuatkan sebuah local variable
yaitu reference ke object di Heap[2] tadi, dan diberi nama “b”.

So far in memory,

“a” di Stack[1] -> refer to object di Heap[1]
“b” di Stack[2] -> refer to object di Heap[2]

Pass-Ref-baris 2:

“a” yg ada di Stack[1], awalnya refer ke object di Heap[1]. Karena ada
statement “x=b;”, artinya Stack[1] atau “a” skrg isinya adalah reference ke
Heap[2] juga, yg tdnya di refer oleh “b”.

Jadi, skrg in memory:

“a” di Stack[1] -> refer to object di Heap[2], karena “x=b”, di mana “x” actually adalah object reference di Stack[1]

 “b” di Stack[2] -> refer to object di Heap[2]

Finally:

Kemudian method “pass” selesai. Object reference “b” yg ada di Stack[2] jd
Out of Scope dan di destroy.

Kondisi akhir Memory:

“a” di Stack[1] -> Refer to object di Heap[2], sedangkan karena gak ada lg yg refer ke dia, maka object di Heap[1] jd waiting for garbage Collection.

“b” di Stack[2] -> Out of Scoped, Destroyed.

Jd, kondisi akhir “a” adalah object yg nongkrong di Heap[2]. Dgn kata lain,
“a” berubah. Refer to different object now.

Moga aja berguna bagi rekan-rekan yang mulai belajar programming. Seperti yang mas Norman tuliskan dalam milis, ini adalah pertanyaan yang biasa ditanyakan kepada seorang programmer yang akan di rekrut sebagai pertanyaan fundamental ( basic knowledge yang harus di mengerti oleh seorang programmer )

Advertisements

About Ishak
Cloud Application Consultant | SharePoint Consultant | Badminton lover | Food hunter

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: