You are currently viewing Memahami Tipe Struct Pada Pemrograman Bahasa C#

Memahami Tipe Struct Pada Pemrograman Bahasa C#

Halo! Selamat datang kembali di “Seri Belajar Dasar Pemrograman Bahasa C#“. Pada materi sebelumnya, kita telah bersama-sama mempelajari apa itu tipe class di C#. Selain tipe class, C# juga menyediakan sebuah konstruksi yang mirip dengan tipe class, yaitu tipe struct.

Pada materi kali ini, kita akan mempelajari apa itu tipe struct dan juga mengulas apa perbedaan tipe struct dengan tipe class.

Apa Itu Tipe Struct di C#?

Hampir sama seperti tipe class, tipe struct biasanya digunakan untuk membuat blueprint dari sebuah objek. Tipe struct bisa kita definisikan seperti pada kode program di bawah ini.

public struct Customer
{
    public string name;
    public int age;
    public string gender;
    public string address;
    
    public void Order()
    {
        Console.WriteLine($"{name} memesan makanan...");        
    }

    public void Pay()
    {
        Console.WriteLine($"{name} membayar...");
    }
}

Jika Anda perhatikan, definisi struct Customer di atas hampir sama persis dengan definisi class Customer pada materi sebelumnya. Seperti yang terlihat pada definisi struct di atas, tipe struct juga memiliki member seperti tipe class, seperti field dan method.

Bedanya, kali ini kita tidak menggunakan kata kunci class, melainkan kata kunci struct. Selain itu, jika Anda cermat, definisi struct di atas tidak memiliki default constructor (constructor tanpa parameter). Berbeda dengan tipe class, pada saat mendefinisikan sebuah struct, kita sama sekali tidak diperkenankan mendefinisikan default constructor secara eksplisit.

Menggunakan Tipe Struct Di C#

Kita bisa menggunakan objek dari tipe struct hampir sama seperti saat menggunakan tipe class.

Perhatikan kode program di bawah ini.

static void Main(string[] args)
{
    Customer customer;
    customer.name = "Joko";
    customer.age = 20;
    customer.gender = "Laki-laki";
    customer.address = "Di bawah langit";

    Console.WriteLine($"Nama: {customer.name}, Umur: {customer.age}, Jenis Kelamin:{customer.gender}, Alamat: {customer.address}");

    customer.Order();
    customer.Pay();
}

Jika Anda telah mempelajari materi sebelumnya tentang tipe class, pastinya Anda akan familiar dengan kode program di atas.

Jika Anda cermat, bedanya kali ini kita tidak menggunakan kata kunci new untuk menginstansiasi objek dari struct Customer. Objek customer tersebut kita instansiasi seperti mendeklarasikan sebuah variabel biasa.

Menginstansiasi Objek Dari Sebuah Struct Di C#

Menginstansiasi objek dari sebuah struct seperti di atas tentunya memiliki sebuah konsekuensi. Coba perhatikan kode program di bawah ini.

static void Main(string[] args)
{
    Customer customer;

    Console.WriteLine($"Nama: {customer.name}, Umur: {customer.age}, Jenis Kelamin:{customer.gender}, Alamat: {customer.address}");

    customer.Order();
    customer.Pay();
}

Jika kita mencoba menjalankan kode program di atas, kita akan mendapatkan pesan eror “Use of possibly unassigned field”. Artinya, kita tidak diperkenankan menggunakan variabel objek customer sebelum menginisialisasi seluruh field dari objek tersebut.

Oleh karena itu, sebelum menggunakan variabel objek customer, kita harus menginisialisasi seluruh field dari objek customer seperti di bawah ini.

customer.name = "Joko";
customer.age = 20;
customer.gender = "Laki-laki";
customer.address = "Di bawah langit";

Kali ini, memang hanya terdapat empat buah field pada struct Customer. Bagiamana jika sebuah struct memiliki lebih banyak field yang harus diinisialisasi?

Fungsi Kata Kunci new Untuk Menginstansiasi Tipe Struct

Selain menginstansiasi objek dari tipe struct seperti pada contoh sebelumnya, kita bisa menginstansiasi objek dari tipe struct sama persis seperti menginstansiasi objek dari tipe class, yaitu dengan menggunakan kata kunci new.

Customer customer = new Customer();

Pada kode program di atas, Customer() merupakan constructor tanpa parameter dari struct Customer.

Constructor tanpa parameter?

Bukannya kita tidak bisa mendefinisikan constructor tanpa parameter pada sebuah struct?

Ya, kita memang tidak bisa mendefinisikan constructor tanpa parameter pada sebuah struct secara eksplisit, namun di C# sebuah constructor tanpa parameter sudah didefinisikan secara implisit. Artinya, tanpa mendefinisikan constructor sekalipun, kita tetap bisa memanggil constructor tanpa parameter dari sebuah struct.

Kata kunci new saat menginstansiasi objek dari tipe struct meskipun secara sintaks mirip dengan ketika menginstansiasi objek dari tipe class. Namun, secara semantik, keduanya cukup berbeda.

Jika kata kunci new yang digunakan saat menginstansiasi objek dari tipe class berfungsi untuk menginisialisasi dan juga mengalokasikan memori heap untuk menyimpan objek tersebut, maka kata kunci saat menginstansiasi objek dari tipe struct hanya digunakan untuk menginisialisasi seluruh field dari struct tersebut ke nilai defaultnya. Misalnya, field dari tipe data int akan diinisialisasi ke nilai 0.

static void Main(string[] args)
{
    Customer customer = new Customer();

    Console.WriteLine($"Nama: {customer.name}, Umur: {customer.age}, Jenis Kelamin:{customer.gender}, Alamat: {customer.address}");

    customer.Order();
    customer.Pay();
    
    // Output:
    // Nama: , Umur: 0, Jenis Kelamin:, Alamat:
    //  memesan makanan...
    //  membayar...
}

Objek dari tipe struct sendiri akan dialokasikan ke memori stack. Hal itu dikarenakan objek dari tipe struct adalah dari tipe nilai atau value type. Sedangkan objek dari tipe class adalah dari tipe referensi atau reference type.

Mendefinisikan Constructor Dengan Parameter Pada Struct

Tanpa mendefinisikan constructor apapun, secara implisit C# akan menyediakan sebuah constructor tanpa parameter ketika kita mendifinisikan sebuah struct. Perlu diingat bahwa kita justru tidak diperbolehkan mendefinisikan constructor tanpa parameter pada sebuah struct.

Dengan menggunakan kata kunci new diikuti dengan memanggil constructor tanpa parameter dari sebuah struct, kita bisa menginisialisasi seluruh field dari sebuah struct hanya dengan satu baris kode program.

Masalahnya, constructor tanpa parameter pada sebuah struct hanya akan menginisialisasi seluruh field dari struct tersebut ke nilai defaultnya. Bagaimana jika kita ingin menginisialisasi seluruh field dengan nilai yang kita inginkan?

Caranya adalah dengan menimpa (overload) default constructor (yang didefinisikan secara implisit oleh C#) pada sebuah struct dengan mendefinisikan constructor dengan parameter.

Kita bisa menambahkan kode program di bawah ini ke dalah definisi struct Customer yang telah kita buat sebelumnya.

public Customer(string name, int age, string gender, string address)
{
    this.name = name;
    this.age = age;
    this.gender = gender;
    this.address = address;
}

Kata kunci this pada kode program di atas berfungsi untuk menunjukkan bahwa name, age, gender, dan address di sebelah kiri tanda sama dengan merupakan field dari struct tersebut. Sedangkan name, age, gender, dan address di sebelah kanan tanda sama dengan merupakan parameter dari constructor.

Dengan mendefinisikan constructor seperti di atas, kali ini kita bisa menginstansiasi objek struct tersebut dengan kata kunci new sekaligus menginisialisasi seluruh field pada sebuah objek struct.

static void Main(string[] args)
{
    Customer customer = new Customer("Joko", 20, "Laki-laki", "Di bawah langit");

    Console.WriteLine($"Nama: {customer.name}, Umur: {customer.age}, Jenis Kelamin:{customer.gender}, Alamat: {customer.address}");

    customer.Order();
    customer.Pay();
}

Bagaimana jika kita hanya ingin menginisialisasi field name saja dan membiarkan field lainnya diinisialisasi ke nilai defaultnya?

Kita bisa mendefinisikan sebuah constructor yang hanya menerima namanya saja sebagai parameter. Lalu, menginisialisasi field yang lain ke nilai defaultnya seperti pada contoh kode program di bawah ini.

public Customer(string name)
{
    this.name = name;
    this.age = default;
    this.gender = default;
    this.address = default;
}

Perhatian

kata kunci default hanya bisa digunakan jika Anda menggunakan C#7.1 ke atas. Jika Anda menggunakan C# versi sebelumnya, gunakan kata kunci default(tipe_data), seperti default(int). referensi: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/default

Dengan definisi constructor di atas, kita bisa menginisialisasi sebuah objek dari struct seperti yang ditunjukkan pada contoh kode program di bawah ini.

Customer customer = new Customer("Joko");

Penutup

Pada materi kali ini, kita telah mempelajari apa itu struct di C#, bagaimana mendefinisikan sebuah struct, dan bagaimana menginstansiasi sebuah objek dari tipe struct.

Karena objek dari tipe struct dialokasikan ke memori stack, tipe struct ini biasa dikatakan sebagi versi ringan dari tipe class.

Jika Anda merasa kesulitan dalam memahami materi ini, jangan menyerah! Tulis kesulitan atau pertanyaan Anda di kolom komentar, saya akan membantu.

Selamat belajar!

Tinggalkan Balasan