Belajar C #13: Mengenal Tipe Data Union di C
Setelah belajar tentang Struct, berikutnya kita akan berkenalan dengan tipe data Union.
Apa itu union?
Mengapa kita butuh union?
..dan gimana cara pakai union?
Mari kita pelajari!
Apa itu Union?
Union adalah tipe data yang berisi sekumpulan variabel yang dibungkus jadi satu dan memiliki alamat memori yang sama.
Tipe data ini mulai ditambahkan pada versi C11
. 1
Mengapa kita membutuhkan union?
Untuk menjawab ini, kita akan pakai studi kasus..
Misalnya kita akan membuat game, lalu ingin menyimpan data senjata yang dimiliki pemain.
Anggap saja pemain punya dua senjata, yakni: pistol dan pisau.
Maka kita bisa membuat struct seperti ini:
typedef struct {
char *nama;
int jumlah_peluru;
int ketajaman;
} Senjata;
Perhatikan variabel jumlah_peluru
dan ketajaman
. Variabel ini dibutuhkan masing-masing jenis senjata.
Pistol membutuhkan jumlah_peluru
dan pisau membutuhkan ketajaman
.
Jika pemain cuma punya pistol, berarti variabel ketajaman
akan sia-sia. Begitu sebaliknya.
Nah biar tidak sia-sia, kita harus menyimpan variabel jumlah_peluru
dan ketajaman
dalam satu alamat memori.
Ini bisa kita lakukan dengan union seperti ini:
typedef struct {
char *nama;
union {
int jumlah_peluru;
int ketajaman;
}
} Senjata;
Dengan begini, variabel jumlah_peluru
dan ketajaman
akan menggunakan satu alamat
memori yang sama. Ini tentunya akan lebih efisien.
Jadi mengapa kita membutuhkan union?
Union kita butuhkan saat kita ingin menggunakan satu alamat memori untuk dua atau lebih variabel.
Cara Membuat Union
Union bisa kita buat dengan kata kunci union
kemudian diikuti dengan nama union-nya.
Setelah itu kita menggunakan kurung kurawal untuk mendefinisikan member dan tipe datanya.
Contoh:
union Product {
char *name;
unsigned int price;
unsigned int stock;
float weight;
};
Lalu cara menggunakannya:
union Product p;
Jika menggunakan typedef
, kita tidak perlu menulis union setiap kali menggunakannya.
Contoh:
// mendefinisikan union
typedef union {
char *name;
int price;
} Product;
// menggunakan union
Product p;
Selain itu, Union juga bisa dibuat tanpa nama.
Contoh:
union
{
float x;
float y;
};
Union yang tanpa nama ini bisa juga kita simpan di dalam struct.
Contoh:
struct Buku
{
char *title ;
bool is_digital;
union
{
char *format;
float weight;
};
};
Di dalam struct Buku
terdapat union
tanpa nama yang berisi variabel format
dan weight
. Kedua variabel ini, akan menggunakan satu alamat memori yang sama dan bisa langsung diakses dari struct Buku
.
Contoh:
// membuat variabel struct
Buku belajar_c;
// mengakses union di dalam struct
belajar_c.format = "PDF";
Biar lebih paham, mari kita coba latihan.
Latihan: Menggunakan Union
Setelah tau cara mendefinisikan atau membuat union, kita saatnya kita coba menggunakannya.
Buatlah program baru dengan nama contoh_union.c
, kemudian isi kodenya seperti ini:
#include <stdio.h>
enum notif_type {EMAIL, SMS};
typedef struct {
char *title;
char *message;
enum notif_type type;
union {
char *phone_number;
char *email_address;
}
} Notification;
int main(){
Notification sms;
Notification email;
sms.type = SMS;
sms.title = "Greeting";
sms.message = "Halo selamat datang";
sms.phone_number = "081234567890";
email.type = EMAIL;
email.title = "Welcome";
email.message = "Selamat datang di aplikasi";
email.email_address = "[email protected]";
printf("## 🔔 NOTIFICATION SMS ##\n");
printf("to: %s\n", sms.phone_number);
printf("message: %s\n", sms.message);
printf("## ✉ NOTIFICATION EMAIL ##\n");
printf("subject: %s\n", email.title);
printf("to: %s\n", email.email_address);
printf("message: %s\n", email.message);
return 0;
}
Setelah itu, coba compile dan jalankan.
Maka hasilnya:
Pada program ini, kita membuat sistem notifikasi dengan dua jenis notifikasi yang berbeda. Ada notifikasi berbentuk email dan sms.
Berkat union kita bisa menentukan tujuan pengiriman notifikasi dengan jenis yang berbeda, yakni bisa phone_number
dan email_address
.
Perbedaan Union dengan Struct
Union sebenarnya sama seperti tipe data Struct. Namun, berbeda dalam metode alokasi memorinya.
Struct mengalokasikan memori untuk setiap membernya pada alamat memori yang berbeda-beda.
Sedangkan Union mengalokasikan memori di satu alamat memori dengan ukuran diambil dari ukuran member yang paling besar.
Contoh:
struct Player {
char *name; // address: aabbccdd
unsigned int level; // address: aaffeedd
}
union Enemy {
char *name; // 11ffdd22
unsigned int hp; // 11ffdd22
}
Setiap member pada struct Player
akan menggunakan alamat memori yang berbeda. Sedangkan union Enemy
hanya menggunakan satu alamat memori saja.
Biar lebih jelas, mari kita coba latihan.
Latihan: Struct vs Union
Buatlah program baru dengan nama union_vs_struct.c
, kemudian isi dengan kode berikut:
#include <stdio.h>
int main(){
struct Player {
char *name;
unsigned int level;
};
union Enemy {
char *name;
unsigned int hp;
};
struct Player player1;
player1.name = "Petani Kode";
player1.level = 1;
printf("Player : %d (address = %x)\n", sizeof(player1), &player1);
printf(" - name : %d (address = %x)\n", sizeof(player1.name), &player1.name);
printf(" - level: %d (address = %x)\n", sizeof(player1.level), &player1.level);
union Enemy zombie;
zombie.name = "Zombie 1";
zombie.hp = 100;
printf("Enemy : %d (address = %x)\n", sizeof(zombie), &zombie);
printf(" - name : %d (address = %x)\n", sizeof(zombie.name), &zombie.name);
printf(" - Hp : %d (address = %x)\n", sizeof(zombie.hp), &zombie.hp);
return 0;
}
Setelah itu, coba compile dan jalankan.
Maka hasilnya:
Ukuran memori union Enemy
adalah 8
karena mengambil dari ukuran member yang paling besar, yakni ukuran dari name
.
Alamat memori yang digunakan tiap member pada union
adalah sama. Tidak seperti struct Player
yang alamatnya berbeda-beda.
Apa Selanjutnya?
Kita sudah belajar dan memahami tipe ata union pada C. Kita memang tidak harus selalu menggunakan union.
Tapi..
Pada kasus tertentu seperti yang dicontohkan di atas, kita disarankan menggunakan union.
Berikutnya silakan pelajari tentang tipe data string dan pointer di C.
Jika ada yang belum dipahami, silakan tanyakan di komentar.
Selamat belajar. 🙌