Halo! Selamat datang kembali di “Seri Belajar Dasar Pemrograman Bahasa C#“. Di materi sebelumnya, kita telah mempelajari materi tentang tipe array yang berfungsi untuk menampung lebih dari satu data dari tipe data yang sama di dalam satu kontainer. Pada materi kali ini, kita akan mempelajari bagiamana mendefinisikan tipe data custom dengan tipe enum di C#.
Seperti yang telah kita pelajari di materi tipe data dan variabel, tipe data custom adalah tipe data yang kita buat sendiri sesuai dengan kebutuhan dengan memanfaatkan tipe data bawaan yang telah disediakan oleh C#.
Untuk membantu pemahaman Anda selama mempelajari materi ini, buatlah sebuah aplikasi console bernama BekerjaDenganTipeEnum.
Motivasi Menggunkan Tipe Enum Di C#
Tambahkan kode program di bawah ini ke dalam method Main()
.
Console.Write("Pilih nomer dari buah kesukaan Anda [1: Apel][2: Jeruk][3: Pisang]: ");
int pilihan = Int32.Parse(Console.ReadLine());
switch (pilihan)
{
case 1:
Console.WriteLine("Anda memilih apel");
break;
case 2:
Console.WriteLine("Anda memilih jeruk");
break;
case 3:
Console.WriteLine("Anda memilih pisang");
break;
default:
Console.WriteLine("Anda tidak memilih satupun");
break;
}
Pernyataan switch
pada kode program di atas akan mencocokkan nilai masukan dari pengguna yang telah dikonversi ke tipe int
dengan masing-masing pola pada setiap switch section (case 1
, case 2
, dll..).
Saya tidak akan menjelaskan secara detail bagaimana kode program di atas bekerja karena pernyataan switch
sudah kita pelajari di materi sebelumnya.
Saya hanya ingin menunjukkan bahwa kode program di atas merupakan kode program yang valid dan bisa dieksekusi tanpa menghasilkan eror. Namun demikian, perhatikan pola dari setiap switch section di atas.
Kode program di atas menggunakan konstanta berupa bilangan integer pada setiap pernyataan case
. Masalah? Tentu saja tidak, bagi compiler. Tapi adakah cara yang lebih “manusiawi” untuk mengkonstruksi setiap pernyataan case
di atas supaya lebih mudah kita baca, sebagai manusia?
Beruntung, C# menyediakan tipe enum yang akan kita pelajari di materi ini.
Mendefinisikan tipe enum di C#
Tambahkan definisi tipe enum pada lokasi seperti yang ditunjukkan oleh kode program di bawah ini.
using System;
namespace BekerjaDenganTipeEnum
{
// Definisi enum diletakkan di luar definisi class
public enum JenisBuah
{
Apel, // = 0
Jeruk, // = 1
Pisang // = 2
}
class Program
{
static void Main(string[] args)
{
// kode program sebelumnya tidak ditampilkan agar ringkas
}
}
}
Pada kode program di atas, kita telah mendefinsikan sebuah tipe enum bernama JenisBuah
.
Definisi standar dari tipe enum
Mendefinisikan tipe enum sangatlah simpel dan mudah. Kita hanya perlu menambahkan kata kunci enum
diikuti dengan sebuah identifier atau pengenal (dalam hal ini adalah JenisBuah
) dan disertai tanda kurung kurawal.
enum JenisBuah
{
Apel, // = 0
Jeruk, // = 1
Pisang // = 2
}
Apa yang terletak di dalam tanda kurung kurawal sebenarnya adalah sekedar daftar konstanta bilangan integer yang diberi nama. Daftar tersebut secara default dimulai dari bilangan integer 0. Jadi pada definisi tipe enum diatas, Apel
merupakan nama yang diberikan untuk konstanta bilangan integer 0 pada tipe enum JenisBuah
. Sementara Jeruk
dan Pisang
masing-masing adalah nama yang diberikan untuk bilangan integer 1 dan 2.
Apel
, Jeruk
, dan Pisang
juga biasa disebut dengan member tipe enum JenisBuah
.
Selanjutnya, kata kunci public
disebut dengan access modifier. Materi tentang access modifier nantinya baru akan Anda pelajari di materi pemrograman berorientasi objek di C#.
Mungkin ada satu hal lagi yang membuat Anda penasaran. Definisi tipe enum JenisBuah
kita definisikan di luar class Program
. Mengapa?
Masih ingat materi tentang tipe data, di mana kita bisa mendefinisikan tipe data kita sendiri selain tipe data bawaan dari C#? Baik tipe enum maupun class, dua-duanya kita gunakan untuk mendefinisikan tipe data. Karena tipe enum JenisBuah
dan class Program
merupakan dua tipe yang berbeda, maka kita mendefinisikan tipe enum JenisBuah
di luar definisi tipe class Program
.
Tapi bisakah kita mendefinisikan tipe enum JenisBuah
di atas di dalam definisi class Program
? Bisa saja. Ini disebut dengan nested type atau mendefinisikan tipe data di dalam definisi tipe data yang lain. Namun pada materi kali ini, kita belum akan mempelajari tentang nested type.
Mengganti nilai awal untuk member tipe enum
Apakah nilai konstanta integer untuk member tipe enum pasti dimulai dari angka 0 seperti pada tipe JenisBuah
di atas? Secara default, iya. Namun kita bisa mengubah perilaku standar definisi tipe enum, seperti mengubah nilai awal daftar membernya.
Untuk mengganti nilai awal daftar member sebuah tipe enum dari 0 menjadi bilangan lain, kita bisa mendefinisikan tipe enum dengan cara seperti yang ditunjukkan kode program di bawah ini.
public enum KategoriBarang
{
Kaos = 100, // nilai awal dimulai dari 100 (n)
CelanaPanjang, // = 101, diikuti dengan n + 1
Jaket, // = 102, n + 2
Tas // = 103, n + 3
}
Menetapkan nilai setiap member tipe enum secara eksplisit
Ada kalanya kita ingin menetapkan nilai integer setiap member tipe enum secara eksplisit. Contoh kasusnya adalah pada saat kita ingin memberi nama untuk setiap kode eror dari aplikasi kita.
public enum KodeEror
{
InputError = 202,
VerificationError = 101,
OperationError = 303
}
Pada definisi tipe enum di atas, kita memberi nama setiap kode eror dengan nama-nama yang mudah kita pahami sebagai manusia. Jika Anda perhatikan, dengan cara seperti ini, kita juga tidak harus menetapkan nilai integer untuk setiap member secara berurutan.
Menentukan Tipe Data Yang Mendasari Sebuah Tipe Enum Di C#
Pada dasarnya, nilai konstanta untuk setiap member tipe enum yang kita definisikan sejauh ini adalah dari tipe int
. Apabila kita menghendaki nilai konstanta dari tipe data yang lain, kita bisa menentukannya secara eksplisit seperti yang ditunjukkan oleh kode program di bawah ini.
enum sebuahEnum : byte
{
member1 = 10,
member2 = 1,
member3 = 255,
member4 = 9
// member berikut ini menghasilkan eror
// karena angka 999 tidak dapat ditampung oleh tipe byte
// elemen5 = 999
}
Definisi tipe enum di atas menggunakan tipe byte
untuk nilai konstantanya. Dengan demikian, kita tidak bisa menetapkan nilai di luar rentang dari tipe byte
, yaitu dari 0 sampai 255, untuk member tipe enum di atas.
Selain tipe byte
dan int
, kita bisa menggunakan tipe data integral yang lain seperti sbyte
, short
, uint
, long
, dan lain-lain.
Konversi Ke Tipe Enum
Sebelum melanjutkan materi, coba perhatikan kembali kode program di awal materi ini. Pada kode program tersebut, kita mengharapkan sebuah masukan dari pengguna berupa sebuah angka.
Angka tersebut kemudian kita konversi ke tipe int
dan kita tampung di variabel pilihan
. Di dalam pernyataan switch
, kita menggunakan variabel pilihan
sebagai match expression yang akan dicocokkan dengan setiap pola switch section yang disediakan.
Sekarang, daripada menggunakan konstanta seperti 1, 2, dan 3, kita akan menggunakan Apel
, Jeruk
, dan Pisang
yang telah kita definisikan pada tipe enum JenisBuah
.
Modifikasi kode program sebelumnya dengan kode program di bawah ini.
Console.Write("Pilih nomer dari buah kesukaan Anda [1: Apel][2: Jeruk][3: Pisang]: ");
int pilihan = Int32.Parse(Console.ReadLine());
// Eror
JenisBuah buah = pilihan;
// Menggunakan pernyataan switch dengan tipe enum
switch (buah)
{
// Menggunakan tipe enum menghindarkan kita pada penggunaan angka ajaib (magic number)
case JenisBuah.Apel:
Console.WriteLine("Anda memilih apel");
break;
case JenisBuah.Jeruk:
Console.WriteLine("Anda memilih jeruk");
break;
case JenisBuah.Pisang:
Console.WriteLine("Anda memilih pisang");
break;
default:
Console.WriteLine("Pilihan Anda tidak ada dalam daftar");
break;
}
Pada kode program di atas, pertama-tama kita mendeklarasikan sebuah variabel buah
dengan tipe JenisBuah
(Ingat! mendefinisikan tipe enum sama dengan mendefinisikan tipe data baru). Kemudian kita menetapkan nilai variabel buah
dengan nilai dari variabel pilihan
.
Selanjutnya, kita menggunakan variabel buah
sebagai match expression. Untuk pola pada setiap switch section, daripada menggunakan angka ajaib seperti 1, 2, dan 3, kita menggunakan nama-nama member dari tipe JenisBuah
.
Berhenti sampai di sini. Kode program di atas menghasilkan eror!
Perhatikan baris kode program berikut ini.
JenisBuah buah = pilihan;
Variabel buah
adalah dari tipe JenisBuah
dan variabel pilihan
adalah dari tipe int
. Compiler tidak bisa mengkonversi tipe int
ke tipe JenisBuah
secara implisit sehingga kode program tersebut menghasilkan eror.
Untuk mengatasinya, kita bisa mengkonversi nilai variabel pilihan
ke tipe JenisBuah
secara eksplisit. Modifikasi baris kode program tersebut menjadi seperti kode program di bawah ini.
JenisBuah buah = (JenisBuah)pilihan;
Jalankan kode program yang telah Anda modifikasi. Kali ini, tidak ada eror dan program Anda bisa berjalan seperti saat sebelum Anda modifikasi. Bedanya, kali ini tidak hanya compiler yang bahagia, namun Anda juga bahagia karena terbebas dari menggunakan angka ajaib pada pernyataan switch.
Penutup
Pada materi kali ini, kita telah mempelajari bagaimana cara mendefinisikan dan menggunakan tipe enum di C#.
Selain itu, kita juga mempelajari bagaimana cara mengkonversi tipe data integral ke tipe data enum.
Itu saja meteri kita kali ini. Jika Anda merasa kesulitan dalam memahami materi ini, jangan menyerah! Tulis kesulitan atau pertanyaan Anda di kolom komentar, saya akan membantu.
Selamat belajar!