Union
Union
Struct adalah sekumpulan variabel yang masing masing dapat berbeda tipe, dan dikelompokkan ke
dalam satu nama. Struct ini sering digunakan untuk mendefinisikan suatu rekord data yang disimpan di
dalam file. Struct mirip representasi sebuah object beserta propertiesnya. Contoh: struct MHS
setidaknya punya elemen untuk NPM, Nama, dan Alamat.
Contoh Program:
Source Code
Output
Analisa
Struct pada program di atas digunakan untuk menampilkan data karyawan, dengan cara mengetik
sebuah deklarasi yg akan memanggil field field yg ada di dalam struct,struct tanggal dan struct alamat.
Jadi struct digunakan untuk mendefinisikan suatu rekord data yang disimpan di dalam file.
Definisi Union==>>
Union merupakan tipe data yang dibangkitkan, dimana anggota anggotanya menggunakan secara
bersama sama ruang penyimpanan memori yang sama, berbeda dengan struct yang masing masing
variabel yang menempati lokasi yang berbeda. Jumlah bytes yang digunakan untuk menyimpan union
adalah sedikitnya cukup untuk menyimpan data terbesar yang ditangani. Oleh karena itu tipe union ini
umumnya digunakan untuk menangani satu, dua, atau tiga variabel dengan tipe yang mirip. Sebagai
contoh:
union nilaiUjian {
int uts, uas;
float akhir;
}
Contoh Program:
Source Code
Output
Analisa
Inisialisasi,deklarasi, dan pengolahan terhadap tipe union ini sama dengan struct, dan program diatas
digunakan untuk menjelaskan cara mengakses byte ke-0 atau byte ke-1 dari di, dc[0] atau dc[1] yang
digunakan.Seperti gambar di bawah ini
Daftar Pustaka==>>
Julio Adisantoso :: Departemen Ilmu Komputer IPB, "Bab VIII Struct,Union,Enumerasi,dan
Manipulasi Bit".
A structure is a collection of items of different types; and each data item will have its own memory
location. Where as only one item within the union can be used at any time, because the memory
allocated for each item inside the union is in a shared memory location i.e., only one memory location
will be shared by the data items of union.
Sometimes we may not need the data of all the (related) data items of a complex data structure and be
storing/accessing only one data item at a time. Union helps in such scenarios.
e.g.,
typedef union
{
int Wind_Chill;
char Heat_Index;
} Condition;
typedef struct
{
float temp;
Condition feels_like;
} Temperature;
Wind Chill is only calculated when it is cold and heat index is used only when it is hot. There is no
need for both of them at the same time. So when we specify the temp, feels_like will have only one
value - either wind chill or heat index, but not both.
typedef union
{
int Wind_Chill;
char Heat_Index;
} Condition;
typedef struct
{
float temp;
Condition feels_like;
} Temperature;
void main()
{
Temperature *tmp;
Apa hasil keluaran program itu? Jawabnya adalah 5, karena a dan b menempati lokasi memori yang
sama. Kita bisa menambahkan banyak variabel di union. Jika tipe variabel itu sama, maka nilainya
akan sama. Kita bisa membuat union dari tipe yang berbeda juga, misalnya:
union {
int a;
char b;
long c;
double d;
} test;
Kompilator akan mengalokasikan memori sesuai dengan tipe yang paling besar (dalam contoh di atas
adalah double, 8 byte. Jika kita akses:
test.a = 5;
Lalu kita akses test.d, maka akan keluar angka yang aneh. Hal ini terjadi karena representasi double
dan int tidak sama di memori. Lalu apa kegunaan fitur semacam ini? biasanya union digabung dengan
struct jika struktur digunakan untuk menyimpan lebih dari satu jenis data, dan pada satu saat kita hanya
akan menggunakan satu jenis data.
Misalnya kita punya struktur bentuk, yang bisa menyimpan lingkaran atau bujursangkar. LIngkaran
punya radius yang tipenya float sedangkan bujursangkar hanya integer (ini hanya contoh saja,
sebenarnya agak mengada-ada supaya contohnya sederhana).Kita definisikan enumerasi seperti ini:
typedef enum {
lingkaran,
bujursangkar
} jenisbentuk;
Tapi ini akan memakan lebih banyak memori (12 byte, sedangkan versi union hanya butuh 8 byte). Kita
bisa menaruh informasi sisi dan radius di memori yang sama karena kita tahu, bahwa pada satu saat,
hanya sisi ATAU radius saja yang dipakai.
Contoh pemakaiannya:
bentuk b;
if (bentuk_baru == lingkaran) {
b.jenis = lingkaran;
b.info.radius = r;
} else if (bentuk_baru == bujursangkar) {
b.jenis = bujursangkar;
b.info.sisi = s;
} else {
/*mungkin error*/
}
Untuk mengakses lagi, kita harus tahu apakah tadi kita menyimpan di sisi atau radius:
if (b.jenis==lingkaran) {
printf("Radius = %f\n", b.info.radius);
}
Teknik semacam ini banyak digunakan di banyak API/system call UNIX (contoh: API untuk socket
yang bisa menangani berbagai jenis socket, baik tcp/ip. unix socket, bluetooth, dll). Banyak juga
dipakai di teknik kompilasi (misal satu node identifier bisa berupa integer, float, atau yang lain).