author Ahmad Muhardian

Belajar C++ #11: Tipe Data Enum di C++


Belajar pemrograman C++: Mengenal Enum dan Contohnya

Halo, selamat datang kembali di seri tutorial belajar C++.

Kali ini kita akan masuk ke pembahasan tentang tipe data Enum.

Apa itu Enum?

Mengapa kita butuh Enum?

Gimana cara buat enum dan menggunakannya di program C++?

Mari kita bahas…

Apa itu Enum?

Enum atau Enumeration merupakan tipe data yang berisi sekumpulan konstanta.

Jadi, dengan Enum.. kita bisa menyimpan beberapa konstanta dalam satu variabel.

Berikut ini cara membuat enum:

Berikut ini cara membuat enum:

Cara membuat enum pada C

Contoh:

enum level {EASY = 1, NORMAL = 2, HARD = 3};
enum sex {MALE, FEMALE};
enum state {PENDING, INPROGRESS, DONE};

Apabila kita tidak mengisi nilai konstanta pada enum…

…maka secara default akan diisi dengan angka yang mengikuti urutan penulisannya.

Contoh:

enum hari {SENIN, SELASA, RABU, KAMIS, JUMAT, SABTU, MINGGU};

Maka konstanta yang ada di dalam enum hari akan bernilai:

SENIN  = 0
SELASA = 1
RABU   = 2
KAMIS  = 3
JUMAT  = 4
SABTU  = 5
MINGGU = 6

Jadi mirip-mirip seperti array ya, tapi bedanya yang di simpan dalam enum bukan variabel.. melainkan konstanta yang nilainya tak bisa kita ubah.

Mengapa sih kita butuh Enum?

Enum memudahkan kita menyimpan beberapa konstanta yang masih dalam satu kelompok ke dalam satu variabel. Sehingga akan membuat kode menjadi gampang dipahami.

Misalnya, kita ingin menyimpan status pesanan.. bisa aja kita buat konstantanya satu-per-satu seperti ini.

const int PENDING   = 1;
const int CANCELED  = -1;
const int PAID      = 2;
const int SHIPPING  = 3;
const int DELIVERED = 4;

Tapi kalau nanti kita sudah banyak pakai konstanta dengan nama yang sama, maka kita akan bingung membacanya.

Karena itu, konstanta yang masih satu kelompok.. baiknya ditaruh dalam satu tempat supaya mudah.

Sehingga kita bisa buat enum seperti ini:

enum OrderStatus = { PENDING, CANCELLED = -1, PAID, SHIPPING, DELIVERED };

Lalu, kita bisa pakai dengan cara seperti ini:

OrderStatus status = PENDING;

Sekarang mari kita coba latihan.

Membuat Program dengan Enum

Sekarang mari kita coba membuat program dengan enum.

Silakan buat program baru bernama contoh_enum.cpp, kemudian isi dengan kode berikut.

#include <iostream>

using namespace std;

enum Role { USER, ADMIN };

int main() {

    string name = "Petani Kode";
    Role user_role = USER;

    if(user_role == ADMIN) {
        cout << "Welcome Admin" << endl;
    } else {
        cout << "Hello, " << name << endl;
    }

    return 0;
}

Setelah itu, coba compile dan jalankan…

Maka hasilnya:

Contoh program dengan enum

Sekarang coba ubah user_role dengan ADMIN, sehingga menjadi seperti ini:

#include <iostream>

using namespace std;

enum Role { USER, ADMIN };

int main() {

    string name = "Petani Kode";
    Role user_role = ADMIN;

    if(user_role == ADMIN) {
        cout << "Welcome Admin" << endl;
    } else {
        cout << "Hello, " << name << endl;
    }

    return 0;
}

Lalu compile dan jalankan lagi.

maka hasilnya:

Contoh enum dengan nilai admin

Pada contoh kasus ini, kita menggunakan enum untuk menyimpan konstanta yang menyatakan Role dari user.

Masih bingung?

Tidak apa-apa, nanti ke depannya kalau sering pakai enum akan paham kok.

Menggunakan Enum Sebagai Flags

Flags artinya bendera, kalau dalam pemrograman.. Flags ini bisa diartikan sebagai penanda atau marker.

Contoh kasusnya:

Misalnya kita ingin membuat program hak akses, maka kita bisa buat flag: READ, WRITE, DELETE.

Nantinya, data yang kita kasi flag tersebut akan bisa mengakses sesuai flag yang kita berikan.

Mari kita coba buat dalam latihan!

Buatlah file baru dengan nama enum_flag.cpp kemudian isi dengan kode berikut:

#include <iostream>
using namespace std;

int main() {
    enum Permission { READ = 1, WRITE = 2, DELETE = 4};
    int balance = 0;

    // set flags dengan operasi bitwise or
    Permission userPermission = Permission(READ | WRITE);

    if(userPermission & WRITE){
        cout << "Anda dibolehkan mengisi saldo\n";
        balance += 100;
    }

    cout << "Saldo:" << balance << endl;

    return 0;
}

Setelah itu, coba compile dan jalankan.

Maka hasilnya:

Enum sebagai flag

Perhatikan!

Pada contoh kasus ini kita mengisi nilai flag READ=1, WRITE=2, dan DELETE=4.

Mengapa diisi begitu?

Ini supaya kalau diubah menjadi biner dengan operasi bitwise OR (|), binernya tidak bentrok. Ingat, operasi bitwise itu operasi yang dilakukan berdasarkan biner.

Misalnya:

READ | WRITE

Kalau dalam biner:

READ    = 0001;
WRITE   = 0010;

// maka
READ | WRITE = 0011;

Oke,sekarang coba ubah userPermission.

Kita hapus flag WRITE, maka sekarang binernya akan menjadi 0001.

Enum sebagai flag

Sehingga kodenya menjadi seperti ini:

#include <iostream>
using namespace std;

int main() {
    enum Permission { READ = 1, WRITE = 2, DELETE = 4};
    int balance = 0;

    // set flags dengan operasi bitwise or
    Permission userPermission = Permission(READ);

    if(userPermission & WRITE){
        cout << "Anda dibolehkan mengisi saldo\n";
        balance += 100;
    }

    cout << "Saldo:" << balance << endl;

    return 0;
}

Lalu coba compile dan jalankan lagi.

Maka hasilnya:

Hasil enum setelah hapus flag Write

Saldonya tidak berubah, ini karena kita tidak berikan flag WRITE pada variabel userPermission.

Sehingga pada saat operasi userPermission & WRITE akan menghasilkan false.

Scoped Enum di C++

Coba perhatikan contoh-contoh latihan yang baru saja kita buat.

Pada contoh tersebut, kita membuat enum di luar fungsi main() dan juga di dalam fungsi main().

Ini disebut: Unscoped Enum

Apaan tuh Unscoped Enum?

Unscped enum adalah enum yang cakupannya secara global. Artinya, apa yang ada di dalam enum tersebut bisa kita langsung akses.

Contohnya:

enum Task { PENDING, PROGRESS, DONE };

Nah, enum Task bisa kita akses secara langsung seperti ini:

Task newTask = PENDING;

Beda halnya dengan Scoped Enum.

Scoped Enum* adalah enum yang isinya bisa diakses di dalam scope tertentu.

Sebagai contoh:

Kita membuat enum di dalam Struct.. maka enum tersebut hanya akan bisa diakses melalui Struct tersebut.

Perhatikan kode ini:

struct Player {
  int health;
  enum Role {P1, P2};
}

Pada kode ini terdapat sebuah struct Player dan di dalamnya terdapat enum Role yang berisi P1 dan P2.

Jika kita mau akses enum Role, maka harus melalui struct Player dulu.

Caranya seperti ini:

Player::Role p1 = Player::Role::P1;

Tanda :: adalah operator untuk mengakses member dari Struct, Class, dan Namespace.

Pada contoh ini, kita mengakses enum P1 dengan cara Player::Role::P1. Oh iya, ini bisa dilakukan di versi C++11 ya, kalau di versi lama nggak akan bisa. 1

Oke, biar lebih paham..

..mari kita coba latihan scoped enum.

Buatlah file baru dengan nama enum_scoped.cpp, kemudian isi dengan kode berikut:

#include <iostream>
using namespace std;

// membuat scoped enum di dalam struct
struct Car {
    int speed;
    enum EngineStatus { ON, OFF };
    enum Direction { FORWARD, BACKWARD };
    Direction direction;
    EngineStatus engineState;
};

// membuat scoped enum di dalam class
enum class LampColor { RED, YELLOW, GREEN };

int main(){

    Car honda = {
        .speed = 40,
        .engineState = Car::EngineStatus::ON
    };

    LampColor lampColor = LampColor::GREEN;

    if(lampColor == LampColor::GREEN){
        honda.direction = Car::Direction::FORWARD;
    }

    cout << "Kecepatan mobil: " << honda.speed << endl;
    cout << "Engine: " << honda.engineState << endl;
    cout << "Direction: " << honda.direction << endl;

    return 0;
}

Setelah itu, compile dan jalankan.

Maka hasilnya:

Hasil contoh scoped enum

Pada contoh ini, kita membuat dua scoped enum. Yakni enum di dalam struct Car dan enum di dalam class LampColor.

Ada dua enum di dalam Struct Car, yakni EngineStatus dan Direction.

Lalu, saat mengakses nilai pada scoped enum tersebut.. kita harus melalui Struct Car dan juga class LampColor.

Apa Selanjutnya?

Sejauh ini, kita sudah belajar tentang enum dan berlatih menggunakannya.

Yang perlu dipahami dan diingat adalah:

Enum itu berisi kumpulan konstanta yang isinya berupa angka (integer).

Selanjutnya, silakan pelajari tentang Struct di C++.

Selamat belajar! 🙌