Mengapa Anda harus menentukan tipe data saat mendeklarasikan variabel

Halo! Selamat datang kembali di “Seri Belajar Dasar Pemrograman Bahasa C#“. Kali ini kita akan mempelajari salah satu materi yang merupakan pondasi dari setiap bahasa pemrograman terutama bahasa C#, yaitu tipe data dan variabel.

Setelah selesai mempelajari materi kali ini, Anda akan memahami apa itu tipe data dan variabel, mengerti bagaimana cara mendeklarasikan sebuah variabel, serta memahami apa perbedaan antara value type dan reference type.

Jika Anda diminta untuk membedakan tipe dari sebuah nilai, bagaimana cara Anda membedakannya?

Tentu saja bagi kita, membedakan atau mengkategorikan mana nilai yang termasuk angka dan mana nilai yang termasuk karakter adalah hal yang mudah.

Seperti yang terlihat pada gambar di bawah ini, dengan mudahnya kita bisa menentukan bahwa angka 1256 adalah nilai bilangan bulat, tulisan “pemrograman” adalah nilai deret karakter, dan angka 126.98 adalah nilai bilangan desimal.

Mengapa Anda harus menentukan tipe data saat mendeklarasikan variabel

Tidak seperti Anda dan saya, komputer tidak dapat membedakan mana nilai yang termasuk angka dan mana yang termasuk huruf.

Lalu pertanyaan yang muncul adalah bagaimana caranya agar komputer dapat membedakan nilai-nilai seperti di atas?

Agar komputer bisa memproses data-data di dalam kode program yang kita tulis, kode program tersebut perlu ditransformasi terlebih dahulu ke bentuk lain. Selanjutnya hasil transformasi tersebut, apabila dijalankan, akan dikelola oleh Sistem Operasi (misal Windows, Linux, dan MacOS) dengan memanfaatkan perangkat keras komputer seperti memori dan prosesor.

Proses transformasi ini disebut dengan kompilasi (compilation). Sedangkan, “alat” untuk melakukan proses kompilasi disebut dengan compiler. Salah satu tugas compiler adalah untuk memeriksa apakah data yang “dikemas” di dalam sebuah “kontainer” sudah sesuai dengan “label” pada kontainer tersebut atau belum. Jika sesuai, compiler akan mentransformasi nilai dari data-data tersebut ke bentuk data yang bisa diolah oleh komputer.

jTugas kita sebagai programmer C# adalah memastikan bahwa sebuah nilai/data dikemas ke dalam kontainer dengan label yang sesuai. Contohnya, angka 1256 harus kita kemas ke dalam kontainer dengan label “bilangan bulat”. Tulisan “pemrograman” harus kita kemas ke dalam kontainer dengan label “deret karakter”. Lalu angka 126.98, harus kita kemas ke dalam kontainer dengan label “bilangan desimal”.

Mengapa Anda harus menentukan tipe data saat mendeklarasikan variabel

Dalam dunia pemrograman, kontainer atau box ini biasa disebut dengan variabel. Sementara label yang kita berikan pada kontainer tersebut biasa disebut dengan tipe data. Dan proses pelabelan kontainer ini biasa disebut dengan deklarasi variabel.

Dalam bahasa C#, deklarasi variabel ditulis dengan cara seperti berikut ini:

BilanganBulat box1 = 1256; DeretKarakter box2 = “pemrograman”; BilanganDesimal box3 = 126.98;

BilanganBulat, DeretKarakter, dan BilanganDesimalpada potongan kode program di atas merupakan tipe data yang digunakan, sementara box1, box2, dan box3 adalah nama variabelnya, lalu 1256, “pemrograman”, dan 126.98 adalah nilai yang disimpan ke dalam masing-masing variabel yang telah kita deklarasikan.

Jadi, ketika membuat sebuah variabel di C#, kita harus menentukan tipe data untuk variabel tersebut terlebih dulu. Tipe data berfungsi untuk memberitahu compiler dan syntax checker, apakah nilai yang hendak kita simpan ke dalam variabel tersebut sudah sesuai dengan tipe datanya atau belum.

C# merupakan bahasa pemrograman yang strongly-typed. Maksudnya, nilai yang kita tetapkan ke dalam sebuah variabel harus benar-benar sesuai dengan tipe data dari variabel tersebut. Contohnya, apabila kita mencoba menyimpan angka 126.98 yang merupakan bilangan desimal ke dalam variabel box1 yang bertipe data BilanganBulat, maka compiler akan melakukan protes dengan memberi kita sebuah pesan eror.

Variabel ini nantinya akan disimpan di dalam memori untuk selanjutnya digunakan untuk melakukan operasi atau kalkulasi berdasarkan tipe data yang diberikan.

Untuk mendemonstrasikan bagaimana mendeklarasikan dan menginisialisasi variabel, buat sebuah folder pada direktori komputer Anda dan beri nama DeklarasiDanInisialisasiVariabel.

Ikuti instruksi tentang bagaimana membuat aplikasi console C# dengan .NET Core seperti yang telah Anda pelajari di materi sebelumnya.

Hapus baris kode program Console.WriteLine("Hello World!");yang berada pada blok method Main(). Ganti dengan kode program di bawah ini (letakkan di antara tanda { dan } tepat setelah static void Main(string[] args)).

// Mendeklarasikan variabel int varInt; string varStr; Console.WriteLine("Nilai variabel varInt: {0}",varInt); Console.WriteLine("Nilai variabel varStr: {0}",varStr);

Kode program di atas mendemonstrasikan bagaimana mendeklarasikan variabel bernama varInt dan varStr yang secara berurutan didefinisikan sebagai int dan string. Dua baris terakhir digunakan untuk menampilkan nilai dari masing-masing variabel tersebut.

Namun, kode program di atas menghasilkan eror. Jika Anda mengarahkan kursor ke atas varInt dan varStr, Anda akan mendapatkan pesan eror seperti pada gambar di bawah ini.

Mengapa Anda harus menentukan tipe data saat mendeklarasikan variabel

Artinya, Anda tidak bisa menggunakan sebuah variabel yang sama sekali belum pernah diinisialisasi atau ditetapkan nilai awalnya (unassigned).

Ganti deklarasi variabel sebelumnya dengan kode program di bawah ini.

int varInt = 0; string varStr; varStr = "";

Untuk menginisialisasi sebuah variabel, kita bisa melakukannya dalam satu baris deklarasi seperti pada baris 1 kode program di atas, atau melakukannya pada baris yang berbeda seperti pada baris 3 dan 4.

Jalankan program Anda dengan menekan tombol ctrl + F5 atau dengan memberi perintah dotnet run pada integrated terminal.

Program Anda akan menghasilkan keluaran seperti berikut ini.

Nilai variabel varInt: 0 Nilai variabel varStr:

Selain cara-cara sebelumnya, kita juga bisa mendeklarasikan dan menginisialisasi beberapa variabel sekaligus dengan cara seperti yang dtitunjukkan oleh baris kode program berikut ini.

bool b1 = true, b2 = false, b3 = b1;

C# menyediakan beberapa tipe data bawaan yang bisa langsung kita gunakan. Tipe-tipe data ini biasa disebut dengan built-in data types atau predefined types.

Pada saat Anda membuat program DeklarasiDanInisialisasiVariabel, Anda telah menggunakan predefined types seperti int ketika mendeklarasikan variabel dengan nilai bilangan bulat, lalu string untuk deret karakter, dan juga bool untuk menyatakan benar atau salah.

Tipe data int dan string sendiri sebenarnya merupakan alias yang diberikan oleh C# untuk format umum tipe data yang disediakan di lingkungan .NET. Format .NET untuk tipe data int di C# adalah System.Int32. Sedangkan untuk tipe data string di C# adalah System.String di .NET.

Oleh karena itu, kita bisa mengganti int dengan System.Int32 untuk mendeklarasikan sebuah variabel bertipe integer.

int x = 123; System.Int32 y = 123;

Jika kita perhatikan potongan kode program di atas, x dan y adalah variabel yang digunakan untuk menyimpan nilai integer. Untuk menentukan tipe datanya, kita bisa menggunakan baik int maupun System.Int32.

Berikut ini adalah tabel tipe data bawaan dari C# dan .NET.

Mengapa Anda harus menentukan tipe data saat mendeklarasikan variabel

Semua tipe data pada tabel di atas merupakan tipe nilai (value type) kecuali object dan string yang merupakan tipe referensi (reference type).

Selain menggunakan berbagai tipe data bawaan bahasa C#, kita juga bisa mendefinisikan tipe data kita sendiri. Caranya adalah menggunakan class, struct, interface, enum dan delegate.

Pertanyaannya, mengapa kita perlu mendefinisikan tipe data kita sendiri?

Katakanlah Anda sedang membuat aplikasi e-commerce dan Anda memerlukan tipe data Customer untuk menyimpan dan mengolah data-data pelanggan Anda di dalam memori sebelum disimpan ke database. Apakah Anda bisa menemukan tipe data Customer di C#? Tentunya tidak, bukan?

Oleh karena itu, Anda perlu membuat sebuah tipe data baru yang bisa digunakan untuk menyimpan dan mengolah data-data pelanggan Anda. Caranya adalah dengan mendefinisikan sebuah class atau struct.

Pengetahuan Anda tentang user-defined types akan bertambah setelah Anda mempelajari Pemrograman Berorientasi Objek.

C# mengklasifikasikan tipe data ke dalam dua kategori. Yaitu, value types atau tipe nilai dan reference type atau tipe referensi.

Tipe ini memuat nilai sebenarnya dari data yang tersimpan. Maksudnya, jika kita memiliki variabel “bilangan bulat” yang digunakan untuk menyimpan angka 3, angka 3 ini lah yang disimpan di dalam variabel yang kita deklarasikan.

Seperti yang sudah Anda ketahui, Value type tidak boleh dibiarkan kosong atau bernilai null ketika digunakan.

Mengapa Anda harus menentukan tipe data saat mendeklarasikan variabel

Untuk bereksperimen dengan value type, buatlah sebuah aplikasi console menggunakan Visual Studio Code dengan nama ValueType.

Pertama, kita akan bereksperiman dengan beberapa tipe data untuk bilangan bulat. Ubah kode program di dalam file program.cs dengan kode program di bawah ini.

using System; namespace ValueType { class Program { static void Main(string[] args) { sbyte varSbyte; varSbyte = -128; Console.WriteLine("Nilai variabel varSbyte: {0}", varSbyte); varSbyte = 127; Console.WriteLine("Nilai variabel varSbyte: {0}", varSbyte); short varShort; varShort = -32768; Console.WriteLine("Nilai variabel varShort: {0}", varShort); varShort = 32767; Console.WriteLine("Nilai variabel varShort: {0}", varShort); int varInt; varInt = -2147483648; Console.WriteLine("Nilai variabel varInt: {0}", varInt); varInt = 2147483647; Console.WriteLine("Nilai variabel varInt: {0}", varInt); long varLong; varLong = -9223372036854775808; Console.WriteLine("Nilai variabel varLong: {0}", varLong); varLong = 9223372036854775807; Console.WriteLine("Nilai variabel varLong: {0}", varLong); byte varByte; varByte = 0; Console.WriteLine("Nilai variabel varByte: {0}", varByte); varByte = 255; Console.WriteLine("Nilai variabel varByte: {0}", varByte); ushort varUshort; varUshort = 0; Console.WriteLine("Nilai variabel varUshort: {0}", varUshort); varUshort = 65535; Console.WriteLine("Nilai variabel varUshort: {0}", varUshort); uint varUint; varUint = 0; Console.WriteLine("Nilai variabel varUint: {0}", varUint); varUint = 4294967295; Console.WriteLine("Nilai variabel varUint: {0}", varUint); ulong varUlong; varUlong = 0; Console.WriteLine("Nilai variabel varUlong: {0}", varUlong); varUlong = 18446744073709551615; Console.WriteLine("Nilai variabel varUlong: {0}", varUlong); } } }

Berkesperimenlah dengan mengganti nilai dari masing-masing variabel di atas dengan nilai di luar rentang variabel tersebut (Lihat rentang nilainya dari tabel tipe data bawaan di atas). Misalnya, beri nilai variabel varSbyte dengan angka -129 atau 128. Perhatikan apa yang terjadi.

Setelah itu, perhatikan kode program di bawah ini.

varLong = 9223372036854775807;

Menulis angka dengan jumlah digit yang terlalu banyak seperti di atas tentunya sangat susah untuk dibaca. Mulai C# 7.0, Anda bisa menggunakan fitur bernama digit separator untuk bilangan bulat. Sehingga, kode program di atas dapat ditulis seperti kode program di bawah ini.

varLong = 9_223_372_036_854_775_807;

Selanjutnya yang perlu diperhatikan adalah, sebuah angka bilangan bulat akan dievaluasi tipe datanya sesuai dengan tipe data yang bisa merepresentasikan nilainya, apakah nilainya masuk ke dalam kategori nilai bertipe data int, uint, long, atau ulong.

Untuk membantu compiler mengidentifikasi tipe dari sebuah nilai bilangan bulat, kita bisa memberi akhiran (suffix) pada sebuah bilangan bulat seperti U, L, atau UL.

Angka bilangan bulat tanpa akhiran akan diidentifikasi oleh compiler sebagai int, angka bilangan bulat dengan akhiran U, L, dan UL masing-masing akan diidentifikasi sebagai uint, long, dan ulong secara berurutan.

Tambahkan kode program di bawah ini ke dalam program ValueType. Coba pikirkan kenapa baris 5 sampai 7 menghasilkan eror!

uint ui = 1234U; long l = 1234L; ulong ul = 1234UL; int i1 = 1234U; int i2 = 1234L; int i3 = 1234UL;

Setelah berkesperimen dengan angka bilangan bulat, kali ini kita akan bereksperimen dengan angka bilangan desimal.

Tambahkan kode program di bawah ini ke dalam program ValueType yang sudah Anda buat sebelumnya.

double varDouble; varDouble = 17.5; Console.WriteLine("Nilai variabel varDouble: {0}", varDouble);

Sama seperti pada angka bilangan bulat, sebuah angka bilangan desimal juga bisa Anda beri sebuah akhiran. Anda bisa menambahkan akhiran “d” di belakang angka 17.5 seperti kode program di bawah ini untuk menegaskan bahwa angka 17.5 adalah angka bilangan desimal dengan tipe double.

Selanjutnya, tambahkan kode program di bawah ini.

float varFloat = 17.5; decimal varDecimal = 17.5; Console.WriteLine("Nilai variabel varFloat: {0}", varFloat); Console.WriteLine("Nilai variabel varDecimal: {0}", varDecimal);

Kode program di atas menghasilkan eror. Compiler tidak bisa mengkonversi angka desimal 17.5  ke tipe float maupun decimal secara implisit.

Jawabannya, angka 17.5 secara default diidentifikasi oleh compiler sebagai double. Nilai dengan tipe data double, tidak bisa dikonversi secara implisit baik ke tipe float maupun decimal. Oleh karena itu, menetapkan nilai 17.5 ke variabel dengan tipe data float dan decimal akan menghasilkan eror.

Agar Anda bisa menetapkan angka 17.5 ke variabel dengan tipe data float dan decimal, Anda perlu menambahkan akhiran pada angka 17.5 seperti pada kode program di bawah ini.

float varFloat = 17.5f; decimal varDecimal = 17.5M;

Untuk membantu compiler mengidentifikasi sebuah angkan bilangan desimal sebagai tipe float, Anda perlu menambahkan akhiran “f”. Sedangkan untuk tipe decimal, Anda perlu menambahkan akhiran “M”.

Apabila value type menyimpan nilai sebenarnya di dalam variabel yang dideklarasikan, reference type hanya menyimpan alamat yang menunjuk sebuah lokasi di mana nilai atau obyek sebenarnya disimpan.

Contohnya, ketika Anda membuat sebuah obyek dari class manusia bernama kadir. Variabel yang Anda deklarasikan tersebut hanya akan menyimpan alamat di mana obyek kadir ini sebenarnya berada. Sementara obyek kadir sendiri disimpan atau berada di lokasi yang berbeda.

Mengapa Anda harus menentukan tipe data saat mendeklarasikan variabel

Lalu kenapa obyek kadir ini tidak langsung dimasukkan ke dalam kardus daripada harus repot-repot melakukan referensi? Kebayang kan ukuran obyek kadir ini? Karena ukuran kadir terlalu besar untuk dimasukkan ke kardus, alternatifnya adalah menyimpan obyek kadir ini di dalam ruangan yang lebih besar.

Berbeda dengan value type yang tidak boleh dibiarkan kosong (bernilai null) pada saat digunakan, reference type dimungkinkan untuk bernilai null. Maksudnya, kita bisa menggunakan sebuah variabel dari tipe data yang termasuk reference type, meskipun variabel tersebut tidak menyimpan referensi alamat ke objek manapun.

Seperti yang sudah dijelaskan sebelumnya, class merupakan user-defined type. C# sendiri memiliki tipe referensi bawaan seperti object dan string yang bisa langsung kita gunakan tanpa harus mendefinisikannya sendiri.

Tipe data object bisa disebut sebagai super type. Hal itu dikarenakan semua tipe data diturunkan dari tipe object. Dengan demikian, tipe object dapat menampung semua jenis nilai dari tipe data apapun.

Untuk membuktikannya, tulis kode program di bawah ini, lalu jalankan.

object objInt = 25; Console.WriteLine("Nilai variabel objInt: {0}", objInt); object objDouble = 15.8; Console.WriteLine("Nilai variabel objDouble: {0}", objDouble); object objStr = "teks"; Console.WriteLine("Nilai variabel objStr: {0}", objStr);

Anda tidak akan menemukan eror apapun ketika menjalankan kode program di atas meskipun Anda menetapkan beberapa nilai dengan tipe yang berbeda ke dalam beberapa variabel dengan tipe data yang sama, yaitu object.

Agar komputer bisa mengenali sebuah entitas, Anda perlu mendefinisikan tipe data pada variabel yang Anda deklarasikan.

Tipe data sendiri bisa terdiri dari dua kategori, yaitu tipe nilai dan tipe referensi.

Variabel yang dideklarasikan dengan tipe nilai akan menyimpan nilai sebenarnya. Sedangkan yang dideklarasikan dengan tipe referensi, hanya akan menyimpan alamat di mana nilai yang sebenarnya disimpan.

C# sudah menyediakan beberapa tipe data yang bisa langsung Anda gunakan. Selain itu, Anda juga bisa mendefinisikan tipe data Anda sendiri.

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