Wednesday, June 20, 2007

Boxing dan Unboxing

Seperti yang sudah dijelaskan pada postingan sebelumnya, terdapat dua jenis data type: Value Types dan Reference Types. Selanjutnya terdapat mekanisme untuk melakukan konversi dari value type ke dalam reference type yang dinamakan dengan boxing. Sementara itu konversi dari reference type kembali ke value type dinamakan unboxing.

Boxing
Berikut ini adalah contoh dari operasi boxing:

int i = 23;
object 0 = i; // boxing secara implisit, secara eksplisit -> object o = (object)i;


Hasil dari operasi boxing diatas untuk statement pada baris kedua adalah terciptanya sebuah object o pada stack, yang menunjuk suatu nilai yang bertipe int pada heap. Nilai yang ditunjuk ini merupakan salinan dari nilai yang di-assign ke variabel i. Gambar berikut ini memberikan ilustrasi untuk variabel i dan o pada memori:


Sesuai dengan gambar diatas, jika isi variabel i berubah, nilai variabel o tidak akan berubah karena variabel o telah menyimpan salinan dari nilai variabel i.

UnBoxing
Pada proses unboxing, nilai yang ada pada heap disalin kembali ke stack. Sebelum proses penyalinan ini, dilakukan pemeriksaan terlebih dahulu, apakah instance dari object yang akan di-unboxing berupakan versi boxed dari value type yang diassign untuk proses unboxing tersebut. Berikut ini adalah contoh dari proses boxing dan unboxing:

int i = 23;
object 0 = i; // boxing secara implisit, secara eksplisit -> object o = (object)i;
int y = o; // unboxing secara implisit, secara eksplisit-> int y = (int)


Berikut ini adalah ilustrasi dari proses diatas pada memori:

Proses unboxing sedikit berbeda dengan proses boxing. Agar proses unboxing ke suatu value type berhasil dilakukan ketika run-time, maka argumen yang digunakan untuk proses unboxing harus berupa instance dari object yang sebelumnya dibuat melalui proses boxing pada value type tersebut. Jika proses unboxing dilakukan pada variabel yang berisi null atau berisi instance dari object yang tidak sama dengan value type hasil unboxing, maka ketika run-time akan muncul InvalidCastException.

Berikut ini adalah contoh lain untuk proses unboxing:

int i = 23;
object o = i;
double y = (double)o;


Potongan kode diatas dapat di-compile, namun pada saat run-time akan muncul exception :
InvalidCastException karena variabel i di-boxing sebagai variabel bertipe integer sehingga harus di-unboxing juga kedalam variabel bertipe integer. Tentu saja setelah dilakukan proses unboxing ke dalam variabel tipe integer, baru dapat dilakukan konversi ke variabel bertipe double seperti berikut ini:

int i = 23;
object o = i;
double y = (double)(int)o; // Melakukan unboxing lalu melakukan casting variabel ke
// tipe double

1 comments:

Irpan said...

Kalo di Java istilahnya apa ya, ada juga kan, cuma ngga familiar aja sama istilah boxing dan unboxing :)