belajar bahasa c sharp
TRANSCRIPT
Bab I: Pendahuluan
Apa itu C#
Bahasa C# adalah sebuah bahasa pemrograman modern yang bersifat general-purpose,
berorientasi objek, yang dapat digunakan untuk membuat program di atas arsitektur
Microsoft .NET Framework. Bahasa C# ini memiliki kemiripan dengan bahasa Java, C dan C++
(selengkapnya dapat dilihat pada Sejarah Bahasa C#).
Bahasa pemrograman ini dikembangkan oleh sebuah tim pengembang di Microsoft yang
dipimpin oleh Anders Hejlsberg, seorang yang telah lama malang melintang di dunia
pengembangan bahasa pemrograman karena memang ialah yang membuat Borland Turbo
Pascal, Borland Delphi, dan juga Microsoft J++.
Kini, C# telah distandarisasi oleh European Computer Manufacturer Association (ECMA) dan
juga International Organization for Standardization (ISO) dan telah menginjak versi 3.0 yang
mendukung beberapa fitur baru semacam Language Integrated Query (LINQ) dan lain-lainnya.
Sejarah perkembangan bahasa pemrograman C#
Sebelum tahun 1970-an (atau lebih lama), menggunakan komputer seperti saat ini—dari mulai
mengetik hingga main game komputer—merupakan sesuatu hal yang mustahil. Revolusi yang
terjadi di dalam dunia komputer membutuhkan dua tahap agar dapat sampai kepada zaman
seperti sekarang, yakni:
1. saat komputer dibangun untuk membantu para ilmuwan untuk menyelesaikan tugas-tugas
ilmiahnya, dan
2. turunnya harga komputer secara signifikan dan dapat digunakan oleh para pengguna
yang bukan programmer, yang berlangsung beberapa dekade setelah tahap pertama
selesai.
Pengguna awam komputer pun akhirnya "dilahirkan", dan sejak itu programmer dan pengguna
merupakan dua buah entitas yang sama sekali berbeda, dan kurang begitu dapat berkomunikasi
satu dengan lainnya.
Awal-awal pemrograman komputer digital
Komputer digital yang dapat diprogram pertama kali dibuat pada tahun 1930-an. Maksud dari
"komputer digital" di sini adalah bahwa komputer-komputer tersebut bekerja dengan
menggunakan angka-angka diskrit (yang memiliki batasan yang jelas), seperti halnya 0, 1, nilai π
(3.14159) dan nilai-nilai angka lainnya. Sementara itu, maksud dari "komputer yang dapat
diprogram" adalah komputer dapat melakukan operasi-operasi matematika dengan berdasarkan
instruksi-instruksi yang disebut dengan program. Untuk beberapa tahun semenjak itu, program-
program komputer ditulis di atas kertas yang dilubangi (disebut sebagai punched-card) atau
medium-medium lainnya. Akhirnya, perangkat fisik komputer pun disebut sebagai perangkat
keras (hardware), sementara instruksi-instruksi yang ditulis di atas punched card atau medium
lainnya dikenal dengan perangkat lunak (software). Dinamai "perangkat lunak", karena memang
memiliki sifat mudah diubah. Kita tidak harus membangun komputer secara keseluruhan untuk
melakukan jenis perhitungan yang berbeda. Sementara itu, perangkat keras didesain untuk
melakukan beberapa jenis operasi aritmetika dan logika. Operasi mana yang dapat dilakukan
oleh perangkat keras dan bagaimana urutan operasi tersebut, diatur oleh kode-kode program.
Pada saat program dijalankan, komputer juga disebut sedang "mengeksekusi program", yakni
saat komputer membaca kode dan melakukan instruksi yang disuruhkan kepadanya.
Untuk dekade-dekade awal perkembangan komputer digital, hubungan antara perangkat keras
dan perangkat lunak sangatlah erat. Setiap mesin memiliki instruksinya sendiri-sendiri yang
kadang tidak cocok dengan mesin lainnya. Untuk mentransfer sebuah program dari satu mesin ke
mesin lainnya yang lebih baru dan tentunya lebih cepat, program tersebut harus ditulis ulang
dengan semua kode-kodenya yang baru. Nah, kode-kode yang hanya dimiliki oleh mesin tertentu
ini dinamakan dengan kode mesin (machine code) atau bahasa mesin (machine language). Untuk
lebih cepat mengingat instruksi-instruksi dalam kode mesin, para desainer pun kemudian
membentuk sebuah cara dengan menyamakannya dengan sebuah kata tertentu (umumnya berupa
singkatan dalam bahasa Inggris), yang kemudian berevolusi menjadi bahasa rakitan atau
assembly language.
Munculnya bahasa pemrograman tingkat tinggi
Pada awal tahun 1950-an, para desainer pun mencoba untuk mendesain bahasa komputer yang
umum yang program hasilnya tidak hanya dapat berjalan di mesin-mesin tertentu saja.
Muncullah bahasa pemrograman tingkat tinggi atau high-level programming language.
Disebut demikian untuk membedakannya dengan kode mesin yang disebut sebagai bahasa
pemrograman tingkat rendah atau low-level programming language. Tren yang ada adalah
kemunculan beberapa bahasa pemrograman seperti FORTRAN, COBOL, BASIC, dan masih
banyak lagi yang lainnya. Beberapa bahasa pemrograman tersebut masih terus-terusan digunakan
hingga saat ini. Sebagai contoh, FORTRAN (akronim dari Formula Translator) masih sering
digunakan oleh para ilmuwan dan para insinyur bidang teknik; COBOL (akronim dari Common
Business-Oriented Language) juga sering digunakan dalam institusi-institusi finansial; dan
bahasa BASIC (akronim dari Beginner’s All-purpose Symbolic Instruction Code) juga masih
banyak digunakan hingga saat ini, meskipun terjadi perubahan yang sangat signifikan dari ketika
bahasa tersebut dipublikasikan pertama kali pada tahun 1963.
Program-program komputer yang dibangun dengan menggunakan bahasa FORTRAN, COBOL,
BASIC, atau bahasa tingkat tinggi lainnya pada dasarnya adalah berisi berkas teks yang terdiri
atas sekumpulan pernyataan yang ditulis di dalam bahasa pemrograman tertentu, dengan
beberapa peraturan sintaksis, semantik dan gramatika yang didefinisikan di dalam bahasa
pemrograman. Karena komputer hanya dapat menjalankan machine code, maka program yang
ditulis di dalam bahasa pemrograman tingkat tinggi harus terlebih dahulu diterjemahkan ke
dalam machine code sebelum dieksekusi. Proses penerjemahan ini dapat dilakukan baik itu
dengan menggunakan teknik translasi (alat bantunya disebut dengan translator), teknik
interpretasi (alat bantunya disebut interpreter), atau dengan menggunakan teknik kompilasi
(alat bantunya disebut dengan compiler). Teknik translasi merupakan teknik kuno yang
menerjemahkan keseluruhan kode bahasa pemrograman menjadi machine code; teknik kompilasi
merupakan evolusi dari teknik translasi di mana kode dalam bahasa pemrograman dipisah-pisah
ke dalam beberapa berkas untuk kemudian diterjemahkan dan dijadikan machine code,
sementara teknik interpretasi merupakan sebuah teknik di mana eksekusi dan translasi dilakukan
secara berbarengan (bersama-sama).
Bahasa pemrograman lainnya yang dikembangkan selama tahun 1950-an tapi sudah tidak
digunakan lagi adalah ALGOL (akronim dari Algorithmic Programming Language). ALGOL
memang sudah tidak digunakan lagi, tapi memberikan dampak yang signifikan untuk beberapa
bahasa pemrograman lainnya di dalam sejarah perkembangan bahasa pemrograman komputer.
ALGOL didesain pertama kali pada akhir tahun 1950-an oleh sebuah komite internasional, untuk
kemudian diperbaiki pada tahun 1960 dan 1968. Meskipun saat ini bahasa tersebut mati seolah
lenyap ditelan bumi, jiwanya masih hidup di dalam bahasa pemrograman tingkat tinggi yang
sekarang banyak digunakan, seperti Pascal, PL/1, dan Bahasa C.
Munculnya C
Bahasa C dilahirkan di Bell Telephone Laboratories (atau sering disebut sebagai Bell Labs
saja). Sulit membayangkan dunia modern saat ini jika tidak ada pengaruh dari Bell Labs. Pada
tahun 1947, transistor ditemukan di Bell Labs, dan juga sistem operasi yang sekarang banyak
digunakan di dalam komputer korporat (UNIX) juga dibuat di sana. Untuk beberapa tahun, ada
sebuah bahasa pemrograman yang sangat dekat dengan sistem operasi UNIX, yang disebut
dengan bahasa C, yang didesain oleh Dennis Ritchie dan Brian Kernighan. Mengapa disebut
hanya C saja? Bahasa C disebut demikian mengingat bahasa tersebut adalah turunan dari bahasa
B, dan bahasa B merupakan pemendekan dari Basic CPL, sementara CPL sendiri adalah sebuah
bahasa pemrograman yang merupakan singkatan dari Combined Programming Language.
Meskipun populer, bahasa C terkesan lebih rumit jika dibandingkan dengan bahasa
pemrograman lainnya, khususnya jika digunakan oleh para pemrogram pemula. Ketika ALGOL
dan banyak turunan ALGOL menggunakan kata-kata yang mudah diingat seperti BEGIN dan END
untuk membatasi sebuah seksi dalam instruksi program, bahasa C malah menggunakan tanda
kurung keriting ({ dan }). Beberapa operasi juga disederhanakan, bahkan banyak singkatannya
yang cukup membingungkan para programmer pemula. Contoh yang sering digunakan adalah
printf, dan scanf. Meskipun demikian, program-program yang ditulis dalam bahasa C
seringnya lebih efisien dibandingkan dengan bahasa pemrograman lainnya, yang artinya
program-program dalam bahasa C diterjemahkan ke dalam machine code dalam jumlah yang
relatif lebih sedikit jika dibandingkan dengan program yang ditulis dalam bahasa pemrograman
lainnya. Salah satu bagian yang paling canggih dari bahasa C adalah bahwa bahasa C memiliki
"pointer", selain tentunya "variabel" dan "konstanta". Istilah Pointer dalam bahasa pemrograman
merujuk kepada alamat-alamat memori yang mengizinkan para programmer untuk melakukan
beberapa tugas secara jauh lebih efisien, dengan melibatkan bit, byte, dan word memori .
Karenanya, banyak orang menyebut bahasa C sebagai "High-level Assembly language, atau
bahasa rakitan tingkat tinggi.
Meskipun bahasa C masih merupakan bahasa pemrograman yang populer, bahasa tersebut saat
ini dapat dikatakan telah "kadaluwarsa". Saat ini, bahasa tersebut diklasifikasikan ke dalam
"bahasa pemrograman prosedural tradisional" (traditional procedural programming language),
sebuah istilah yang merujuk kepada struktur program-program dalam bahasa C. Umumnya
sebuah program bahasa C terdiri atas banyak prosedur (juga sering disebut sebagai
fungsi/function atau subrutin/subroutine), yang setiap prosedur tersebut merupakan bagian dari
kode yang melakukan beberapa tugas tertentu atau merupakan implementasi dari algoritma
tertentu. Prosedur-prosedur tersebut dapat bekerja dengan data dalam beberapa cara. Data adalah
kumpulan angka atau teks atau bahkan gabungan antara keduanya. Dalam bahasa pemrograman
prosedural tradisional, kodelah yang memproses data menjadi output.
Munculnya C++
Akan tetapi akhir-akhir ini, banyak programmer cenderung memilih "bahasa pemrograman
berorientasi objek"—atau object oriented programming (OOP). Permulaan munculnya bahasa
pemrograman berorientasi objek sering diasosiasikan dengan munculnya bahasa Smalltalk,
sebuah bahasa pemrograman yang dikembangkan di Palo Alto Research Center (PARC), yang
merupakan sebuah laboratorium penelitian yang didirikan oleh Xerox Corporation. Selain
Smalltalk, PARC juga menelurkan banyak inovasi lainnya, seperti halnya mouse dan juga
antarmuka grafis (Graphical User Interface) yang pertama kali diimplementasikan di dalam
sistem Xerox Star, yang kemudian diadopsi oleh Apple Macintosh dan juga Microsoft Windows.
Dalam bahasa pemrograman berorientasi objek, para programmer tidaklah membuat prosedur,
tetapi mereka membuat kelas (class), dan dari kelas-kelas tersebut muncullah objek (object),
yang dapat berupa kode saja, data saja atau kombinasi dari kode dan data. Daripada
membuat prosedur-prosedur yang dikhususkan untuk bekerja dengan data, "data" dalam bahasa
pemrograman berorientasi objek memiliki perangkat untuk bekerja dengan dirinya sendiri,
sehingga dapat dikatakan data bisa memproses dirinya sendiri. Perubahan perspektif ini
membawa angin segar bagi para pemrogram, karena menulis satu buah kode yang dapat
digunakan dalam beberapa tugas pemrograman telah menjadi lebih mudah.
Akhirnya, beberapa programmer pun mencoba untuk menciptakan sebuah versi bahasa C yang
mendukung konsep bahasa pemrograman berorientasi objek. Dan, satu-satunya yang sangat
populer dari usaha mereka, lagi-lagi, adalah bahasa pemrograman yang dikembangkan di Bell
Laboratories pada tahun 1982 oleh Bjarne Stoustrup. Bahasa yang dikembangkannya kini
dikenal dengan bahasa C++ (dibaca C plus-plus), di mana nama tersebut merupakan "pelesetan",
karena dalam bahasa C dan turunannya dua buah tanda plus akan menambahkan 1 ke dalam
sebuah angka atau variabel. Akan tetapi, C++ juga memiliki masalahnya sendiri. Dalam teorinya,
C++ adalah bahasa C yang ditambahi dukungan konsep "berorientasi objek", sehingga C++
tidaklah menggantikan bahasa C.
Munculnya Java
Pada tahun 1992, Sun Microsystems membuat Java, sebuah bahasa pemrograman berorientasi
objek yang dibuat berbasiskan bahasa C, dengan perbedaan yang signifikan dari bahasa
pemrograman C++. Bahasa Java telah membersihkan beberapa sintaksis yang dianggap kurang
bagus yang terdapat di dalam bahasa C++ dan membuang beberapa hal yang “berbahaya” dari
bahasa C, tetapi tetap mempertahankan “kerumitan” yang ditawarkan oleh bahasa C.
Munculnya C#
Pada tahun 2000, Microsoft pun merilis bahasa C# (dibaca C Sharp), yang secara umum didesain
oleh Anders Hejlsberg, yang juga lagi-lagi melanjutkan penamaan yang diplesetkan. Simbol
pagar (#) yang digunakan dalam C#, secara sekilas terlihat seperti empat buah plus-plus yang
disusun sedemikian rupa. Selain itu, di dalam notasi musik, tanda pagar memang menunjukkan
nada yang lebih tinggi dibandingkan dengan nada yang tidak memiliki pagar—sehingga C# lebih
tinggi dibandingkan C.
Seperti halnya bahasa Java, bahasa C# telah membuang beberapa fitur berbahaya dari bahasa C.
Memang, pointer belum sepenuhnya "dicabut" dari C#, tapi sebagian besar pemrograman dengan
menggunakan bahasa C# tidak membutuhkan pointer secara ekstensif, seperti halnya C dan C++.
Persamaan lainnya antara Java dan C# mencakup peran dari kompiler. Biasanya, kompiler
menerjemahkan kode sumber (berkas teks yang berisi bahasa pemrograman tingkat tinggi) ke
dalam kode mesin. Kode mesin tersebut membentuk sebuah berkas yang dapat dieksekusi
(executable atau EXE), yang berupa sebuah berkas yang siap untuk dijalankan kapan saja secara
langsung oleh komputer. Tetapi, karena kode mesin hanya diasosiasikan dengan sebuah jenis
mesin tertentu saja, berkas yang dapat dieksekusi tersebut hanya dapat berjalan di atas satu jenis
komputer saja. Inilah sebabnya mengapa kita tidak dapat menjalankan secara langsung program
yang sama yang berjalan di atas sistem operasi Windows di atas sistem operasi GNU/Linux,
Apple Macintosh atau sistem operasi lainnya, dan begitu pula sebaliknya.
Alat bantu kompiler yang digunakan oleh C# tidak menerjemahkan kode sumber ke dalam kode
mesin, tetapi hanya menerjemahkan ke dalam sebuah bahasa perantara atau Intermediate
Language (disingkat menjadi IL), yang merupakan sebuah jenis kode mesin hanya saja telah
digeneralisasikan. Ketika kita hendak menjalankan program di atas sebuah mesin, maka IL akan
diterjemahkan ke dalam kode mesin secara keseluruhan. Dilihat dari perspektif pengguna, proses
translasi ini tidak terlihat. Tetapi, dalam teorinya, ternyata di balik itu terdapat proses dua
langkah rumit yang mengizinkan program dengan bahasa IL yang sama untuk berjalan di atas
mesin yang berbeda. Selain itu, sebuah program dalam bentuk IL dapat diuji lebih mudah oleh
sistem operasi dari keberadaan kode yang merusak atau kode yang mencurigakan. Kemampuan
ini telah menjadi lebih penting saat program tersebut dipertukarkan melalui jaringan publik,
seperti halnya Internet.
Bahasa C, C++, Java dan C# kini dikenal dengan sebutan "keluarga besar bahasa pemrograman
C" atau "bahasa pemrograman berbasis bahasa C". C++ mengandung semua hal yang dimiliki
oleh C tetapi memiliki fitur yang tidak dimiliki oleh C, sementara Java dan C# meskipun masih
berbasis bahasa C, keduanya tidaklah serta-merta merupakan pengganti dari bahasa C, dan antara
bahasa Java dan C# memiliki kesamaan dalam berbagai bidang, ketimbang mirip dengan bahasa
C++. Meskipun demikian, semuanya menggunakan banyak sintaksis yang mirip, seperti void,
int, struct, dan lain sebagainya.
Bab II: Operator, Variabel, dan Ekspresi
Operator Penugasan dan Variabel
Komputer pada awalnya memang dibuat untuk membantu manusia dalam melakukan kalkulasi
numerik, sehingga memang tidak mengejutkan bahwa bahasa pemrograman juga mengadopsi
beberapa elemen tertentu dari aljabar, termasuk di antaranya adalah penggunaan huruf atau kata
sebagai pengganti angka.
Berikut adalah contoh dari beberapa aljabar sederhana:
A = 3
B = 5
C = A + B
Bagi kita, persamaan di atas memang merupakan persamaan yang sama sekali tidak rumit, tetapi
jika kita dapat membujuk komputer untuk menyelesaikan persamaan di atas, maka kita juga
dapat membujuknya untuk menyelesaikan persamaan atau masalah lainnya yang jauh lebih
kompleks. Sebagai langkah pertama, kita akan mencoba untuk melakukan konversi aljabar di
atas ke dalam sintaksis di dalam bahasa C#, dan bentuknya kira-kira seperti di bawah ini:
A = 3;
B = 5;
C = A + B;
Tiga baris kode di atas, tidaklah membentuk program C# yang komplet, tapi contoh kode di atas
dapat ditemukan dalam program C#, mungkin program yang kita dapat buat sendiri. Kita bisa
menulis kode di atas dengan menggunakan beberapa editor teks (semacam notepad atau
WordPad) hingga menggunakan alat bantu khusus yang didesain untuk menyederhanakan
pemrograman dengan menggunakan bahasa C#, seperti [www.icsharpcode.net/OpenSource/SD
#develop (SharpDevelop)] maupun Microsoft Visual C# Express Edition (dapat di-download
secara gratis dari situs situs Web Microsoft Developer Network (MSDN) ). Setelah menuliskan
kode di atas, maka langkah selanjutnya yang harus kita lakukan adalah mengubah kode di atas ke
dalam bentuk berkas yang dapat dieksekusi (*.EXE) yang dapat kita jalankan.
Perbedaan yang signifikan antara bentuk pertama (aljabar) dan bentuk kedua (kode dalam bentuk
bahasa C#) adalah bahwa setiap baris di dalam bahasa C# selalu diakhiri dengan menggunakan
karakter titik koma (semicolon). Setiap baris yang diakhiri dengan karakter titik koma disebut
dengan pernyataan program C# (C# program statement). Sebuah program komputer yang
dibuat dengan menggunakan C# umumnya terdiri atas macam-macam statemen. Huruf A, B dan
C yang disebut di atas merupakan apa yang disebut sebagai variabel, dan setiap variabel
merepresentasikan lokasi di dalam memori di mana nilai dari variabel akan disimpan.
Bandingkan dengan aljabar dan bentuk statemen program C# di bawah ini:
A = 3;
B = 5;
C = A + B;
dan bentuk
A = 3;
C = A + B;
B = 5;
Sekilas, aljabar di atas terlihat sama dengan bentuk pertama dan kedua, dan hasil akhirnya adalah
C = 8. Akan tetapi, ketika diubah ke dalam bentuk statemen bahasa C#, hasilnya tidaklah sama,
karena hasil C = 3. Hal ini dikarenakan statemen-statemen program akan diproses secara
berurutan oleh komputer, baris demi baris. Komputer akan pertama-tama membaca nilai A = 3
seperti yang telah disebutkan pada baris pertama, dan langsung menjalankan baris kedua yang
berisi C = A + B. Karena nilai B pada saat baris kedua dijalankan belum memiliki nilai (alias
nilainya kosong), maka C = 3 + kosong, dan nilai dari C = 3. Meskipun statemen program
pada baris ketiga dijalankan, statemen tersebut tidak akan dapat mempengaruhi nilai C yang
telah ditetapkan pada baris kedua.
Tanda sama dengan (=) dalam C#, berbeda dengan tanda sama dengan (=) dalam aljabar. Jika
dalam aljabar tanda tersebut berarti persamaan dan kesetaraan, maka dalam C# berarti
penugasan, atau lebih tepatnya berfungsi sebagai operator penugasan (assignment operator).
Operator adalah simbol atau kata yang singkat yang mampu menyuruh komputer untuk
melakukan sesuatu, yakni untuk melakukan operasi. Setiap operator dapat memiliki apa yang
dinamakan dengan operand, dan operator penugasan memiliki dua buah operand, yaitu sebuah
variabel yang diletakkan di sebelah kiri tanda sama dengan dan operasi yang harus dilakukan
yang diletakkan di sebelah kanan tanda sama dengan. Operator penugasan seperti itu akan
menyebabkan variabel yang terletak di sebelah kiri tanda akan diberikan nilai yang diperoleh
dari hasil perhitungan dari ekspresi-ekspresi yang diletakkan di sebelah kanan operator. Dalam
statemen program C# di atas, memang hanya disebutkan mengenai operator penugasan, tetapi di
dalam bahasa C#, terdapat banyak jenis operator (yang nanti akan dibahas).
Operator penugasan dapat memiliki beberapa bentuk. Semua statemen-statemen di bawah ini
adalah benar, menurut bahasa C#:
C = A + 5;
C = 90 + A + B;
C = B + A + A + B + A + B + 49;
C = 81 + 90;
Dalam setiap kasus di atas, sebuah variabel yang diletakkan di sebelah kiri tanda sama dengan
akan diberi nilai dengan ekspresi yang dievaluasi yang diletakkan pada bagian sebelah kanan.
Tanda plus di sana merupakan contoh dari operator aritmetika, yang berarti penjumlahan. Seperti
halnya di dalam aljabar yang memiliki penjumlahan, perkalian dan pembagian, C# juga
memilikinya dan mengizinkan kita untuk melakukannya.
Perhatikan jenis kode di bawah ini:
B + 1 = 2;
Sekilas, menurut aljabar, statemen di atas merupakan statemen yang benar adanya dan valid.
Akan tetapi, tidak bagi C#, karena C# hanya mengizinkan sebelah kiri tanda sama dengan
sebagai tempat diletakkannya variabel, bukan tempat diletakkannya ekspresi.
Perhatikan juga kode di bawah ini:
C = C + 10;
Kira-kira, berapa nilai dari C? Meskipun statemen di atas terlihat "tidak masuk akal" dalam
aljabar, di dalam C# hal tersebut valid adanya. Dalam C#, pernyataan di atas akan menambahkan
5 dari nilai variabel C. Jika C diberi nilai 20 sebelum statemen di atas, maka nilai akhir dari C
adalah 30 setelah statemen tersebut dijalankan.
Pernyataan-pernyataan yang telah dituliskan di atas sejauh ini mengandung beberapa elemen,
yakni variabel, operator penugasan, tanda penjumlahan, angka-angka dan juga tanda titik koma.
Angka-angka, di dalam C#, seperti 3 dan 5, disebut dengan literal numerik, yang diklasifikasikan
ke dalam beberapa jenis tergantung seberapa jauh daya jangkaunya (range) dan seberapa tinggi
ketelitiannya (precision). Angka-angka semacam 3 dan 5 merupakan contoh dari literal integer,
karena memang angka 3 dan angka 5 merupakan bilangan bulat yang tidak memiliki koma,
pecahan, dan juga pangkat. Bagaimana dengan bilangan bulat negatif? Ya, kita juga bisa
memasukkan bilangan bulat negatif dalam C# dengan menggunakan tanda minus, seperti kode di
bawah ini.
C = -20;
Lalu, bagaimana kita memasukkan nilai bilangan bulat yang besar (jutaan atau miliaran)?
Apakah dengan menggunakan koma atau titik sebagai pemisah antar angka? Bahasa C# tidak
mengizinkan kita untuk menuliskan koma dan titik untuk merepresentasikan angka yang besar,
apalagi hanya digunakan sebagai pemisah antar angka. Statemen di bawah ini tidaklah valid
menurut C#:
Z = 123,456,789;
Akan tetapi, tuliskan seperti di bawah ini:
Z = 123456789;
Kenapa huruf-huruf di atas (A, B, C, dan Z) disebut variabel? Huruf-huruf di atas disebut variabel
karena nilai yang bisa dikandungnya dapat bervariasi. Berikut ini adalah contoh statemen yang
akan mendemonstrasikan bagaimana nilai dari variabel dapat berubah:
A = 3;
B = 2;
C = A + B;
B = 10;
C = A + B;
Setelah baris ketiga dijalankan oleh komputer, nilai C adalah 5. Setelah baris kelima dijalankan
oleh komputer, nilai C adalah 13, bukannya 5 lagi. Dalam pemrograman, bisa saja variabel
berubah secara dengan banyak sekali perubahan ketika program tersebut dijalankan. Sebagai
contoh, sebuah variabel mungkin memang telah ditetapkan sebagai tempat penyimpanan nama
siswa, tetapi ketika program dijalankan program tersebut akan mengisi variabel tersebut dengan
nama siswa, yang berjumlah lebih dari satu, karena program tersebut disuruh untuk menangani
puluhan, ratusan, atau bahkan ribuan nama santri. Karenanya, untuk menghindari kebingungan
antara pemrograman dan aljabar, para programmer seringnya menyebut tanda sama dengan
sebutan "C akan mendapatkan A ditambah B", atau "Nilai C akan diisi dengan nilai A
yang ditambah dengan B." Beberapa programmer mungkin menyebutnya dengan sebutan
yang lebih mudah, seperti "A ditambah B akan dimasukkan ke dalam C."
Penggunaan titik koma
Penggunaan tanda titik koma di dalam bahasa C# pada akhir statemen program merupakan
sebuah cara yang sangat umum dilakukan oleh bahasa-bahasa pemrograman yang diturunkan
dari bahasa ALGOL. Penggunaan tanda titik dua tersebut dilakukan karena C# mengizinkan kode
agar ditulis dalam bentuk yang bebas. Dalam C#, kita tidak perlu menulis kode dalam baris-baris
yang terlihat "bagus." Kita bisa saja menulis kode di atas dengan menggunakan cara seperti di
bawah ini:
A = 3; B = 2; C = A + B;
Atau, kita juga bisa menggunakan bentuk seperti di bawah ini, meski terlihat acak-acakan:
A = 3 ;B
= 2; C = A
+ B;
Meski terlihat acak-acakan oleh kita, komputer tidak akan kebingungan untuk memprosesnya,
tanpa ada keluhan. Komputer akan membedakan baris-baris kode statemen program dengan
menggunakan karakter titik dua, tidak peduli apakah sebuah baris tersebut dibagi ke dalam
banyak baris terpecah-pecah, atau baris yang digabungkan dalam satu baris yang terlihat "rapi."
Penggunaan spasi, dan baris baru di dalam program, dalam C# umumnya dikenal dengan sebutan
White Space (ruangan putih). Para programmer sering menggunakan white space untuk membuat
kode mereka terlihat lebih rapi. Sebagai contoh, saya akan menggunakan white space untuk
membedakan antara variabel, operand, dan ekspresinya, seperti di bawah ini:
A = 3;
B = 2;
C = A + B;
Meski kode di atas terlihat lebih rapi, kita tidak mesti melakukannya.
Penamaan Variabel
Meski A, B, C, dan Z adalah sebuah nama yang enak dibaca untuk nama-nama variabel, kita bisa
membuat variabel dengan nama-nama yang lebih enak untuk diingat, seperti:
variabel1 = 3;
Variabel1 = 2;
variAbel1 = variabel1 + Variabel1;
Bahasa C# merupakan bahasa pemrograman yang bersifat case-sensitive, artinya kita dapat
menggunakan karakter kapital (A sampai Z) dan huruf ordinal (a sampai z) sebagai nama
variabel, tapi memang harus ada konsistensi. Variabel1, variabel1 dan variAbel1 tidaklah
sama! Tiga variabel di atas adalah tiga variabel yang berbeda di dalam C#, meskipun dalam
beberapa bahasa seperti Pascal dan Visual Basic, merupakan variabel yang sama. Untuk
meminimalisasi tingkat kebingungan yang kita alami, kita bisa menghindari penggunaan nama
variabel yang sama tetapi berbeda huruf kapital dan ordinalnya.
Peraturan untuk membuat nama-nama variabel di dalam C# lebih kompleks dibandingkan dalam
bahasa C, C++, atau Java, karena C# mendukung penggunaan karakter-karakter di luar karakter
Latin, seperti Cyrillic, Arab, dan juga Yunani. Kita bisa saja menggunakan aksara Yunani
sebagai nama variabel seperti di bawah ini:
π = 3.14;
Ω = 4.13;
Untuk aksara-aksara yang dapat diketik dengan mudah dengan menggunakan keyboard, C#
menawarkan beberapa peraturan dalam pemberian nama kepada variabel, yakni sebagai berikut:
Nama-nama variabel harus dimulai dengan menggunakan sebuah huruf atau karakter
garis bawah (underscore).
Nama-nama variabel harus mengandung hanya huruf (A - Z, a - z), angka (0 - 9), dan
karakter garis bawah (underscore).
Gampang kan? Sebuah nama variabel memang dapat mengandung angka (seperti halnya
Variabel1 yang telah digunakan di atas), akan tetapi ia tidak dapat dimulai dengan angka. Jika
memang dimulai dengan angka, maka C# akan menerjemahkannya sebagai literal numerik,
bukannya sebuah variabel. Nama-nama variabel juga tidak boleh mengandung spasi atau tanda
baca selain karakter garis bawah (underscore). Untuk variabel yang menggunakan banyak kata
di dalamnya, para programmer sering menggunakan karakter underscore untuk memisahkan
kata-kata tersebut:
jumlah_siswa=4120;
Atau, mereka juga bisa menggunakan campuran antara huruf besar dan huruf kecil, seperti di
bawah ini:
JumlahSiswa=4120;
Kata kunci (keyword) C#
Meski demikian, ada beberapa kata yang tidak dapat digunakan sebagai nama-nama variabel.
Kata-kata tersebut, dinamakan dengan C# Keyword (kata kunci C#), yang memang direservasikan
oleh C#. Kira-kira ada 87 buah keyword yang terdapat di dalam C# yang tidak bisa digunakan di dalam
melakukan penamaan variabel.
abstract as base bool break
byte case catch char checked
class const continue decimal default
delegate do double else enum
event explicit extern false finally
fixed float for foreach goto
if implicit in int interface
internal is lock long namespace
new null object operator out
override params private protected public
readonly ref return sbyte sealed
short sizeof stackalloc static string
struct switch this throw true
try typeof uint ulong unchecked
unsafe ushort using virtual void
volatile while add alias get
global partial remove set value
where yield
Sebagian besar programmer menggunakan nama-nama variabel yang lebih memiliki makna
dalam berbagai hal. Mungkin, orang lain selain kita akan membaca program yang kita buat, atau
memang kita akan membaca kembali program yang kita buat, setelah beberapa lama kita tidak
membukanya. Kita akan mendapatkan manfaat yang sangat besar, ketika kita memang menulis
variabel dengan nama-nama yang memberitahukan apa maksud dari setiap variabel tersebut.
BayaranSMP = 350000;
BayaranSMA = 450000;
BayaranSD = 150000;
Meski statemen di atas kelihatan lebih panjang, jelas kita lebih mudah memahaminya
dibandingkan dengan menggunakan huruf A, B, C atau Z sebagai nama variabel. Kalau memang
kita malas mengetik nama variabel yang panjang, kita bisa menggunakan singkatan-singkatan
yang meskipun singkat tetap menunjukkan kejelasan, sebagai berikut:
ByrSMP = 350000;
ByrSMA = 450000;
ByrSD = 150000;
Meskipun memang bagi manusia statemen-statemen di atas terlihat sudah sempurna, bagi
kompiler C#, statemen di atas tidaklah sempurna, karena memang statemen-statemen di atas
hanyalah berisi ekspresi saja. Kompiler membutuhkan tambahan informasi untuk memulainya,
yang dibahas pada bagian berikutnya.
Hungarian Notation
Terus, bagaimana dong cara menamai variabel yang baik? Saya bilang di atas memang kita harus
menggunakan nama variabel yang jauh lebih memiliki makna dalam berbagai hal dibandingkan
dengan huruf-huruf seperti A, B dan Z. Banyak programmer cenderung menambahkan tambahan
tipe data dari variabel tersebut, meskipun hanya singkatan dari nama tipe data tersebut sehingga
ia akan tahu apa tipe data dari variabel tersebut, apakah itu integer, decimal, string, atau tipe
data lainnya.
Salah satu konvensi penamaan yang sering digunakan adalah sebuah konvensi yang dikenal
dengan sebutan Hungarian Notation, yang dibuat oleh seorang programmer legendaris di
Microsoft yang berasal dari Hongaria, Charles Simonyi (yang juga merupakan pembuat
Microsoft Word dan Excel). Charles Simonyi yang dilahirkan di Budapest, Hongaria, membuat
jenis notasi ini pada tesis doktoralnya di bidang Ilmu Komputer. Karena memang Simonyi juga
merupakan programmer yang menjadi rujukan dan legenda, hampir semua nama di dalam sistem
operasi Windows (terutama API Microsoft Windows) menggunakan skema notasi ini.
Memang ada pro dan kontra mengenai Hungarian Notation ini. Kalau nggak percaya gunakan
saja Google atau di Wikipedia dan cari mengenai "Hungarian Notation". Anda akan menemukan
banyak pro dan kontra.
Dalam bentuknya yang paling sederhana, Hungarian Notation mengandung awalan dalam huruf kecil
yang menyatakan tipe data dari variabel tersebut. Oke deh saya akan menuliskan tabelnya di bawah ini.
Tipe data Prefiks
byte by
sbyte sb
ushort us
short s
int i
uint ui
long l
ulong ul
decimal
m
atau
dec
string str
float fl
char ch
bool b
double
d
atau
dbl
array arr
Sebagai contoh, saat kita melihat ada sebuah variabel dengan nama strNamaSiswa, maka kita
akan melihatnya sebagai sebuah variabel bertipe data string. Dan lain sebagainya.
Jenis-jenis Variabel Bilangan
Sebelum kita dapat menggunakan variabel tertentu di dalam program C#, kita harus memberi
tahu kepada kompiler mengenai jenis variabel itu sendiri. Dilihat dari contoh-contoh di atas, kita
melihat bahwa semua variabel adalah berisi angka. Akan tetapi, komputer tidak hanya
memproses angka saja, akan tetapi, selain angka variabel juga mampu menyimpan banyak sekali
tipe data. Bahkan, untuk jenis angka, C# mendukung tiga buah jenis:
Ketika kita sedang menulis sebuah program, yang mengharuskan di sana bilangan yang
tidak boleh dibagi (bilangan bulat), seperti halnya populasi siswa di sebuah sekolah, atau
lain-lain, C# menawarkan kepada kita apa yang disebut sebagai "integer." Mustahil kan
ada siswa hidup yang hanya ada badannya saja, atau tangannya saja?
Ketika kita sedang menulis sebuah program yang menangani masalah keuangan (yang
sering digunakan di dalam industri), kita harus menggunakan angka-angka dengan
jumlah angka yang panjang, mungkin mencapai triliunan. Bahasa C# menawarkan
kepada kita apa yang disebut sebagai "decimal."
Ketika kita sedang menulis sebuah program yang digunakan untuk menghitung hal-hal
yang ilmiah, seperti rumus relativitas dan fisika kuantum, mungkin kita membutuhkan
bilangan yang berkoma dan berpangkat yang direpresentasikan dalam bentuk notasi
ilmiah (mantissa dan exponent). Dalam C#, bilangan seperti itu dinamakan juga dengan
floating point number, yang direpresentasikan dengan menggunakan kata kunci "float."
Kita bisa menggabungkan tiga buah jenis bilangan di atas di dalam sebuah program. Untuk
sekarang, kita akan mempelajari mengenai bilangan bulat (integer), yang dapat berupa bilangan
bulat positif atau bilangan bulat negatif.
Deklarasi Variabel
Kita dapat menginformasikan kepada kompiler mengenai jenis variabel tertentu pada saat
mendeklarasikan variabel, dengan menggunakan pernyataan deklarasi (declaration statement).
Dalam pernyataan deklarasi, kita harus menentukan jenis dari variabel yang kita buat. Sebuah
variabel tertentu hanya dapat dideklarasikan satu kali saja, tidak lebih! Bahasa C#, seperti
halnya Bahasa C dan C++ atau Java, menggunakan kata int untuk merujuk kepada bilangan
bulat (integer). Baris berikut merupakan contoh pendeklarasian variabel bertipe data bilangan
bulat (dengan nama JumlahHariIzin):
int JumlahHariIzin;
Pernyataan deklarasi akan menentukan jenis variabel tersebut, yang harus berada di sebelah kiri
nama variabel yang sedang dideklarasikan. Kita mungkin bisa menyebut pernyataan di atas
dengan sebutan "Variabel JumlahHariIzin hanya bisa menampung bilangan bulat."
Seperti yang telah dijelaskan, bahwa kata int tidaklah bisa digunakan sebagai nama variabel,
akan tetapi harus diingat, karena C# merupakan sebuah bahasa yang bersifat case-sensitive, kita
bisa menggunakan kata Int, iNT, atau INT sebagai nama variabel.
Saat program C# dijalankan, pernyataan deklarasi tersebut akan menyebabkan komputer untuk
mengalokasikan sebagian kecil dari memori untuk ditempati oleh nilai dari variabel yang
dideklarasikan tersebut, jika memang variabel tersebut telah berisi nilai. Jika memang belum
berisi nilai, maka nilainya adalah kosong.
int JumlahHariIzin;
int JumlahHariAlfa;
int JumlahHariSakit;
int TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariAlfa = 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
Baris kelima (yang kosong) tidaklah harus ada, karena memang saya membuatnya untuk
membuat program C# kita lebih enak untuk dilihat, dan juga untuk membedakan antara deklarasi
variabel dengan pemberian nilai terhadapnya.
Daripada membuat empat baris seperti di atas, kita juga bisa mendeklarasikannya dengan
menggunakan satu baris saja, seperti:
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit, TotalAbsensi;
Meski lebih sederhana dilihat, bentuk di atas ekuivalen dengan bentuk empat baris di atas. Ketika
ada variabel lebih dari satu dideklarasikan pada satu baris deklarasi, kita harus menggunakan
koma untuk memisahkan antar variabel. Selain itu, semua variabel yang dideklarasikan harus
memiliki tipe data yang sama. Ada beberapa cara untuk menulis deklarasi variabel. Variabel-
variabel tersebut tidaklah harus dideklarasikan dengan urutan yang sama dengan ketika kita
memanggilnya. Kode-kode seperti di bawah ini adalah ekuivalen dengan bentuk di atas:
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit, TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariAlfa = 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
Kita juga bisa mendeklarasikan beberapa variabel secara berbarengan di dalam sebuah statemen
deklarasi, dan mendeklarasikan variabel lainnya di dalam pernyataannya sendiri-sendiri:
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit;
int TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariAlfa = 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
Kita juga bisa mendeklarasikan variabel ketika kita membutuhkannya, seperti di bawah ini:
int JumlahHariIzin;
JumlahHariIzin = 10;
int JumlahHariAlfa;
JumlahHariAlfa = 2;
int JumlahHariSakit;
JumlahHariSakit = 10;
int TotalAbsensi;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
Nah, di sinilah perbedaan antara pernyataan deklarasi variabel dan pemberian nilai terhadapnya.
Satu-satunya peraturan yang harus ditaati adalah, bahwa "setiap variabel harus dideklarasikan
sebelum variabel tersebut digunakan."
Kita juga bisa mendeklarasikan variabel dengan sebuah nilai yang telah ditetapkan untuknya
pada saat mendeklarasikannya. Mungkin, pada awalnya, kita melihat bahwa kode di bawah ini
merupakan sebuah pernyataan penugasan, tetapi sebenarnya statemen deklarasi:
int JumlahHariIzin = 10;
Inisialisasi variabel
Pada saat sebuah variabel diberi nilai pada saat deklarasinya, maka variabel tersebut dikatakan
"melakukan inisialisasi" (initialization). Tentu saja, setelah inisialisasi dilakukan, kita bisa
mengubah nilainya dengan nilai yang berbeda di lain waktu, karena memang tidak ada bedanya
antara melakukan inisialisasi variabel pada saat deklarasi di dalam pernyataan deklarasi dengan
menetapkan sebuah nilai kepada sebuah variabel sesaat setelah pernyataan deklarasi dilakukan.
int JumlahHariIzin;
JumlahHariIzin = 10;
Antara saat sebuah variabel dideklarasikan dan saat variabel tersebut memiliki nilai, variabel
tersebut dikatakan sedang "dibongkar" atau mengalami "uninitialization." Variabel tersebut
tidaklah memiliki nilai, atau bahkan ia mungkin memiliki beberapa nilai yang acak. Kompiler C#
tidak akan mengizinkan kita untuk menggunakan variabel yang belum diinisialisasi. Sebagai
contoh, perhatikan pernyataan-pernyataan berikut
int JumlahHariIzin;
int JumlahHariAlfa;
int JumlahHariSakit;
int TotalAbsensi;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
Mengingat variabel-variabel JumlahHariIzin, JumlahHariAlfa, dan JumlahHariSakit belum
diberi nilai, sehingga kita tidak dapat menggunakannya untuk menghitung nilai TotalAbsensi.
Pada pernyataan deklarasi satu baris, kita dapat memilih untuk melakukan inisialisasi terhadap
beberapa variabel untuk tidak melakukannya pada beberapa variabel, dengan memisahkan setiap
variabel dengan menggunakan karakter koma, seperti di bawah ini:
int JumlahHariIzin = 10, JumlahHariAlfa, JumlahHariSakit, TotalAbsensi;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
Kita juga bahkan bisa memberikan nilai terhadap semua variabel secara sekaligus pada saat
melakukan deklarasi variabel, seperti di bawah ini:
int JumlahHariIzin = 10, JumlahHariAlfa = 2, JumlahHariSakit = 10,
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
Inisialisasi yang dilakukan terhadap variabel TotalAbsensi dilakukan dengan menggunakan
ekspresi yang melibatkan tiga variabel lainnya yang telah diinisialisasikan sebelumnya. Pada
kasus ini, variabel TotalAbsensi harus dideklarasikan dan diinisialisasi setelah variabel-variabel
JumlahHariIzin, JumlahHariAlfa, dan JumlahHariSakit dideklarasikan dan diinisialisasikan.
Meskipun bentuk di atas lebih sederhana, pernyataan-pernyataan di atas lebih rumit untuk
dibaca, apalagi oleh orang selain kita. Maka, pada umumnya para programmer menggunakan
cara konvensional, dengan memisahkan deklarasi dan inisialisasi setiap variabel pada satu baris
masing-masing, sebagai berikut agar lebih jelas:
int JumlahHariIzin=10;
int JumlahHariAlfa=2;
int JumlahHariSakit=10;
int TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
Method (metode)
Sampai di sini, apakah program C# di atas merupakan kode yang lengkap? Sayangnya, belum!
Dalam C#, seperti halnya di dalam sebagian besar bahasa pemrograman modern lainnya, kode
disusun sedemikian rupa ke dalam satuan yang disebut dengan kelas (class) dan metode
(method). Setiap metode mengandung kode yang mampu melakukan beberapa tugas tertentu.
Mungkin, jika Anda pernah mempelajari bahasa pemrograman lainnya, istilah metode ini
ekuivalen dengan prosedur (procedure), subrutin (subroutine) atau fungsi (function). Metode-
metode yang saling berhubungan dapat dikelompokkan ke dalam sebuah kelas.
Program paling sederhana di dalam C# adalah program yang hanya memiliki satu buah kelas
yang mengandung satu buah metode. Paling tidak, sebuah program dalam C# harus memiliki
sebuah metode yang disebut dengan Main(). Metode Main() merupakan sebuah metode yang
selalu dijalankan oleh komputer pertama kali ketika program tersebut dijalankan oleh pengguna.
Jika Anda pernah mempelajari bahasa pemrograman lain sebelumnya, mungkin Anda pernah
mengenal istilah "Entry Point". Metode Main() adalah Entry Point di dalam C#! Untuk program-
program yang sangat pendek, metode Main() kadang-kadang merupakan metode yang terdapat
di dalam program yang bersangkutan. Meskipun Main memiliki peranan yang sangat besar di
dalam bahasa C#, kata "Main" sendiri bukanlah kata kunci di dalam C#. Karena bukan kata
kunci, maka kita bisa memberikan nama variabel menjadi Main, jika mau.
Bagaimana mendeklarasikan metode?
Seperti halnya variabel, Main harus dideklarasikan di dalam program. Pendeklarasian metode
memang sedikit lebih rumit dibandingkan dengan pendeklarasian variabel, karena memang ada
beberapa hal yang terlibat di dalamnya.
Metode pada umumnya memiliki input dan output. Sebagai contoh, sebuah metode yang
menghitung jumlah absensi siswa, inputnya adalah jumlah harian di mana siswa yang
bersangkutan tidak masuk kelas, dan outputnya adalah total jumlah absensi milik siswa tersebut.
Metode dapat kita bayangkan sebagai sebuah "pabrik" yang mengubah bahan baku menjadi
barang jadi. Pada umumnya, sebuah metode menerima input dalam bentuk beberapa variabel,
yang disebut sebagai parameter metode (method parameter). Nah, metode tersebut kemudian
akan mengubah variabel-variabel tersebut sedemikian rupa lalu mengeluarkan hasilnya sebagai
output, yang disebut nilai kembalian (return value). Kita saat ini akan membahas bagaimana
mendeklarasikan sebuah metode sederhana, yang selalu ada di dalam setiap program C#, Main,
tanpa penggunaan parameter dan nilai kembalian. Sedangkan bagaimana penggunaan parameter
dan nilai kembaliannya nanti akan dibahas kemudian.
Main
Perlu diingat, karena bahasa C# merupakan sebuah bahasa pemrograman yang bersifat case-
sensitive, maka antara Main, MAIN, dan main adalah berbeda. Metode Main harus dimulai dengan
huruf M besar. Normalnya, parameter metode diindikasikan dengan sebuah daftar variabel yang
dikurung di dalam sepasang tanda kurung buka ( dan tanda kurung tutup ) setelah nama metode
tersebut dideklarasikan. Karena versi metode Main kita kali ini tidak memiliki parameter dan
juga nilai kembaliannya, maka kata "Main" akan diikuti dengan menggunakan tanda kurung buka
dan kurung tutup tanpa isi, seperti di bawah ini:
Main()
Saat sebuah metode memiliki nilai kembalian, tipe data dari nilai tersebut (seperti halnya int)
harus ditambahkan di sebelah kiri nama metode pada saat deklarasi metode. Akan tetapi, saat
metode tersebut tidak memiliki nilai kembalian, maka kita harus menggunakan kata kunci void
untuk menyatakan bahwa metode tersebut memang tidak memiliki nilai kembalian.
void Main()
Lantas, apa bedanya pendeklarasian variabel dengan pendeklarasian metode? Secara sekilas
memang tidak ada perbedaan antara pendeklarasian variabel dengan pendeklarasian metode.
Akan tetapi, jika pada pendeklarasian variabel, jenis variabel adalah hal yang ditulis sebelum
nama variabel, pada pendeklarasian metode, jenis nilai kembalian adalah hal yang ditulis
sebelum nama metode. Di situ adalah perbedaannya! Apakah dengan menggunakan void
Main() sudah membentuk sebuah metode yang sempurna? Masih belum! Kita harus
menambahkan kata kunci static, seperti di bawah ini:
static void Main()
Buat apa sih kata kunci static? Untuk menjawabnya, sayangnya, hal tersebut melibatkan
beberapa konsep yang berada di luar jangkauan konsep dasar (karena memang bab ini
merupakan bab yang dikhususkan untuk pengenalan konsep dasar maka hal tersebut tidak akan
dibahas saat ini). Untuk sekarang, kita bisa memikirkan kata kunci static sebagai pernyataan
bahwa metode tersebut berdiri sendiri (mandiri), dan bersifat tetap serta tidak berubah-ubah
selama eksekusi program dilakukan. Deklarasi sebuah metode juga memasukkan tubuh metode
tersebut, yang merupakan kode aktual yang membangun metode tersebut. Tubuh metode akan
diapit dengan menggunakan sepasang tanda kurung keriting buka { dan tanda kurung keriting
tutup } yang mengikuti daftar parameter, seperti di bawah ini:
static void Main()
{
}
Saya memang meletakkan tanda kurung keriting dalam dua baris berbeda, karena memang hal itu
merupakan suka-suka! Karena C# merupakan bahasa dengan bentuk penulisan yang bebas, kita
juga bisa menuliskannya di dalam baris yang sama, seperti:
static void Main()
{}
atau:
static void Main(){}
Nah, sekarang kita bisa menambahkan kode-kode dan algoritma ke dalam metode tersebut.
Marilah kita mencoba memasukkan pernyataan-pernyataan sebelumnya ke dalam metode Main:
static void Main()
{
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit;
int TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariAlfa= 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
}
Sekelompok statemen-statemen C# yang diapit dengan menggunakan kurung keriting seperti di
atas kadang disebut sebagai blok program (program block). Sehingga, jika kita mengambil
kaidah dari contoh di atas, kita bisa merumuskan bahwa dalam pendeklarasian metode, terdapat
beberapa hal yang terlibat, mulai dari modifier (yang dinyatakan dengan kata kunci static),
jenis nilai kembaliannya (yang dinyatakan dengan kata kunci void), nama metodenya (Main),
daftar parameter yang berada di dalam kurung (), dan juga blok program yang mengandung kode
program dalam bahasa C#. Sebagian besar programmer menulis program tidak seperti di atas,
tetapi menjorokkan ke dalam satu tabulasi, seperti di bawah ini:
static void Main()
{
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit;
int TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariAlfa= 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
}
Apa yang dilakukan programmer di atas terhadap blok kode C# membuat metode tersebut
terlihat lebih mudah untuk dibaca, dan juga menandakan bahwa pernyataan-pernyataan tersebut
berada di dalam metode. Penggunaan berapa banyak spasi atau tabulasi adalah "terserah Anda!",
meskipun memang sebagian besar programmer menggunakan 1 tabulasi. Microsoft Visual
Studio dan Microsoft Visual C# Express Edition, pada kondisi bakunya memiliki konfigurasi 1
tabulasi setara dengan 4 spasi (Anda bisa mengubahnya lho). Sementara itu, kode yang ada di
buku ini menggunakan empat buah spasi. Beberapa programmer juga sering menulis kurung
keriting buka pada baris yang sama dengan deklarasi metode, seperti:
static void Main(){
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit;
int TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariAlfa= 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
}
Banyak programmer yang familier dengan bahasa Pascal, C dan C++ menggunakan bentuk
kode seperti di bawah ini:
static void Main()
{
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit;
int TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariAlfa= 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
}
Atau, mereka juga sering menggunakan dua spasi untuk menjorokkan blok kode, seperti di
bawah ini:
static void Main()
{
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit;
int TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariAlfa= 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
}
Cara apapun yang kita gunakan dalam mengetik blok kode C#, kompiler C# tidak akan melihat
bagaimana gaya kita menjorokkan blok kode. Terserah Anda mau menulis seperti apa, asalkan
memang ada konsistensi dalam menulis kode, agar mata yang melihat tidak “capek”.
Kelas (class)
Sudah sampai di sini, apakah kode di atas bisa dibilang lengkap? Sayangnya, masih belum
lengkap! Di dalam C#, semua metode harus tergabung ke dalam sebuah kelas program (class)
atau struktur program (structure). Kelas dan struktur agak-agak mirip, sehingga, sampai kita
belajar letak perbedaan di antara keduanya, anggap saja bahwa kelas dan struktur adalah sama,
dan apa yang saya bilang mengenai kelas juga bisa diaplikasikan ke dalam struktur.
Dalam pemrograman berorientasi objek seperti halnya C#, sebuah kelas adalah unit organisasi
dasar yang terdiri atas kode dan data. Semuanya akan tersibak ketika kita terus belajar
mengikuti rentetan artikel di dalam kumpulan artikel ini. Hanya saja, yang perlu diingat adalah
sebuah program C# paling tidak haruslah terdiri atas satu kelas atau lebih, yang setiap
kelasnya bisa berisi satu anggota (yang disebut dengan member) atau lebih, termasuk di
antaranya adalah metode semacam Main.
Program C# paling sederhana, tetapi lengkap akan terdiri atas sebuah kelas yang mengandung
satu anggota, yang berupa metode dengan nama Main.
Bagaimana mendeklarasikan Kelas?
Deklarasi Kelas dilakukan dengan menggunakan kata kunci class yang diikuti nama dari kelas
yang hendak dibuat, seperti di bawah ini:
class Program
Peraturan yang digunakan untuk membuat kelas sama saja dengan peraturan yang dimiliki oleh
nama-nama variabel. Nama variabel dan nama kelas dikenal juga dengan sebutan identifier
(tanda pengenal), yang tentunya harus ditentukan oleh kita. Semua identifier harus dimulai
dengan huruf atau karakter garis bawah dan harus mengandung hanya huruf, angka, dan
karakter garis bawah saja. Meski demikian, kita tidak bisa menggunakan kata-kata kunci
sebagai nama identifier. Walaupun Main bukanlah sebuah kata kunci di dalam C#, kita tidak
dapat menggunakan Main sebagai nama kelas, jika memang di dalam kelas yang bersangkutan
memiliki metode dengan nama Main. Pendeklarasian kelas juga mengharuskan kita untuk
menggunakan kurung keriting buka { dan kurung keriting tutup } seperti di bawah ini:
class Program
{
}
Di antara kurung keriting tersebut, kita bisa memasukkan metode-metode yang hendak kita buat,
termasuk di antaranya adalah Main yang telah kita buat sebelumnya. Terserah Anda, jika ingin
merapikan penulisan blok-blok kode program milik member dari kelas tersebut dengan
menjorokkannya ke kanan:
class Program
{
static void Main()
{
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit;
int TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariAlfa = 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
}
}
Dan, akhirnya kode di atas merupakan kode dalam bahasa C# yang lengkap. Bagaimana cara
membaca kode di atas? Kode tersebut hanya mengandung satu buah kelas, yang diberi nama
Program. Kelas Program tersebut memiliki satu buah metode yang disebut dengan Main. Metode
Main mendeklarasikan empat buah variabel dengan jenis data bilangan bulat. Program tersebut
terdiri atas empat buah statemen penugasan.
Edit, Compile, Run
Sebuah program komputer memulai hidupnya sebagai berkas teks yang ditulis oleh kita, para
(calon) programmer. Berkas teks tersebut umumnya disebut dengan kode sumber (source
code). Kode sumber program dalam bahasa pemrograman C# menurut konvensi, merupakan
sebuah berkas teks dengan ekstensi *.CS (singkatan dari C Sharp). Sebuah program juga bisa
terdiri atas satu berkas kode sumber atau bahkan lebih dari satu (dan ini merupakan hal yang
paling sering dilakukan).
Setelah kita membuat berkas kode sumber, baik itu satu berkas atau beberapa berkas, kita harus
melakukan kompilasi terhadapnya dengan menjalankan program yang disebut dengan kompiler
atau kompilator (complier). Kompiler bahasa C# adalah sebuah program yang terkandung di
dalam Microsoft .NET Framework yang dapat membaca kode sumber yang kita buat dan akan
mengubah kode sumber kita ke dalam bahasa yang dimengerti oleh komputer, yang di
dalam .NET Framework disebut dengan Microsoft Intermediate Language (MSIL), yang pada
umumnya dalam bentuk berkas biner dengan ekstensi *.EXE (singkatan dari Executable).
Kompiler C# akan mencoba membaca kode sumber yang kita buat, dan jika memang ia
menemukan sebuah masalah dengan kode sumber yang kita buat, maka ia akan memberitahukan
kepada kita mengenai masalah tersebut dan mungkin bagaimana cara mengatasi masalah
tersebut. Masalah-masalah pengetikan yang salah atau kesalahan lainnya yang terjadi saat
kompilasi, umumnya disebut dengan kesalahan sintaksis (syntax error) atau kesalahan waktu
kompilasi (compile-time error). Jika kompiler melaporkan adanya kesalahan, kita harus
menyunting ulang kode sumber kita untuk mengoreksi kesalahan tersebut. Kadang-kadang,
compile-time error juga dipanggil dengan sebutan compiler error, seolah-olah kompiler
merupakan pihak yang salah, bukannya kita sebagai programmer yang salah. Meskipun
memang, kompiler juga sering melakukan kesalahan dalam melakukan kompilasi, hal yang
paling sering terjadi adalah kompiler menemukan kesalahan yang kita buat dalam kode kita.
Setelah pada akhirnya kita dapat "membujuk" kompiler agar membuatkan berkas *.EXE dari
kode sumber program kita, kita dapat menjalankan program tersebut. Pada saat dijalankan,
program tersebut berada di dalam kendali sistem operasi, dan karena bahasa C# merupakan salah
satu anggota dari bahasa .NET Framework, program yang dibangun dengan menggunakan C#
dijalankan dengan menggunakan Common Language Runtime (CLR) yang tergabung ke
dalam .NET Framework.
Sistem operasi atau CLR akan mencoba menjalankan program yang kita buat, akan tetapi
mungkin saja program yang kita buat tidak mampu melakukan apa yang kita harapkan dengan
sempurna. Kadang-kadang, kode yang kita buat itu mencoba untuk melakukan hal-hal yang tidak
diperbolehkan (seperti mengakses area memori yang tidak dimiliki olehnya). Akhirnya, program
tersebut pun mengalami kesalahan saat berjalan, dan CLR atau sistem operasi akan memberikan
laporan kesalahan dengan menggunakan sebuah kotak dialog. Masalah-masalah yang terjadi
saat program dijalankan, disebut dengan runtime error atau exception. Karena berkas EXE
merupakan berkas biner yang sulit untuk dilihat dengan menggunakan editor teks biasa, maka
untuk mengoreksinya kita harus membuka kembali berkas kode sumber yang membentuk berkas
EXE yang bersangkutan.
Keseluruhan proses di atas, dikenal juga dengan sebutan Edit-Compile-Run, dan merupakan
bagian yang sering dilakukan dalam rangka membuat dan mengembangkan program. Semua
program, kecuali program-program yang kecil, melalui beberapa kali proses Edit-Compile-Run
sebelum akhirnya selesai dan dapat dipublikasikan. Ketika menulis program yang besar, saya
seringnya melakukan proses tersebut secepat mungkin, untuk mengetahui apakah program yang
masih belum besar tersebut benar-benar berjalan dengan sempurna atau tidak.
Nah, ketika kita akhirnya melihat bahwa program yang kita buat terkesan baik-baik saja tanpa
ada yang "mencurigakan", ada satu tugas lagi yang menunggu kita, yaitu pengujian. Mungkin,
kita akan menemukan bahwa program yang kita buat masih tidak berjalan dengan benar.
Masalah di dalam program yang sudah jadi ini, disebut dengan istilah "bug." Menemukan bug
sama seperti mencari kecoa di kamar kita, kadang-kadang gampang, kadang-kadang sulit, tetapi
kesulitan merupakan hal yang sering dialami oleh para programmer. Sebuah ilmu khusus
dibutuhkan untuk mencari, menemukan, dan mengoreksi bug dalam program, yang
disebut dengan debugging. Sayangnya, karena debugging merupakan topik tingkat lanjut, hal
itu (mungkin) tidak akan diulas di kumpulan artikel ini.
Alat bantu Edit-Compile-Run
Seperti yang telah disebutkan di dalam beberapa bab pendahuluan, kita memiliki segudang cara
untuk melakukan Edit-Compile-Run terhadap program C# yang kita buat. Mulai dari
mengetiknya secara manual dengan menggunakan Notepad hingga menggunakan alat bantu
khusus yang didesain untuk melakukannya. Cara paling enak yang dapat digunakan adalah
menggunakan Microsoft Visual Studio (jika memang Anda punya uang untuk membeli
lisensinya) atau Microsoft Visual C# Express Edition (yang gratis). Jika memang Anda tidak
punya uang untuk membeli lisensinya, mungkin Anda bisa mencoba program Sharp Develop
(#develop) yang dikembangkan oleh komunitas open-source dan juga Eclipse dengan plug-in
yang didesain khusus untuk melakukan Edit-Compile-Run terhadap program C# kita. Meskipun
mahal, saya menyarankan Microsoft Visual C# dan Microsoft Visual Studio, karena memang
menawarkan beberapa hal yang tidak dimiliki oleh beberapa program lainnya.
Di dalam Visual C# dan Visual Studio, program yang kita buat dinamakan dengan Project.
Sebuah Project dapat mengandung satu berkas teks berisi kode sumber atau lebih. Sebuah
Project harus diberi nama yang, tidak seperti nama identifier, bersifat case-insensitive. Nama
Project yang kita tentukan ini nantinya akan digunakan sebagai nama berkas EXE yang akan
dibentuk oleh kompiler. Sebagai contoh, ketika kita menggunakan nama Program sebagai nama
Project yang kita buat, maka hasilnya adalah PROGRAM.EXE.
Penggunaan alat bantu pemrograman C# memang adalah hak Anda untuk memilih, mana
menurut Anda lebih baik, mengingat setiap produk memiliki kelebihan dan kekurangannya
masing-masing. Akan tetapi setiap alat bantu tersebut menawarkan editor kode sumber yang
mampu memberikan warna masing-masing terhadap kode sumber yang kita tuliskan, sehingga
nanti terlihat jelas sintaksis-sintaksisnya dan lebih mudah dalam membaca kodenya.
Coba Anda ketikkan kode di bawah ini di dalam alat bantu pemrograman yang Anda gunakan,
dan simpan di dalam nama “Program01.cs”:
class Programku
{
static void Main()
{
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit;
int TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariGhaib = 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
}
}
Anda harus menekan tombol Enter untuk mengganti setiap baris di atas. Jika Anda
menggunakan editor teks biasa seperti Notepad, Anda mungkin tidak akan mengenali kata-kata
kunci di dalam C# yang digunakan di dalam kode sumber program di atas. Akan tetapi, ketika
Anda menggunakan alat-alat bantu yang telah saya sebutkan di atas, Anda akan menyadari
bahwa alat tersebut dilengkapi dengan fitur pemberian warna terhadap kata-kata kunci C# (dan
semua bahasa yang didukung oleh editor tersebut), yang dinamakan dengan syntax highlighting.
Jika kita cermati, editor tersebut akan menggunakan warna-warna berbeda untuk setiap
komponen di dalam program di atas. Sebagai contoh, di dalam editor Microsoft Visual C#, editor
akan menampilkan semua kata kunci dengan warna biru, dan baris pertama dan kedua yang
diawali dengan dua karakter garis miring atau double-slash(//) diberi warna hijau.
Ketika Anda telah mengetik kode di atas, proses selanjutnya adalah melakukan kompilasi
terhadap kode sumber agar dibuat menjadi program yang dapat dieksekusi oleh komputer. Jika
Anda menginginkan kesederhanaan tanpa alat bantu pemrograman seperti yang disebutkan di
atas, Anda harus melakukan kompilasi secara manual dengan menggunakan program kompiler
C#, yang diletakkan di dalam direktori C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705
(untuk .NET Framework 1.0), C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322
(untuk .NET Framework 1.1), atau C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
(untuk .NET Framework 2.0), menggunakan baris perintah yang "merepotkan". Anda harus
membuka Microsoft Command Prompt (C:\Windows\System32\cmd.exe) dan memasukkan
perintah seperti di bawah ini:
C:\>csc Program01.cs
yang kemudian akan menampilkan pesan dari pembuat kompiler:
yang kemudian akan mengubah kode sumber di atas menjadi program siap guna. Akan tetapi,
jika Anda menggunakan alat-alat bantu pemrograman seperti disebutkan di atas, Anda dapat
melakukannya secara lebih mudah. Penggunaan alat bantu pemrograman hanya membutuhkan
satu langkah saja yang harus dilakukan, yakni menekan menu Build Solution atau Build
Program. Semua hal yang berkaitan dengan Edit-Compile-Run dilakukan secara langsung oleh
alat bantu tersebut, dengan sedikit intervensi dari kita. Jika memang terjadi kesalahan pada saat
kompilasi, maka kesalahan-kesalahan tersebut akan ditampilkan dalam jendela Error List di
bawah editor teks. Anda bisa menuju ke lokasi di mana kesalahan tersebut berada dengan
mengklik ganda pada sebuah entri di dalam jendela Error List tersebut.
Saat Anda menjalankan program yang Anda buat, maka sebuah jendela console akan keluar.
Judul yang digunakan oleh jendela console tersebut adalah nama berkas yang digunakan oleh
proyek Anda. Setelah itu, ada sebuah baris yang berbunyi:
Press any key to continue
yang berarti bahwa program tersebut telah selesai berjalan. Mengapa kok belum keluar output
apa-apa, program saya langsung selesai dieksekusi? Itu memang karena di dalam kode program
tersebut tidak diberi sebuah perintah untuk menampilkan bagaimana hasil dari program tersebut
—kita hanya menyuruh komputer agar menjalankan instruksi penjumlahan saja, tidak lebih dan
tidak kurang. Kembali ke layar program yang Anda buat tadi, saat Anda menekan tombol apapun
dari keyboard, jendela tersebut akan "dihancurkan."
Metode apapun yang kita gunakan untuk melakukan kompilasi program yang kita buat, mungkin
kita akan menghabiskan waktu dalam rangka melakukan eksperimen terhadap kode kita dan
mencoba-coba banyak hal—dengan kata lain menggunakan metode circle-back. Eksperimen
merupakan aktivitas yang sangat penting—mungkin bisa dibilang paling penting—dalam
melakukan pemrograman, dan juga ketika belajar bahasa pemrograman. Yang "menyenangkan"
dalam eksperimen di bidang komputer adalah eksperimen bisa dilakukan oleh siapa saja dengan
mudah dan aman, tidak seperti eksperimen kimia, fisika, atau biologi. Kita tidak bakal membakar
rumah kita saat melakukan eksperimen dengan komputer. Sebagai contoh eksperimen kita yang
pertama, coba kita hapus salah satu statemen penugasan dari program kita yang pertama. Lihat
apa yang terjadi jika satu variabel, seperti halnya JumlahHariIzin atau JumlahHariAlfa
dihapuskan oleh kita dan menjadikannya tidak memiliki nilai sama sekali. Dengan melakukan
eksperimen seperti ini, kita mungkin akan terbiasa dengan pesan kesalahan yang datang dari
kompiler dan akhirnya mengetahui apa sih penyebabnya. Kita juga bisa membuang statemen
penugasan yang menghitung nilai TotalAbsensi. Hal itu memang tidak membuat kesalahan,
akan tetapi coba perhatikan apa yang dikatakan oleh kompiler C#?
Coba ganti kata class dengan kata struct (yang merupakan singkatan dari kata structure) di
dalam kode sumber program. Program yang kita buat mungkin terlihat akan bekerja dengan
normal, dan tidak ada perbedaan dengan ketika kita menggunakan kata kunci class. Padahal, di
antara class dan struct, terdapat perbedaan yang sangat besar, dan memahami perbedaan
tersebut, merupakan salah satu aspek terpenting dalam belajar bahasa pemrograman berorientasi
objek seperti halnya bahasa C#.
Input dan Output
Pada saat-saat awal pengembangan program kita, kita hanyalah pengguna program tersebut, dan
peranan kita pun berganti-ganti antara pengguna, penguji dan programmer. Program yang kita
buat haruslah memiliki beberapa cara untuk menampilkan output bagi pengguna, dan juga
mampu menerima input dari mereka. Kedua hal tersebut dinamakan juga dengan I/O atau Input
dan Output.
Metode untuk melakukannya, yang sering disebut dengan model I/O, berbeda-beda antar
program, tergantung cara kerja program tersebut. Program yang berjalan di atas sistem operasi
Windows akan menerima input dari pengguna dengan menggunakan keyboard, mouse, dan
beberapa kontrol lainnya (seperti halnya tombol dalam layar dan baris gulung/scroll bar).
Program-program Windows menampilkan output kepada pengguna dalam bentuk teks dan
grafik-grafik berwarna. Akan tetapi, program yang dimiliki di dalam perangkat lainnya, seperti
di dalam oven microwave atau kulkas yang ada komputer digital di dalamnya, pasti memiliki
model I/O yang sangat berbeda dengan model I/O yang digunakan oleh program Windows. Alat
input yang digunakan mungkin hanya beberapa buah tombol saja yang diletakkan di panel depan,
sementara alat outputnya adalah perangkat yang mampu mematikan atau menyalakan oven
microwave, menyalakan lampu dan mematikannya, dan masih banyak lagi yang lainnya.
Seperti halnya bahasa C, bahasa C# tidak mengandung sesuatu yang spesifik yang mendukung
I/O dengan pengguna. Mungkin, hal ini terdengar seperti sebuah kekurangan, akan tetapi
sebenarnya bukan merupakan sebuah kekurangan. Mungkin, lebih tepatnya, C# dapat dikatakan
tidak memiliki model I/O tertentu yang harus digunakan oleh programmer. Dan tugas Andalah
(sebagai calon programmer) untuk memilih I/O yang hendak digunakan oleh program buatan
Anda!
Meskipun demikian, untuk membangun program, baik itu program Windows, program Web,
ataupun aplikasi console, kita dapat menggunakan kelas yang didefinisikan di dalam .NET
Framework. Untuk menjelajahi kelas-kelas tersebut, mau tidak mau, kita harus mau membaca
dokumentasi .NET Framework, yang bisa didapatkan secara online (melalui MSDN Library)
ataupun secara offline (dengan menginstalasikan MSDN Library ke dalam komputer kita).
Dengan membuka entri Class Library, kita dapat memperoleh informasi mengenai kelas-kelas
yang disediakan oleh Microsoft .NET Framework.
Sekarang, yang harus Anda lakukan adalah "jangan merinding" melihat daftar yang sangat
panjang yang muncul di dalam MSDN library. Sebagian besar hal yang terdapat di sana mungkin
tidak akan kita gunakan di dalam program kita. Apa yang kita lihat di sini merupakan daftar
ruang nama (dalam C# disebut juga dengan nama namespace), yang bertugas untuk membagi
kelas-kelas .NET ke dalam beberapa kelompok fungsional tertentu. Ruang nama yang memiliki
sebagian besar kelas dasar adalah ruang nama yang disebut sebagai System. Di dalam ruang
nama tersebut, kita akan menemukan kelas Console, dan di dalam kelas Console terdapat
metode-metode yang dapat digunakan oleh program yang kita buat untuk membaca input dari
pengguna dengan menggunakan console dan menampilkan output kepada pengguna. Nah, itulah
yang akan kita gunakan di dalam program di atas.
OKE. Kita mulai dengan output! Untuk menampilkan output ke dalam console, kita dapat
menggunakan dua metode yang memiliki nama System.Console.Write (yang dapat dibaca
"System dot Console dot Write") dan juga System.Console.WriteLine.
Sebagai contoh, untuk menampilkan nilai dari variabel TotalAbsensi kepada pengguna, kita
dapat menambahkan baris berikut ke dalam program yang kita bangun dari awal tadi, tepat
setelah ada pernyataan penugasan bagi variabel TotalAbsensi:
. . .
System.Console.WriteLine(TotalAbsensi);
. . .
Simpan, lakukan kompilasi ulang terhadap program tersebut, dan jalankan. Sekarang, Anda akan
melihat angka keluar ke layar:
22
Press any key to continue.
Jika Anda melihat hasil program seperti di atas, maka program pertama yang Anda buat telah
berjalan.
Kita juga bisa mencoba menulis sebagai berikut:
. . .
System.Console.Write(TotalAbsensi);
. . .
Dalam kasus ini, Anda akan mendapatkan:
22Press any key to continue.
Perbedaan di antara System.Console.Write dan System.Console.WriteLine adalah bahwa
WriteLine akan mengganti baris setelah menampilkan hasil output-nya, sementara Write tidak.
Metode Write dapat digunakan untuk menampilkan beberapa hal di dalam baris yang sama.
Setiap metode di dalam .NET Framework memiliki tiga buah nama. "WriteLine" adalah nama
sebenarnya dari sebuah metode. Tentu kita telah mengetahui, apa itu metode, karena memang
kita telah mempelajarinya dari metode Main—meski belum tahu definisinya. Definisi yang
umum mengenai sebuah metode adalah koleksi kode yang melakukan sesuatu pekerjaan
tertentu. Dalam kasus WriteLine, pekerjaannya adalah untuk menampilkan output program ke
dalam layar console.
Nama kedua yakni "Console", adalah apa yang disebut dengan kelas (class). Kita juga tahu apa
itu kelas, karena Programku adalah sebuah kelas. Seperti halnya Main yang merupakan sebuah
method di dalam kelas Programku, metode WriteLine juga merupakan metode yang terdapat di
dalam kelas Console.
Nama terakhir "System", adalah apa yang disebut sebagai ruang nama (namespace). Semua kelas
di dalam .NET Framework disusun sedemikian rupa di dalam sebuah namespace yang membagi
kelas-kelas tersebut ke dalam sebuah kelompok fungsional tertentu. Mungkin saja di sana ada
sebuah namespace lainnya yang memiliki kelas dengan nama Console, dan hal tersebut sah-sah
saja!
Dalam buku "The C# Language Specification", sebuah pernyataan seperti di bawah ini
System.Console.Write(TotalAbsensi);
disebut sebagai ekspresi permintaan (invocation expression), tetapi sebagian besar
programmer menyebutnya sebagai pemanggilan metode (method call). Program yang kita buat
di atas akan memanggil metode WriteLine, yang pada dasarnya akan menangani nilai dari
variabel TotalAbsensi, yang harus diapit oleh tanda kurung buka dan kurung tutup setelah
nama metode tersebut. Kita juga bisa mengatakan bahwa program kita memberikan variabel
TotalAbsensi kepada metode WriteLine untuk diproses, atau kita juga bisa mengatakan bahwa
variabel TotalAbsensi adalah argumen yang dimasukkan kepada metode WriteLine.
OKE! Ketika saya menjelaskan mengenai deklarasi metode Main, saya mengatakan bahwa
metode Main tidak memiliki parameter input. Deklarasi Main di dalam program kita akan kita
ketahui karena memang setelah nama metode, terdapat tanda kurung buka dan tanda kurung
tutup.
static void Main()
{
}
Kata kunci void yang tertulis di atas menandakan bahwa Main tidak memiliki nilai kembalian
(return value).
Dalam kode sumber yang membangun .NET Framework, deklarasi WriteLine mungkin akan
berbentuk seperti ini:
namespace System
{
public sealed class Console
{
public static void WriteLine(int value)
{
...
}
}
}
Saya mengatakan "mungkin", karena memang kode sumber .NET Framework merupakan hak
cipta yang dimiliki oleh Microsoft Corporation, dan orang biasa seperti saya belum pernah
melihatnya—dan kalaupun melihatnya saya belum tentu paham. Kode kecil imajiner di atas juga
mencakup beberapa kata kunci yang mungkin Anda anggap baru, karena memang baru Anda
temukan (seperti kata kunci namespace, public, dan sealed). Tenang saja. Kita akan
mendiskusikannya lebih lanjut seiring dengan waktu. Ruang nama System, yang mengandung
kelas Console, memiliki banyak sekali kelas-kelas lainnya selain Console; sementara kelas
Console, yang mengandung metode WriteLine, memiliki banyak metode lainnya.
Ngomong apa sih, bertele-tele? Yang ingin saya tekankan di dalam paragraf di atas adalah bahwa
metode WriteLine dideklarasikan dengan sebuah parameter di dalam kurungan, setelah nama
metodenya.
public static void WriteLine(int value)
{
...
}
Saat sebuah program menggunakan metode WriteLine, maka program tersebut akan
meneruskan argumennya ke dalam metode tersebut. Perhatikan contoh kode di bawah ini:
System.Console.WriteLine(TotalAbsensi);
Saat program memanggil metode WriteLine, parameter value dalam metode WriteLine akan
mengambil nilai argumen yang dimasukkan, yakni TotalAbsensi. Metode WriteLine di
dalam .NET Framework akan menampilkan variabel value tersebut (yang kini memiliki nilai
yang sama dengan nilai variabel TotalAbsensi) ke dalam layar console. Ketika WriteLine
telah melakukan apa yang harus dikerjakannya, WriteLine dikatakan mengembalikan kendali
kepada program yang memanggilnya, yang kemudian program tersebut melanjutkan
eksekusinya.
Saya terus menerus menggunakan istilah "parameter" dan "argumen". Sebenarnya apa sih? Saya
mengatakan bahwa metode WriteLine memiliki sebuah parameter yang diberi nama value.
Saya juga mengatakan bahwa saat program memanggil metode WriteLine, maka program
tersebut akan memasukkan argumen kepada metode tersebut, yang dalam contoh ini adalah
TotalAbsensi. Terlihat jelas, bahwa di sana terdapat hubungan yang sangat dekat antara
parameter dan argumen—bahkan banyak programmer pun sering menyebut dua hal tersebut
seperti dibolak-balik. Akan tetapi, sebagai seorang programmer yang handal (amin), kita jangan
mengikuti jejak-jejak yang kurang baik dari para programmer terdahulu: kita harus bisa
membedakan antara kata argumen dan parameter. Lalu di mana perbedaannya? Perbedaan
dasarnya adalah hanya satu perspektif, tergantung kita melihatnya dari dalam metode atau dari
luar metode. Jika kita bisa "masuk" ke dalam metode WriteLine, maka kita akan melihat kode
yang dapat menampilkan parameter value ke dalam layar console. Akan tetapi, kode tersebut
tidak akan dieksekusi hingga ada sebuah program memanggil WriteLine dengan sebuah
argumen.
Mari kita kembali lagi ke pemanggilan metode di atas:
System.Console.WriteLine(TotalAbsensi);
Beberapa programmer menggunakan spasi kosong untuk memisahkan tanda kurung dengan
argumen, seperti di bawah ini:
System.Console.WriteLine( TotalAbsensi );
Dan hasilnya akan sama saja seperti bentuk yang di atas. Yang harus kita lakukan adalah
mengeja System, Console, atau WriteLine dengan baik dan benar, dengan menggunakan
kapitalisasi huruf yang tepat. Jika tidak, kompiler C# akan mengalami "kebingungan", sehingga
program kita tidak akan berjalan. Nah lho!!!
Kita juga bisa meneruskan ekspresi numerik ke metode WriteLine. Sebagai contoh, kita dapat
melenyapkan variabel TotalAbsensi dan hanya menggunakan tiga variabel lainnya yang
membentuk TotalAbsensi, sehingga bentuknya adalah seperti berikut ini:
System.Console.WriteLine(JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa);
Jika memang kita hanya menginginkan komputer agar menambahkan angka-angka 10, 2 dan 10
(nilai-nilai variabel tersebut), kita juga bisa menghapus secara keseluruhan variabel-variabel
tersebut, sehingga pernyataannya menjadi:
System.Console.WriteLine(10 + 2 + 10);
Akan tetapi, meskipun jika kita hanya berpura-pura bahwa kita membuat program yang
melakukan hal yang berguna, adalah hal yang sangat baik untuk menggunakan variabel yang
mengindikasikan apa yang harus dilakukan oleh program.
Mungkin kita mengira, bahwa metode WriteLine hanya mentransfer nilai dari angka di dalam
variabel ke dalam layar console, akan tetapi sebenarnya WriteLine melakukan hal yang lebih
dahsyat lagi dibandingkan dengan apa yang kita bayangkan selama ini. Angka-angka yang kita
masukkan ke dalam komputer akan disimpan oleh komputer dalam bentuk pola dari bit-bit
tertentu. Agar dapat ditampilkan ke dalam layar console dalam cara yang berguna, maka angka
tersebut dapat diubah ke dalam bentuk teks, yang juga merupakan pola bit-bit tertentu, tetapi
sangatlah berbeda dengan angka.
Jika memang program yang kita tuliskan memiliki banyak panggilan
System.Console.WriteLine (seperti yang ditulis di dalam buku ini), maka kita dapat
mengurangi kelelahan kita dalam mengetik, dengan membuang bagian namespace dari
System.Console.WriteLine, sehingga yang tinggal adalah Console.WriteLine. Akan tetapi,
yang harus Anda lakukan adalah memasukkan direktif using pada bagian awal sebuah program,
sebelum deklarasi kelas dilakukan, seperti di bawah ini:
using System;
Kata kunci using selalu diikuti dengan nama namespace dan karakter titik koma. Baris ini
dikenal juga sebagai direktif (directive), ketimbang dikenal sebagai sebuah statemen, karena
memang baris tersebut tidak memiliki peranan yang penting atau sama sekali tidak memiliki
peranan sama sekali saat program akhirnya dijalankan. Baris tersebut hanya menginstruksikan
kompiler bahwa kelas apapun yang dirujuk ke dalam program mungkin merupakan anggota dari
namespace System.
Jika kita memasukkan direktif seperti itu di dalam program kita, kita dapat memanggil WriteLine
dengan hanya menuliskan nama kelas dan nama metodenya saja, seperti di bawah ini:
using System;
class Programku
{
static void Main()
{
int JumlahHariIzin, JumlahHariAlfa, JumlahHariSakit;
int TotalAbsensi;
JumlahHariIzin = 10;
JumlahHariAlfa = 2;
JumlahHariSakit = 10;
TotalAbsensi = JumlahHariIzin + JumlahHariSakit + JumlahHariAlfa;
Console.WriteLine(TotalAbsensi);
}
}
Jika kita lihat pada kode di atas, memang penggunaan direktif using di sini tidak mampu
menghemat cara pengetikan yang kita lakukan, karena memang di sini hanya ada satu buah
metode yang terdapat di dalam ruang nama System yang kita panggil. Akan tetapi, jika kita
menulis program dengan banyak sekali rujukan ke dalam kelas-kelas yang berada di dalam ruang
nama System, maka hal ini jelas sangat menghemat pengetikan. Karena dapat menghemat
pengetikan, maka saya akan menggunakannya di dalam program-program selanjutnya di dalam
artikel ini.
Bab III: Perhitungan Aritmetika dalam C# dan
Operator
Dalam beberapa contoh pada bab sebelumnya, kita telah mengenal beberapa hal, tetapi masalah
aritmetika/matematika dasar di dalam contoh di atas hanya dibahas satu buah saja, yakni
penjumlahan. Padahal, sebenarnya banyak program komputer yang harus mampu melakukan
kalkulasi dalam berbagai macam bentuk, selain tentunya penjumlahan. Dari contoh-contoh di
atas, mungkin kita telah bisa memahami bagaimana caranya menambahkan dua bilangan atau
lebih dengan menggunakan bahasa C#, tapi bagaimana dengan operasi lainnya, seperti perkalian,
pembagian, dan pengurangan?
Penjumlahan dan Pengurangan
Penjumlahan memang hal yang paling mudah untuk dilakukan di dalam bahasa C#, karena
memang kita belajar dari contoh-contoh pada bab-bab sebelumnya. Ya, penjumlahan di dalam
bahasa C# disimbolkan dengan menggunakan tanda plus (+)! Jika variabel A, B, dan C
dideklarasikan sebagai integer, maka untuk mencari nilai C yang merupakan hasil penjumlahan
antara A dan B adalah sebagai berikut:
C= A + B;
Pengurangan juga sama mudahnya seperti penjumlahan. Yakni dengan menggunakan simbol
strip (-) sebagai tanda untuk mengurangi dua buah bilangan.
C= A - B;
Simbol plus dan strip di atas merupakan contoh dari operator aritmetika. Kedua operator
tersebut juga dapat dikategorikan sebagai operator biner (binary operator), karena memang
keduanya memiliki dua buah operand (operand pertama adalah yang berada di sebelah kiri
simbol, sementara operator kedua berada di sebelah kanan simbol). Sebuah operand dapat
berupa ekspresi tertentu, dan ekspresi tersebut dapat berupa sebuah variabel, literal numerik, atau
hasil dari operasi lainnya.
Kita juga bisa menggunakan kedua simbol di atas secara sekaligus, sebagai operator unary
(unary operator, yang memiliki satu buah operand saja). Daripada harus menuliskan bentuk
seperti:
C = A - B;
kita juga bisa menuliskan:
C = A + -B;
atau dalam bentuk:
C= -B + A;
Pada bentuk pertama dari tiga bentuk pernyataan di atas, tanda strip di atas merupakan tanda
untuk operasi pengurangan, yang melibatkan dua buah operand, yakni A dan B, sehingga tanda
minus tersebut dinamakan pula dengan operator binary. Pada bentuk kedua dan ketiga, tanda
strip tersebut berarti menegatifkan sebuah nilai, yakni nilai B. Kedua statemen tersebut akan
menambahkan nilai A (positif) dengan nilai negatif dari B. Karena setelah tanda tersebut hanya
terdapat satu buah operand, maka operator tersebut termasuk ke dalam kategori operator unary.
Operator unary sendiri tidak mengubah nilai B, akan tetapi hanya mengubah nilai yang
digunakan pada saat penjumlahan.
Tanda plus, yang merupakan sebuah operator binary yang biasa digunakan untuk melakukan
operasi penjumlahan, bisa juga digunakan sebagai operator unary seperti di bawah ini:
C = +A - +B;
Tanda operator plus di sana terlihat aneh dan, karenanya, oleh para desainer C# di Microsoft
dibuat agar tidak memiliki efek pada variabel/nilai yang mengikutinya. Lagi pula, jika memang
membingungkan, dan tidak berguna, maka saya juga tidak akan menuliskan bentuk seperti di
atas lagi di dalam tulisan-tulisan saya selanjutnya mengenai C#. Ini adalah waktu terakhir Anda
melihatnya!
Perkalian
Nah, penjumlahan dan pengurangan sudah dibahas, akan tetapi bagaimana dengan perkalian?
Padahal, di dalam matematika, kita mengetahui bahwa simbol perkalian adalah × (Unicode
007D), dan simbol tersebut tidak terdapat di dalam keyboard yang kita gunakan. Terus
bagaimana digunakannya? Dalam sebagian besar bahasa pemrograman populer, kita bisa
menggunakan karakter asterisk (*), dan kita bisa menggunakannya sebagai operator untuk
perkalian. Dibanding kita menggunakan bentuk:
Luas = Panjang × Lebar;
Kita bisa menggunakan bentuk:
Luas = Panjang * Lebar;
Ingat, sebagian besar bahasa pemrograman menggunakan karakter asterisk sebagai simbol
perkalian, bukan hanya C# saja. Dan daripada menyebutnya dengan sebutan yang agak susah,
para programmer di luar negeri pun menyebutnya dengan sebutan star saja. Kita juga sama deh!
Kita sebut karakter asterisk sebagai karakter bintang, karena lebih mudah digunakan dan diingat.
Oke?
Pembagian dan Sisa Hasil Bagi
Papan ketik yang kita gunakan juga mungkin tidak memiliki tanda untuk pembagian yang kita
kenal yakni ÷ (Unicode 00F7). Akan tetapi, sama seperti halnya perkalian yang menggunakan
tanda bintang sebagai pengganti simbol ÷, pembagian juga menggunakan karakter pengganti,
yakni garis miring maju, atau slash! (/) Sehingga, kita bisa menuliskan bentuk Jam=Menit ÷ 60,
dalam C# menjadi:
Jam = Menit / 60;
Di antara semua operasi aritmetika dasar, mungkin semua orang akan setuju bila saya
mengatakan bahwa pembagian adalah operasi yang paling rumit dilakukan. Komputer pun sama
bodohnya, karena memang komputer lebih bodoh dibandingkan dengan kita! Tidak seperti
operasi lainnya terhadap bilangan bulat yang "adem-adem" saja, pembagian terhadap dua buah
bilangan bulat memiliki kerumitan tersendiri yang tidak kita bisa abaikan. Oke, jika tidak
percaya mungkin potongan kode ini bisa dijadikan sebagai demonstrasi:
int JumlahKue, JumlahOrang, Bagian;
JumlahKue = 11;
JumlahOrang = 4;
Bagian= JumlahKue / JumlahOrang;
Oke, berapa nilai akhir dari variabel Bagian? Jawabannya pasti bukan 2.75! Variabel Bagian
tidak dapat bernilai 2.75 karena kita tahu bahwa pada deklarasi variabel di atas, variabel Bagian
memiliki tipe data bilangan bulat (integer). Kata kunci int sama sekali tidak bisa mengakomodir
pecahan, yang berarti jika memang kita membutuhkan hasil dalam bentuk pecahan, kita harus
mencari pendekatan lainnya (yang nanti akan dibahas)!
Sebenarnya, variabel Bagian yang dideklarasikan sebagai integer bukanlah menjadi masalah di
sini. Masalahnya sebenarnya terdapat pada tanda sama dengan (=) yang digunakan di dalam
operasi, yakni pada sebelah kanan tanda sama dengan tersebut. Variabel JumlahKue dan
JumlahOrang juga dideklarasikan sebagai integer, dan di dalam C#, semua operasi antara dua
buah integer akan menghasilkan integer pula.
Saat C# membagi dua buah bilangan bulat, maka C# akan memotong hasilnya, yang berarti
bagian pecahannya akan dibuang begitu saja (tidak akan dianggap)! Hasil dari pembagian antara
11 dan 4 bukanlah 2.75, karena nilai 0.75 akan dibuang dan nilai akhir dari pembagian tersebut
adalah 2. Berarti, setiap orang mendapatkan dua buah kue, dan secara logika masih tersisa tiga
buah kue yang tidak dibagikan untuk siapa-siapa.
Oke, sekarang lihat contoh di bawah ini:
int JumlahKue, JumlahOrang, Bagian;
JumlahKue = 11;
JumlahOrang = 12;
Bagian= JumlahKue/JumlahOrang;
Berapa nilai akhir dari variabel Bagian? Jawabannya adalah 0, karena jumlah orang terlalu
banyak jika dibandingkan dengan jumlah kuenya, akhirnya ibu dapur pun tidak membaginya,
sehingga 12 orang pun akhirnya "kelaparan."
Pemotongan pun berlaku untuk angka negatif:
A = -3;
B = 2;
C = A / B;
Jika saja semua bilangan tersebut dianggap bukan sebagai bilangan bulat, maka hasilnya adalah -
1.5, tapi C# akan membuang pecahan ½ tersebut, dan hasil akhirnya adalah -1. Pemotongan
dalam kasus-kasus ini pun kadang disebut sebagai "pembulatan".
Untungnya, bahasa C# menawarkan operator lainnya yang mengizinkan kita untuk
"menyelamatkan" sisa pembagian tersebut, sehingga bisa "dimanfaatkan". Operator ini
dinamakan juga dengan modulus operator, atau operator sisa. Dalam C#, operator modulus
menggunakan simbol persen (%), sebuah simbol yang pada dasarnya mengandung karakter garis
miring (slash) sehingga menjadikannya berhubungan dengan pembagian. Oke deh, kita
modifikasi program di atas menjadi seperti ini:
int JumlahKue, JumlahOrang, Bagian;
JumlahKue = 11;
JumlahOrang = 4;
Bagian= JumlahKue/JumlahOrang;
int Sisa;
Sisa = JumlahKue % JumlahOrang;
Sebelas kue dibagi ke empat orang menghasilkan setiap orang mendapatkan dua buah kue utuh,
dan sisanya ada tiga buah kue yang tidak digunakan. Saat menggunakan operator modulus
terhadap bilangan negatif, hasilnya pun selalu memiliki tanda yang sama dengan nilai yang
ditaruh di samping kiri dari operator modulus tersebut (jika positif maka hasil akhirnya akan
positif dan bila negatif, maka hasil akhirnya juga negatif).
Operator modulus akan sangat berguna untuk melakukan beberapa pekerjaan tertentu, karena
operator ini dapat membagi sebuah angka yang mungkin nantinya akan lebih rumit jika
menggunakan operator pembagian biasa. Sebagai contoh, anggaplah kita memiliki sebuah
variabel dengan nama Tahun4Digit, yang menyimpan angka seperti 1968, 1985, atau 2008. Jika
kita hendak mengubahnya menjadi tahun dengan panjang dua digit, dengan nama variabel
Tahun2Digit (seperti 68, 85, atau 08), maka kita bisa melakukannya dengan cara:
Tahun2Digit = Tahun4Digit % 100;
Variabel Tahun2Digit adalah angka sisa pembagian setelah kita membagi variabel
Tahun4Digit dengan angka 100. Nilainya akan selalu merupakan angka antara 0 hingga 99.
Contoh lainnya: anggaplah kita memiliki variabel dengan nama MenitTotal, yang mungkin
mengandung total menit berjalannya sebuah film di bioskop. Jika memang kita hendak
memisahkan nilai tersebut ke dalam bentuk Jam:Menit yang merupakan bentuk bilangan bulat,
maka kita bisa gunakan:
Jam = MenitTotal / 60;
Menit = MenitTotal % 60;
Jika variabel MenitTotal bernilai 135, maka Jam akan bernilai 2, dan Menit akan bernilai 15.
Hasil dari variabel Menit pasti akan selalu memiliki nilai 0 hingga 59.
Operator modulus juga bisa sangat berguna untuk menentukan apakah sebuah angka bisa habis
dibagi oleh angka lainnya. Sebagai contoh, kita tahu bahwa tahun kabisat adalah tahun yang
habis dibagi dengan empat, dan akan muncul setiap empat tahun sekali. Dengan demikian, jika
ekspresi Tahun % 4 memiliki nilai 0, maka tahun tersebut merupakan tahun kabisat. Betul tidak?
Beberapa masalah dalam pembagian
Di atas, saya mungkin menyebutkan "kerumitan dalam pembagian". Maksudnya apa sih? Selain
dua masalah di atas, pembagian memiliki beberapa kerumitan lagi, di antaranya adalah sebagai
berikut:
int A, B, C;
A = 11;
B = 0;
C= A / B;
Bentuk kode di atas menunjukkan sebuah proses pembagian dengan angka nol, yang tentu saja
tidak diizinkan untuk digunakan oleh sebuah bilangan bulat. Mungkin, Anda mengira mengapa
saya bilang "tidak diizinkan", padahal memang di dalam matematika setiap angka yang dibagi
dengan angka 0 akan menghasilkan bilangan infinity atau tak keberhinggaan (∞). Untuk lebih
memahaminya, coba perhatikan kode yang lebih sempurna di bawah ini:
//Program02.cs
using System;
class BagiDgnNol
{
static void Main()
{
int A, B, C;
A=11;
B=0;
Console.WriteLine(A);
Console.WriteLine(B);
C=A/B;
Console.WriteLine(C);
}
}
Program di atas akan dikompilasi dengan benar, tanpa ada kesalahan apapun. Dan ketika
dijalankan pun, kita akan melihat nilai dari variabel A dan B karena memang kita telah
menyuruh komputer untuk menampilkan nilai dari variabel A dan B. Lalu, program yang kita
buat tersebut akan berhenti sejenak, lalu muncul sebuah kotak dialog dengan judul Just-In-Time
Debugging. Tekan saja tombol "No" karena kita tidak mau melakukan debugging (lebih
tepatnya, belum bisa melakukannya). Kotak dialog pun hilang, tapi di layar console, kita akan
melihat pesan:
Unhandled Exception: System.DivideByZeroException: Attempted to divide by
zero.
Kita mungkin akan memperoleh informasi mengenai pada baris ke berapa kesalahan tersebut
terjadi di dalam berkas kode sumber Program02.cs yang menyebabkan program kita tidak
berjalan dengan sempurna. Akhirnya, program pun terhenti dan kita tidak tahu berapa nilai C,
karena memang tidak diberi kesempatan untuk memanggil statemen Console.WriteLine yang
ketiga yang digunakan untuk memperlihatkan nilai variabel C.
Ketika kita salah dalam mengetikkan kode (sebaiknya sih jangan), mungkin kita akan "akrab"
dengan pesan kesalahan yang ditampilkan oleh kompiler (compiler error), yang pada umumnya
berisi kesalahan sintaksis di dalam kode yang harus kita perhatikan pada saat melakukan
kompilasi (syntax error). Akan tetapi, dalam program Program02.cs di atas, meski tidak ada
kesalahan saat melakukan kompilasi, program tidak mau berjalan dengan sempurna, saat
dijalankan. Karenanya jenis kesalahan tersebut dikenal juga dengan sebutan runtime error
(kesalahan saat dijalankan), karena memang kesalahan tersebut muncul saat program dijalankan,
bukan ketika kompilasi, atau bahkan pengetikan.
Saat berhadapan dengan penyebut yang memiliki nilai 0, maka operasi pembagian dikatakan
sedang mencoba untuk membuat pengecualian, atau exception, yang merupakan istilah yang
digunakan untuk merujuk kepada keluhan yang dimiliki komputer akibat munculnya sebuah
masalah. Sebuah program juga sebenarnya dapat diberi informasi mengenai sebuah exception
telah terjadi dan disuruh untuk menanganinya, yang nanti akan kita pelajari pada bab
selanjutnya. Hingga saat kita belajar hal tersebut, kita mungkin menjadi akrab dengan pesan
"unhandled exception", yang berarti sebuah exception yang tidak bisa ditangani oleh program,
malahan ditangani oleh .NET Framework. Pesan tersebut juga mengandung kata
System.DivideByZeroException, yang merupakan sebuah kelas di dalam namespace System
yang digunakan oleh operator pembagian untuk membuat exception.
Dalam program Program02.cs, coba ubah nilai C dengan bentuk seperti di bawah ini:
C = A / 0;
atau
C = 3 / 0;
Sekarang, lakukan kompilasi terhadapnya! Anda akan melihat bahwa saat kompilasi, kompiler
akan menampilkan kesalahan
Divide by constant zero
Saat kita menaruh angka 0 di sebelah kanan tanda pembagian di dalam program kita, kompiler
cukup cerdas untuk menolak kode kita dengan mengeluarkan pesan semacam itu. Teks
superscript==Ekspresi, Operator, Operand dan Prioritasnya== Oke, sejauh ini, kita hanya
menggunakan statemen-statemen yang di dalamnya hanya terdapat satu buah operator aritmetika
saja. Sebenarnya, kita juga bisa membuat statemen yang di dalamnya terdapat banyak operator
aritmetika yang berbeda-beda. Adalah sangat berguna untuk membuatnya ke dalam sebuah baris
dibandingkan dengan membuatnya ke dalam beberapa baris yang justru nanti membuat program
kita menjadi lebih panjang. Hanya saja, memang kita harus memiliki pengetahuan terlebih
dahulu bagaimana caranya membangun ekspresi yang terdiri atas lebih dari satu operator
tersebut. Di dalam The C# Language Specification bagian 7.2, Microsoft mengatakan kaidah
"An expression is constructed from operands and operators" (sebuah ekspresi dibangun dari
beberapa operand dan beberapa operator).
Berikut adalah contoh ekspresi sederhana yang memiliki dua buah operand, dan sebuah operator
binary:
operand1 + operand2
Satu atau kedua operand tersebut dapat menjadi ekspresi aritmetika yang melibatkan operand
lainnya. Hasil dari ekspresi di atas adalah hasil penjumlahan dari dua buah operand tersebut di
atas.
Berikut ini adalah ekspresi lainnya yang mengandung dua buah operand dan satu buah operator:
operand1 = operand2
Operator sama dengan (=) akan menyebabkan operand yang berada di sebelah kiri (yang harus
berupa variabel) akan diatur nilainya agar sama dengan operand yang berada di sebelah kanan.
Selain untuk mengubah operand1, ekspresi penugasan juga akan memiliki sebuah nilai tertentu.
Nilai dari ekspresi penugasan adalah hasil akhir dari operand di sebelah kiri dari tanda sama
dengan, dalam kasus ini adalah operand1.
Berikut ini adalah beberapa contoh statemen penugasan, dan yang terakhir ternyata
menggunakan empat buah operator aritmetika yang berbeda-beda:
A = 2;
B = 3;
C = 4;
D = 5;
E = 6;
F = A + B * C / D - E;
Pada statemen terakhir yang berisi penugasan terhadap variabel F, operasi manakah yang akan
pertama kali berjalan? Mungkin, kita akan beranggapan bahwa semuanya akan dijalankan secara
berurutan, sesuai dengan urutannya, karena memang komputer hanya bisa melakukan eksekusi
secara berurutan. Akan tetapi, sebenarnya kompiler C# tidaklah begitu! Bahasa C# memiliki
tabel kaidah prioritas operator, yang dalam C# Language Specification disebut sebagai
"Operator Precedence and Associativity," sehingga komputer pun akan diberi tahu oleh
kompiler C# urutan evaluasi eksekusi dari operator-operator di dalam sebuah ekspresi dengan
banyak operator.
Tabel di bawah ini (terkesan mengerikan lho) disusun dengan skala prioritas yang disusun
berdasarkan kategorinya, di mana kategori operator yang diletakkan paling atas memiliki
prioritas yang paling tinggi, sementara kategori operator yang diletakkan paling bawah memiliki
prioritas paling rendah. Akan tetapi, operand-operand yang berada di dalam kategori prioritas
yang sama memiliki prioritas yang sama. Untuk operand-operand yang memiliki prioritas yang
sama, C# akan melakukan evaluasi terhadap ekspresi tersebut secara berurutan, yakni dari kiri ke
kanan.
<thead> </thead>
Prioritas Kategori Jenis-jenis
operator
tertinggi Operator utama (primary operator) (x)
x.y
f(x)
a[x]
x++
x--
new
typeof
sizeof
checked
unchecked
Operator unary (unary operator),
yang hanya memiliki satu buah
operand
+
-
!
~
++x
--x
(type)x
Operator pengalian (multiplicative
operator), yang merupakan operator
binary, karena memiliki dua
operand.
*
/
%
Operator penambahan (additive
operator), yang merupakan operator
binary.
+
-
Operator pergeseran (Shift operator) <<
>>
Operator relasional (Relational
operator)
<
>
<=
>=
is
Operator persamaan dan
pertidaksamaan (equality/inequality
operator)
==
!=
Operator logika AND (Logical AND
operator)
&
Operator logika XOR (Logical XOR
operator)
^
Operator logika OR (Logical OR
operator)
|
Operator kondisional AND
(Conditional AND operator)
&&
Operator kondisional OR
(Conditional OR)
||
Operator kondisional (Conditional
operator)
?:
terendah Operator penugasan (Assignment
operator)
=
*=
/=
%=
+=
-=
<<=
>>=
&=
^=
|=
Oke, kita kembali lagi ke ekspresi berikut:
F = A + B * C / D – E;
Dilihat dari tabel di atas, terlihat bahwa operator perkalian dan pembagian, termasuk ke dalam
kategori multiplicative operator (operator pengalian), dan kategori tersebut lebih tinggi
prioritasnya dibandingkan dengan additive operator (operator penambahan). Karena itulah,
perkalian dan pembagian akan dilakukan pada urutan pertama kali, dari kiri ke kanan. Operasi
yang akan dievaluasi pertama kali dalam ekspresi di atas adalah perkalian, sehingga ekspresi di
atas akan menjadi seperti di bawah ini:
F = A + 12 / D - E
Selanjutnya, yang akan dijalankan adalah pembagian:
F = A + 2 - E
Penjumlahan dan pengurangan termasuk ke dalam kategori yang sama, sehingga kedua operasi
tersebut akan dilakukan dari kiri ke kanan, sehingga menjadi seperti di bawah ini:
F = 4 - E
Dan kemudian C# akan menjalankan pengurangan, sehingga menjadi:
F = -2
Ternyata, nilai akhir dari variabel F adalah -2.
Akan tetapi, jika kita menghendaki hasil yang berbeda dengan yang di atas, maka gunakanlah
tanda kurung buka dan kurung tutup, yang merupakan operator utama tertinggi:
F = (A + B) * C / (D - E);
Jika perlu, gunakan tanda kurung bertumpuk:
F = (A + B) * (C / (D - E));
Perhatikan tabel di atas! Pada kategori operator unary, operator plus (+) dan minus (-) berbeda
dengan operator plus (+) dan minus (-) dalam kategori operator penambahan. Prioritas kategori
operator unary pun lebih tinggi dibandingkan dengan operator penambahan, bahkan jika
dibandingkan dengan operator pengalian sekalipun.
Akan tetapi, tanda sama dengan, yang kita kenal sebelumnya sebagai operator penugasan,
terletak pada kategori paling bawah di dalam tabel. Operator penugasan merupakan satu-satunya
operator yang memiliki hubungan dari kanan ke kiri, yang berarti beberapa operator penugasan
di dalam sebuah baris ekspresi akan diproses dari paling kanan. Perhatikan contoh di bawah ini
(contoh ini benar lho!):
A = B = C = 27;
Karena operasi penugasan memiliki asosiasi dari kanan ke kiri, maka variabel C merupakan
variabel yang pertama kali diberi nilai 27, lalu variabel B diberi nilai variabel B, dan variabel A
sebagai variabel terakhir yang diberi nilai variabel B.
Perhatikan juga contoh di bawah ini:
C = (A = 5) + (B = 6);
Tanda kurung pertama akan memaksa nilai A agar memiliki nilai 5, dan juga nilai ekspresi
penugasannya pun juga 5. Tanda kurung kedua akan memaksa agar nilai B memiliki nilai 6, dan
ekspresi penugasannya pun juga 6. Variabel C merupakan jumlah antara kedua ekspresi tersebut,
sehingga hasilnya adalah 11. Statemen di atas merupakan contoh statemen C# yang valid, karena
memang di sana terdapat tanda kurung, sementara jika tidak ada tanda kurung, maka statemen
seperti di bawah ini tidaklah valid:
C = A = 5 + B = 6;
Mengapa bisa begitu? Masalahnya adalah bahwa operator penambahan memiliki prioritas yang
lebih tinggi dibandingkan dengan operator penugasan, akan tetapi setelah proses penambahan
telah dieksekusi, maka bagian sebelah kiri dari tanda sama dengan ketiga bukanlah sebuah
variabel lagi. Contoh statemen ilegal lainnya adalah seperti di bawah ini:
A + 12;
Karena memang ekspresi tersebut tidak melakukan apapun atau tidak menyimpan nilai operasi
tersebut ke dalam variabel lainnya. Memang, di dalam bahasa C dan C++ statemen seperti di atas
adalah legal, tapi karena banyak programmer yang melakukan kesalahan dalam melakukan
pemrograman dengan kedua bahasa tersebut, C# sebagai bahasa modern membuang cara
penulisan seperti itu.
Increment Operator dan Decrement Operator
Para programmer yang menemukan bahasa C pada tahun 1969 mungkin tampaknya tidak
menyukai proses pengetikan yang banyak. Atau mungkin mereka sadar akan harga memori dan
media penyimpanan waktu itu sangatlah mahal. Apapun alasannya, para desainer bahasa C telah
menemukan beberapa “jalan pintas” yang kemudian menjadi fitur unggulan bahasa C, bahkan
bisa dianggap sebagai fitur paling populer. Bahasa C# tentu saja mengikuti popularitas tersebut
untuk mendapatkan popularitas yang lebih dari para programmer dalam bahasa C. Kita tidak
harus menggunakan jalan pintas tersebut, tapi memang hal tersebut seringnya dapat mengurangi
pengetikan yang kita lakukan, dan juga untuk membuat program kita terlihat lebih pendek, lebih
jelas, atau lebih mudah untuk dipahami.
Fitur yang dimaksud adalah untuk menambahkan sebuah nilai ke dalam sebuah variabel yang
telah ada. Sebagai contoh:
BukuYangHilang = BukuYangHilang + BukuYangHilangHariIni;
Kita tidak perlu mengetik variabel yang sama dua kali, jika memang kita hanya menambahkan
sesuatu kepada variabel tersebut. Bahasa C# mengizinkan kita untuk menyingkat penulisan
statemen di atas menjadi seperti di bawah ini:
BukuYangHilang += BukuYangHilangHariIni;
Perhatikan tanda plus di samping tanda sama dengan. Jika kita menyebutnya “plus sama dengan”
atau "plus equal", maka para programmer bahasa pemrograman keluarga C (C, C++, Java, atau
C#) akan mengetahui apa yang kita maksudkan. Tanda plus sama dengan secara formal di dalam
C# Language Specification disebut sebagai "compound assignment operator." Selain
penjumlahan, kita juga bisa menggunakan perkalian, pengurangan, pembagian, atau pembagian
sisa. Kita bisa menulis:
BukuYangHilang -= BukuYangDitemukanHariIni;
Berarti nilai yang berada di sebelah kanan akan dikurangkan dari variabel yang berada di sebelah
kiri.
Kita juga bisa menggunakan operator perkalian dengan menggunakan metode yang sama:
Budget /= 2;
Berarti variabel Budget akan bernilai setengah nilai variabel Budget sebelumnya, sementara:
Gaji *= 2;
Berarti nilai variabel Gaji akan bernilai 2 kali lebih besar dibandingkan dengan nilai variabel
Gaji sebelumnya.
Operator pembagian sisa juga valid di dalam statemen penugasan gabungan:
JumlahSisaKue %= OrangKelaparan;
Sebagai contoh, jika JumlahSisaKue adalah 11 dan OrangKelaparan sama dengan 3, dan masing-
masing dari mereka memiliki jumlah kue yang sama, maka nilai JumlahSisaKue akan memiliki
nilai 2.
Kita juga bisa menggunakan beberapa penugasan gabungan di dalam ekspresi yang besar, seperti
di bawah ini
C = (A += 4) / (B *= 7);
Kalau kita perhatikan contoh-contoh di atas, mungkin kita akan beranggapan bahwa hanya
variabel sajalah yang bisa digunakan di dalam beberapa penugasan gabungan. Tapi, sebenarnya,
kita bisa lho menggunakannya langsung dengan angka 1, sehingga nilai sebuah variabel
bertambah 1 atau berkurang 1. Sebagai contoh, saat melakukan pemilihan umum, perangkat
lunak yang digunakan sebagai penghitung suaranya akan merespons dengan instruksi seperti ini:
PemilihSBYJK=PemilihSBYJK+1;
Apa yang terjadi saat ekspresi di atas dieksekusi? Variabel PemilihSBYJK akan bertambah 1,
bukan? Seperti halnya kita ketahui kita dapat meringkas bentuk ekspresi di atas menjadi bentuk
seperti:
PemilihSBYJK+=1;
Atau kita juga bisa menggunakan satu buah plus tambahan, sehingga menjadi seperti di bawah
ini:
PemilihSBYJK++;
Nah, operator ++ disebut sebagai operator penaikan (increment operator). Operator tersebut
merupakan operator unary yang memiliki prioritas yang sangatlah tinggi. Tanda plus-plus
tersebut juga bisa diletakkan sebelum sebuah variabel, atau bahkan setelah variabel.
++PemilihSBYJK;
Kita juga menggunakan operator -- sebagai operator penurunan (decrement operator) yang dapat
digunakan untuk mengurangi nilai dari sebuah variabel:
PemilihSBYJK--;
atau operator itu bisa kita letakkan sebelum variabel:
--PemilihSBYJK;
Dalam beberapa statemen yang ditulis di atas sejauh ini, kita lihat tidak ada perbedaan antara
operator penaikan dan operator penurunan yang diletakkan sebelum variabel atau sesudahnya.
Akan tetapi, sebenarnya di sana ada sebuah perbedaan yang signifikan, apalagi kalau kita
menggunakannya di dalam ekspresi yang lebih besar. Sebagai contoh, anggap saya memiliki
sebuah variabel A yang memiliki nilai A, dan kita menulis program dengan di dalamnya terdapat
statemen berikut:
B = A++;
Apa yang akan terjadi? Statemen di atas akan menjadikan nilai B sama dengan nilai A, yakni 0,
lalu menaikkan nilainya. Setelah statemen di atas dieksekusi, maka nilai B adalah 0, sementara
nilai A adalah 1. Akan tetapi bandingkan dengan bentuk seperti ini:
B = ++A;
Apa yang akan terjadi? Statemen di atas akan menaikkan nilai variabel A lalu memberikan
nilainya kepada variabel B. Setelah statemen tersebut dieksekusi, kedua variabel A dan B
bernilai sama, yakni 1. Perhatikan perbedaannya: saat kita menggunakan A++ berarti, nilai A
akan dinaikkan setelah nilainya digunakan di dalam ekspresi, sementara ++A berarti nilai A
dinaikkan sebelum nilainya digunakan di dalam ekspresi.
Tipe data primitif bilangan bulat (integer)
Mengenal Data dan Tipe Data
Oke deh, sebelum melangkah lebih jauh, lebih baik kita belajar terlebih dahulu mengenai apa sih
tipe data itu. Data, adalah bentuk jamak dari Datum, yang berarti "to give" atau "to grant".
Secara literal, Datum berarti sebongkah informasi. Secara istilah, data dapat disamakan dengan
informasi yang diperoleh dari eksperimen atau survei yang digunakan sebagai dasar pengambilan
konklusi. Dalam ilmu komputer, data merujuk kepada informasi yang dapat diproses oleh
komputer, yang dapat berupa angka-angka, teks, gambar, suara, video, dan lain sebagainya yang
dapat disimpan di dalam memori komputer.
Sementara itu, menurut Wikipedia, tipe data atau data type dalam bahasa pemrograman merujuk
kepada definisi sekumpulan nilai dan operasi apa saja yang diizinkan terhadap nilai-nilai
tersebut.
Whew! Berat nggak definisinya? Oke, seiring dengan waktu kita akan belajar bahwa sebenarnya
tipe data itu nggak seberat definisinya—he-he!
Bilangan Bulat (Integer)
Bilangan bulat atau Integer (disebut juga sebagai int di dalam C#) hampir ditemukan di semua
tipe program. Oleh karena itu, adalah penting bagi seorang programmer untuk mengetahui secara
pasti apa itu integer, dan di mana letak kekuatan dan kekurangannya. Sebagai contoh, berapa sih
bilangan yang dapat ditampung di dalam tipe data integer? Untuk menjawabnya, kita bisa
menulis sebuah program C# yang menunjukkan jawabannya:
using System;
class Program0201
{
static void Main()
{
int x = 2;
Console.Title = "Program0201 (x=2)";
Console.WriteLine(x);
Console.WriteLine(x *= x);
Console.WriteLine(x *= x);
Console.WriteLine(x *= x);
Console.WriteLine(x *= x);
Console.WriteLine(x *= x);
Console.WriteLine(x *= x);
Console.WriteLine(x *= x);
Console.WriteLine(x *= x);
Console.WriteLine(x *= x);
Console.ReadKey();
}
}
Whew, kalau dilihat, kode sumber di atas adalah banyak yang sama. Untuk sementara, kita dapat
melakukan copy-paste saja dulu deh, meski di dalam C# ada metode yang jauh lebih efisien
(nanti juga akan dibahas). Oke, apa yang akan dikerjakan oleh program di atas? Program di atas
akan mendeklarasikan sebuah variabel dengan nama x dan tipe data int, dan kita memberinya
nilai 2. Dalam statemen-statemen selanjutnya akan melakukan perkalian dengan bilangan
sebelumnya, dan hasilnya pun akan ditampilkan, karena di sana telah terdapat metode
WriteLine(). Nah, saat dijalankan, program tersebut akan menghasilkan tampilan seperti
berikut:
Nah lho! Awalnya programnya benar menghasilkan nilai-nilai 2, 4, 16, 256, 65536, tapi habis
itu, kok malah hasilnya 0? Apakah ada yang salah? Misterius, bukan? Kenapa cuma lima nilai
saja yang dapat dihitung, sementara nilai keenam menghasilkan 0. Karena nilai x pada statemen
keenam adalah 0, maka nilai selanjutnya adalah 0 juga, karena bagaimanapun juga 0 dikalikan
dengan 0 selalu menghasilkan nilai 0!.
Nah, yang jadi pertanyaan "Kenapa 65536 dikalikan 65536 sama dengan 0?". Lalu, coba kita
modifikasi nilai x=2 di dalam program di atas dengan menggunakan nilai baru x=3, kenapa juga
hasilnya negatif?
Meski nilai-nilai hasil di atas terlihat sangatlah salah, nilai-nilai tersebut tidaklah dikeluarkan
oleh komputer secara acak, akibat "kegilaan". Meskipun sangatlah mengejutkan, nilai-nilai
tersebut sangatlah bisa ditebak. Oleh karenanya, untuk menghindari kebingungan kita akibat
adanya nilai-nilai seperti itu di dalam program "beneran" buatan kita, maka kita harus tahu
bagaimana variabel dengan jenis-jenis berbeda disimpan dan dimanipulasi di dalam komputer.
Binary Digit
Dalam komputer digital, semua informasi dikodekan sebagai sekumpulan 'bit', sebuah kata yang
berarti binary digit (digit biner). Sebuah bit adalah bentuk paling sederhana dari informasi
yang disimpan di dalam komputer digital. Lebih jauh lagi, dalam perangkat keras komputer,
sebuah bit merujuk kepada keberadaan tegangan listrik dan ketiadaannya. Akan tetapi, bagi
manusia, kita bisa menyimbolkan nilai dari sebuah bit sebagai 0 atau 1. Saat bit tertentu bernilai
0 atau 1, maka 0 dan 1 tersebut kadang-kadang disebut sebagai keadaan dari bit tersebut atau
bit state.
Sebuah bit mampu menampung dua keadaan, dan oleh karena itu bit tersebut akan mampu
membedakan antara dua buah kemungkinan yang sangat jauh berbeda: Ya atau tidak. Benar atau
salah. Hidup atau Mati. Halal atau Haram. Semuanya tergantung bagaimana bit tersebut
digunakan. Dua buah bit akan memunculkan empat buah keadaan yang berbeda: 00, 01, 10, dan
11. Tiga buah bit dapat meningkatkan keadaan menjadi delapan buah keadaan: 000, 001, 010,
011, 100, 101, 110, dan 111. Setiap tambahan bit, akan mengakibatkan keadaan menjadi dua kali
lipat lebih banyak. Untuk sebuah kumpulan bit, jumlah keadaan pun dapat dirumuskan menjadi:
2 pangkat bit
Komputer pribadi dengan prosesor Intel Pentium (Pentium, Pentium MMX, Pentium Pro,
Pentium II, Pentium III, dan Pentium 4) dan keluarganya yang kompatibel seperti AMD K6 dan
Athlon disebut sebagai komputer 32-bit karena memang mereka bekerja dengan menggunakan
potongan-potongan data berukuran 32 bit. Sementara itu komputer dengan prosesor Intel Core,
Intel Core 2, Intel Xeon, Intel Itanium, AMD Athlon 64, AMD Phenom, AMD Opteron dan Intel
Itanium 2 disebut sebagai komputer 64-bit, karena memang mereka bekerja dengan
menggunakan susunan 64-bit untuk satuan prosesnya. Beberapa komputer generasi awal hanya
dapat menangani 8 bit sekali jalan, dan kemudian 8 bit kini disebut sebagai 1 byte. Satuan byte
masih sering kita temukan di dalam komputer-komputer generasi terbaru: di dalam memori, hard
disk, USB flash drive, dan ukuran berkas komputer semuanya diukur dalam satuan byte.
Seiring dengan 0 dan 1 digabungkan menjadi satu, mereka pun akhirnya mulai terlihat seperti
susunan angka, dan memang hal tersebutlah yang terjadi. Seperti halnya ketika kita menulis
angka desimal sebagai kombinasi dari digit-digit desimal dari 0 hingga 9, kita juga bisa menulis
angka biner dengan menggunakan kombinasi dari digit biner, yakni 0 dan 1.
Bilangan Bulat Bertanda
Bahasa C# menggunakan 32 bit (atau setara dengan 4 byte) untuk merepresentasikan sebuah
variabel bertipe data int. Sebuah variabel bertipe data int dapat menyimpan nilai positif dan
negatif, sehingga definisi formal untuk int (dalam C# Language Specification) adalah 32-bit
signed integer (bilangan bulat bertanda 32-bit); kata "signed" berarti bahwa salah satu dari bit-
bit tersebut menandakan apakah sebuah angka yang dimaksud adalah negatif atau positif. Karena
int memiliki 32 bit, maka ia dapat menyimpan hingga 2 pangkat 32 nilai yang berbeda (tepatnya
4.294.967.296) Nilai-nilai tersebut dapat dibagi hampir sama rata antara bilangan positif dan
negatif. Mengapa saya katakan "hampir sama rata", karena memang di sana jumlah nilai positif
lebih sedikit dibandingkan dengan nilai negatif, dan hal tersebut dikarenakan salah satu dari
kombinasi-kombinasi bit haruslah mampu merepresentasikan 0. Nilai 0 desimal jika
direpresentasikan dalam tipe data int sama dengan 32 buah angka 0 yang disusun seperti :
0000-0000-0000-0000-0000-0000-0000-0000
Lho, kenapa ada tanda stripnya? Itu hanyalah untuk memudahkan kita untuk membacanya,
karenanya saya membaginya ke dalam kelompok bit berjumlah 4 digit. Dari angka 0, kita dapat
memulai penghitungan hingga angka-angka positif lainnya:
0000-0000-0000-0000-0000-0000-0000-0001 ekuivalen dengan 1 desimal
0000-0000-0000-0000-0000-0000-0000-0010 ekuivalen dengan 2 desimal
0000-0000-0000-0000-0000-0000-0000-0011 ekuivalen dengan 3 desimal
0000-0000-0000-0000-0000-0000-0000-0100 ekuivalen dengan 4 desimal
0000-0000-0000-0000-0000-0000-0000-0101 ekuivalen dengan 5 desimal
0000-0000-0000-0000-0000-0000-0000-0110 ekuivalen dengan 6 desimal
0000-0000-0000-0000-0000-0000-0000-0111 ekuivalen dengan 7 desimal
0000-0000-0000-0000-0000-0000-0000-1000 ekuivalen dengan 8 desimal
dan seterusnya, dan seterusnya. Setiap angka-angka biner tersebut merupakan angka sebelumnya
ditambah dengan 1. Menambah sebuah angka biner sama saja seperti menambah angka desimal:
kita dapat memulainya dari digit paling kanan, dan bekerja hingga ke kiri. Di dalam bilangan
biner, 0 ditambah 0 sama dengan 0, 0 ditambah 1 sama dengan 1, dam 1 ditambah 1 sama
dengan 10. Coba Anda tuliskan di kertas, kira-kira berapa nilai biner untuk 9 hingga 16?
Seperti yang telah kita ketahui, bahwa setiap bilangan desimal yang merepresentasikan nilai
pangkat 10 (seperti halnya 10/sepuluh, 100/seratus, 1000/seribu, 10000/sepuluh ribu, atau
bahkan 10000000000/satu miliar) terdiri atas 1 yang diikuti dengan satu nol/0 atau banyak nol.
Bilangan biner juga sama: bilangan biner yang merepresentasikan nilai dari pangkat 2 ditulis
sebagai sebuah bit 1 yang diikuti dengan satu nol hingga banyak nol. Sebagai contoh:
0000-0000-0000-0000-0000-0001-0000-0000
sama dengan 256 atau 28 dan
0000-0000-0000-0001-0000-0000-0000-0000
sama dengan 65.536 atau 216.
Fakta apa yang bisa kita ambil dari kejadian di atas? Ya, kita bisa mengubah bilangan biner
menjadi bilangan desimal dengan mudah. Setiap digit di dalam bilangan biner akan
merepresentasikan pangkat 2. Sebuah bilangan biner dengan lima buah bit bernilai 1 seperti di
bawah ini:
0000-0000-0000-0001-0000-0010-0000-1101
adalah hasil penjumlahan dari lima buah bilangan biner dasar pada tempat di mana setiap bit
bernilai 1:
0000-0000-0000-0000-0000-0000-0000-0001 atau 20 atau 1
0000-0000-0000-0000-0000-0000-0000-0100 atau 22 atau 4
0000-0000-0000-0000-0000-0000-0000-1000 atau 23 atau 8
0000-0000-0000-0000-0000-0010-0000-0000 atau 29 atau 512
0000-0000-0000-0001-0000-0000-0000-0000 atau 216 atau 65536
Maka totalnya adalah 1 + 4 + 8 + 512 + 65536 = 66061 dalam bilangan desimal.
Saat kita terus mengubah semua digit dalam susunan angka 32-bit, maka kita pada akhirnya akan
mendapatkan:
0111-1111-1111-1111-1111-1111-1111-1111
atau setara dengan 2.147.483.647.
Oke kita berhenti sejenak di sini terlebih dahulu. Di dalam contoh di atas, kita melihat mengapa
sih semua bit pertama dari angka 32-bit tersebut masih merupakan angka 0? Sebenarnya apa
yang kita lakukan adalah mencari nilai kombinasi dari 31 bit lainnya. Dan kita menemukan ada
231 atau 2.147.483.648 kombinasi, yang merepresentasikan angka desimal dari 0 hingga
2.147.483.647. Dengan 31 bit, kita tidak dapat menghitung semua angka hingga 2.147.483.648
karena kita membutuhkan sebuah kombinasi bit yang merepresentasikan angka 0. Jadi, angka
2.147.483.647 merupakan angka positif tertinggi yang bisa dicapai dengan menggunakan 32-bit
bilangan bulat bertanda (32-bit signed integer). Bilangan tersebut setara dengan 231-1.
Bit yang terletak pada sisi paling kiri, lazim dikenal dengan high bit, atau most significant bit
(MSB), dan saat membicarakan bilangan bulat bertanda (signed integer), bit yang terletak pada
sisi paling kiri juga disebut sebagai bit penanda. Setiap angka dengan bit penanda 1 adalah
negatif, sementara setiap angka dengan bit penanda 0 adalah positif. Cara yang dapat digunakan
untuk merepresentasikan bilangan bulat negatif di dalam komputer digital modern disebut juga
dengan komplemen dua, yang merujuk pada teknik yang digunakan untuk mengubah antara
bilangan positif dan negatif. Coba perhatikan daftar angka berikut ini, yang merupakan susunan
bilangan bulat negatif dengan panjang 32-bit:
1000-0000-0000-0000-0000-0000-0000-0000 sama dengan -2.147.483.648
1000-0000-0000-0000-0000-0000-0000-0001 sama dengan -2.147.483.647
1000-0000-0000-0000-0000-0000-0000-0010 sama dengan -2.147.483.646
1000-0000-0000-0000-0000-0000-0000-0011 sama dengan -2.147.483.645
Sebelumnya, saya pernah menyebutkan mengenai cara bagaimana menaikkan angka biner. Jika
kita menambahkan 1 pada setiap biner ke dalam angka-angka di atas, kita akan memperoleh nilai
yang lain. Tidak ada perbedaan di dalam peraturan penjumlahan hanya karena salah satu angka
tersebut dianggap negatif. Coba, teruskan hingga menyentuh angka 0:
1111-1111-1111-1111-1111-1111-1111-1100 sama dengan -4
1111-1111-1111-1111-1111-1111-1111-1101 sama dengan –3
1111-1111-1111-1111-1111-1111-1111-1110 sama dengan –2
1111-1111-1111-1111-1111-1111-1111-1111 sama dengan –1
Sekarang, jika kita tambahkan satu bilangan 1 lagi untuk mencapai nilai 0, maka kita akan
menjadikan bilangan tersebut bilangan 33-bit:
1-0000-0000-0000-0000-0000-0000-0000-0000
Akan tetapi, kita sedang berurusan dengan angka 32-bit di sini, dan bit yang ke-33 pun dapat
diabaikan. Menambahkan 1 dengan -1 akan menghasilkan bilangan berikut:
0000-0000-0000-0000-0000-0000-0000-0000
Atau merupakan angka 0, tempat kita mulai.
Saat berurusan dengan komplemen dua dalam bilangan bulat bertanda, kita akan melakukan
negasi (yakni pengubahan sebuah angka dari bilangan positif menjadi bilangan negatif dan
sebaliknya) dalam dua langkah. Langkah pertama adalah kita memutar semua bit yang ada, yang
bisa dilakukan dengan menjadikan semua bit bernilai 1 menjadi bit bernilai 0, dan semua bit
bernilai 0 menjadi bit bernilai 1. Jika sudah, selanjutnya kita menambahkan angka 1 di depannya.
Oke, sekarang jelas kan, bahwa sebuah bilangan bulat 32-bit bertanda dapat memiliki jangkauan
dari -2.147.483.648 hingga 2.147.483.647. Beberapa perhitungan (seperti halnya bilangan
65.536 dikalikan dengan bilangan 65.536 seperti di dalam program0201 kita di atas), akan
menghasilkan sebuah nilai di luar daya tampungnya, yakni 4.294.967.296, yang jika
dikonversikan ke dalam bilangan binernya memiliki 33 bit:
1-0000-0000-0000-0000-0000-0000-0000-0000
Akan tetapi, karena hanya 32-bit saja jatah yang tersedia untuk menyimpan hasilnya, hanya 32-
bit terendah lah yang dipertahankan. Bilangan 1 yang terletak di kiri yang merupakan bit yang
paling signifikan akan diabaikan dan dibuang, sehingga hasil akhirnya adalah 0. Sehingga, saat
berurusan dengan bilangan bulat berukuran 32-bit, nilai 232 pun akan bernilai 0.
Sekilas, representasi 32-bit tersebut seolah-olah menjadi sebuah lingkaran setan. Saat kita
menambahkan 1 kepada nilai biner -1, dan mempertahankan hanya 32-bit bit terbawah, maka
kita akan mendapatkan 0. Hal tersebut normal saja. Akan tetapi, berikut adalah nilai dalam
bilangan biner dari 2.147.483.647:
0111-1111-1111-1111-1111-1111-1111-1111
dan, saat menambahkan 1 ke dalam nilai tersebut, hasilnya adalah:
1000-0000-0000-0000-0000-0000-0000-0000
atau sama dengan -2.147.483.648. Dengan kata lain, kode di bawah ini:
int A = 2147483647;
Console.WriteLine(A + 1);
Akan menampilkan hasil:
–2147483648
Dalam versi Program0201 yang kita modifikasi dengan mengubah nilai x menjadi 3, saat nilai
43.046.721 dikalikan dengan dirinya akan menghasilkan sebuah bilangan negatif. Lho kok bisa?
Kita cari tahu yuk! Representasi biner dari bilangan 43.046.721 adalah:
0000-0010-1001-0000-1101-0111-0100-0001
Normalnya, jika kita mengalikan bilangan tersebut dengan dirinya sendiri akan menghasilkan
1.853.020.188.851.841, atau jika direpresentasikan dalam bilangan biner, hasilnya adalah:
0110-1001-0101-0100-1111-1110-0010-0001-1110-0011-1110-1000-0001
Akan tetapi, karena saat itu nilai X direpresentasikan di dalam bilangan bulat 32-bit, maka hanya
32-bit bit terendah sajalah yang akan dianggap dalam perhitungan tersebut:
1110-0010-0001-1110-0011-1110-1000-0001
Kalau kita lihat, bit tertingginya adalah 1, yang berarti bahwa bit tersebut adalah bilangan
negatif. Untuk mencari berapa sih nilainya, balikkan saja semua bitnya menjadi:
0001-1101-1110-0001-1100-0001-0111-1110
Lalu, tambahkan 1:
0001-1101-1110-0001-1100-0001-0111-1111
Dan hasilnya adalah 501.334.399, yang berarti hasil perkalian dari 43.046.721 dengan dirinya
sendiri akan dipotong menjadi 32-bit, yakni -501.334.399. Coba lihat, berapa hasilnya? Sama
tidak?
Overflow dan Underflow
Kok, ada anomali ya? Katanya komputer barang yang canggih, tapi kenapa ya? Sebelumnya saya
pernah katakan bahwa komputer adalah barang yang bego, yang tidak akan bergerak tanpa ada
instruksi! Komputer, hanya bisa kita anggap sebagai budak saja lah. Lalu kenapa terjadi anomali,
karena di sana terjadi apa yang disebut dengan overflow dan underflow. Nah lho apa lagi tuh?
Kejadian overflow akan terjadi saat nilai sebuah bilangan bulat melebihi nilai positif
maksimumnya, sementara underflow akan terjadi saat nilai sebuah bilangan bulat kurang dari
nilai negatif minimumnya. Tapi, para programmer seringnya menggunakan kata "overflow" saja
untuk menjelaskan kedua fenomena tersebut. Program-program C# pada dasarnya mengizinkan
adanya overflow, karena C# dapat melakukan penjumlahan, pengurangan perkalian, dan
pembagian terhadap bilangan bulat tanpa adanya kekhawatiran apakah nantinya hasilnya dapat
ditampung pada ruangan 32-bit atau tidak. Mengabaikan overflow dalam melakukan perhitungan
aritmetika terhadap bilangan bulat adalah sebuah cara yang paling efisien dan paling cepat
dilakukan oleh komputer. Komputer, namanya saja budak bego, akan terus saja meneruskan
perhitungan tersebut tanpa harus berhenti sejenak untuk mengecek apakah terjadi overflow atau
tidak.
Meskipun beberapa program aplikasi mungkin dapat mengambil keuntungan dari overflow
bilangan bulat, dalam banyak kasus, overflow menjadi sebuah masalah dan dianggap menjadi
sebuah bug di dalam kode kita. Sebagai contoh, program sebuah bank yang menerima uang
hingga miliaran rupiah, adalah sebuah program yang tidak menerima overflow, karena ketika
seorang nasabah memiliki hutang -2.147.483.647 rupiah dalam saldo, lalu ada bunga 1 rupiah,
maka saldonya akan berubah menjadi 2.147.483.648, yang berarti hal tersebut berubah menjadi
keuntungan buat si penghutang tersebut. Siapa penjahatnya? Bukannya teller atau kasir, tapi
overflow lah yang jadi penjahatnya.
Teknik pertama melibatkan kompiler C# itu sendiri. Kita dapat menginstruksikan kompiler C#
untuk membuat kode yang mampu melakukan pengecekan terhadap overflow terhadap bilangan
bulat. Ini merupakan contoh dari opsi kompiler. Untuk mengilustrasikannya, marilah kita
kembali ke contoh program Program0201.cs.
Jika kita menggunakan Microsoft Visual Studio atau Microsoft Visual C# Express Edition,
bukalah jendela properti Program0201 dengan cara mengklik kanan pada proyek yang
bersangkutan lalu memilih menu Properties. Pada Project Properties yang keluar selanjutnya,
bukalah tab Build. Di sana ada sebuah tombol Advanced, dan tekanlah tombol tersebut untuk
memunculkan Advanced Build Settings seperti yang terlihat pada gambar berikut. Centanglah
checkbox Check for arithmetic overflow/underflow. Lalu tekan OK untuk menutup kotak
dialog tersebut.
Lakukan kompilasi, dan jalankan programnya. Saat program Program0201 berjalan, program
tersebut akan menampilkan lima buah baris pertama, sebelum akhirnya akan memunculkan
sebuah eksepsi.
Kita juga sebenarnya bisa melakukan pengecekan terhadap overflow pada ekspresi-ekspresi
secara individual di dalam kode sumber dengan menggunakan operator checked. Statemen
berikut:
B = checked(5 * A);
akan mengeluarkan sebuah eksepsi, meskipun kita telah membuang tanda centang pada opsi
Check for arithmetic overflow/underflow, jika memang di dalam ekspresi tersebut akan
menghasilkan sebuah nilai yang berada di luar jangkauan. Lawan dari operator checked adalah
unchecked, sehingga ekspresi di atas diubah menjadi seperti:
B = unchecked(5 * A);
sehingga ekspresi tersebut tidak akan mengeluarkan eksepsi, meski opsi Check for arithmetic
overflow/underflow kita telah centang.
Kita juga bisa menggunakan operator checked dan unchecked dalam sebuah blok kode (yang
diapit oleh tanda kurung keriting { dan }). Perhatikan contoh berikut:
checked
{
A += 1000000;
B = B * A;
}
Setiap statemen yang berada di dalam blok tersebut yang nantinya akan menghasilkan overflow
dalam operasi aritmetika akan mengeluarkan eksepsi. Operator unchecked juga bisa digunakan
sebagai lawan dari checked.
Pilihan ketiga adalah dengan menggunakan pilihan kompiler C# (csc.exe) dengan tambahan
switch /checked+ untuk mengaktifkan proses pengecekan atau /checked- untuk menonaktifkan
proses pengecekan.
csc.exe Program0201.cs /checked+
(perintah ini sama saja dengan opsi Check for arithmetic overflow/underflow dalam
SharpDevelop atau IDE lainnya.)
Jadi, kita punya banyak pilihan. Kita juga bisa mengizinkan kalkulasi aritmetika untuk terus
maju tanpa memperhatikan kemunculan overflow (yang mungkin akan menyebabkan kesalahan
di dalam hasilnya), atau kita bisa menghentikan kalkulasi seperti ini untuk menyebabkan sebuah
eksepsi. Untuk saat ini, memang tidak ada pilihan lagi, karena memang eksepsi bisa
menghentikan proses eksekusi program. (sebenarnya ada sebuah cara tentang bagaimana sebuah
program dapat mendeteksi kapan eksepsi dapat dimunculkan dan dapat kembali ke dalam proses
eksekusi saat program selesai melakukan eksekusi. Tapi saat ini kita belajar ini dulu saja ya).
Mungkin, kita berkata "ah lebih baik gunakan opsi /checked+ saja lah, biar nantinya program
yang saya buat nggak akan muncul overflow, toh overflow akan mematikan program saya!" Jujur
saja, saya menentang hal tersebut! Mengaktifkan pengecekan overflow untuk semua operasi
aritmetika dapat menurunkan performa dan kecepatan program yang kita buat. Oke, yang saya
tentang adalah ketika kita membuat program untuk didistribusikan ke pengguna, kita
mengaktifkan opsi pengecekan overflow, tapi saat kita mengembangkan program kita, ya nggak
apa-apa lah! Toh yang menggunakan program, kita-kita juga. Saran saya, gunakan saja operator
checked dan unchecked pada statemen dan ekspresi yang mungkin akan membuat eksepsi
overflow, daripada menggunakan opsi /checked+ atau /checked-, sebelum kita belajar
mengenai penangan eksepsi secara lebih elegan!
Bilangan Bulat Bertanda
Whew! Mungkin yang ada di dalam pikiran kita, kenapa sih saya menggunakan int melulu
seolah-olah C# hanya mendukung int? Oke deh. Saya kembali ke jalan lagi. Tipe data int
memang merupakan tipe data yang paling populer, akan tetapi sebenarnya, C# mendukung
keberadaan tipe data lainnya lho.
Anggap kita sedang menangani data populasi manusia di Indonesia. Pasti, tidak ada penduduk
yang dianggap negatif oleh komputer, sehingga kenapa juga kita menggunakan signed integer?
Lagian, kita juga nggak bakal menggunakan setengah nilai dari total nilai yang disediakan oleh
signed integer (berarti semiliar data, wow! Padahal Indonesia kan cuma 250 juta jiwa doang).
Lalu, apa dong yang bisa digunakan? Kita bisa menggunakan unsigned integer (bilangan bulat
tidak bertanda), ketimbang kita menggunakan bilangan signed integer (bilangan bulat bertanda).
Bahasa C# mendukung tipe data bilangan bulat tidak bertanda berukuran 32-bit, yang disebut
dengan uint. Cara bacanya: "you int". Kita bisa mendeklarasikan uint sebagaimana kita
mendeklarasikan int, dengan cara:
uint A;
Bilangan bulat tak bertanda tidak memiliki bit penanda (sign bit). Bit yang paling kiri (most
significant bit) akan dianggap sama seperti halnya bit yang lain. Seperti halnya int, uint juga
dimulai dari 0:
0000-0000-0000-0000-0000-0000-0000-0000
Dan terus menerus naik hingga nilai maksimum dari int:
0111-1111-1111-1111-1111-1111-1111-1111 atau setara dengan 2.147.483.647
Akan tetapi, tidak seperti int, uint akan terus menerus mendapatkan nilai positif:
1000-0000-0000-0000-0000-0000-0000-0000 atau setara dengan 2.147.483.648
Hingga nilai maksimum positifnya:
1111-1111-1111-1111-1111-1111-1111-1111 atau setara dengan 4.294.967.295
sehingga, tipe data uint dapat menyimpan nilai dari 0 hingga 4.294.967.295 (232-1). Sebuah tipe
data uint saat ini mampu menangani data populasi orang Indonesia, dan mungkin semua negara
di dunia. Akan tetapi, saat harus menghadapi jumlah populasi seluruh manusia di Bumi, uint pun
takluk!
Sama seperti tipe data int, uint juga dapat terkena "kutukan" overflow dan underflow. Perhatikan
contoh di bawah ini:
uint A = 4294967295;
A += 1;
Variabel A akan menghasilkan nilai 0 jika pengecekan overflow terhadap integer tidak
dilakukan, atau bernilai 1 saat pengecekan overflow dilakukan.
Bilangan bulat kurang dari 32-bit
Kita juga bisa menggunakan bilangan bulat yang lebih kecil daripada 32-bit. Jika bilangan bulat
64-bit dinamakan dengan long (yang berarti panjang dalam bahasa Inggris), maka lawan dari
long adalah short. Untuk bilangan short tidak bertanda, digunakanlah tipe data ushort.
Panjangnya berapa sih si short ini? Dalam C#, short memiliki panjang hingga 16-bit, sehingga
mampu menampung nilai dari 0 hingga 65536. Tipe data short bertanda memiliki jangkauan dari
-32768 hingga 32767, sementara tipe data ushort memiliki jangkauan dari 0 hingga 65536.
Selain short dan ushort, C# juga memiliki sebuah tipe data lagi yang digunakan untuk
menyimpan bilangan bulat dengan panjang 8-bit, sehingga totalnya mampu menampung 256
buah angka. Seperti halnya bilangan bulat lainnya, tipe data ini juga terbagi atas dua buah jenis,
yakni bertanda (sbyte) dan tidak bertanda (byte). Tipe data sbyte dapat memiliki nilai dari -
127 hingga 128, sementara byte dapat memiliki nilai dari 0 hingga 255.
Tipe-tipe data seperti int, long, dan short semuanya merupakan tipe data bilangan bulat
bertanda; sementara uint, ulong, dan ushort merupakan tipe data bilangan bulat tak bertanda.
Kita bisa membedakan antara keduanya dengan melihat keberadaan huruf "u" di sana. Akan
tetapi, untuk bilangan bulat 8-bit, penamaannya dibalik: byte merupakan tipe data bilangan bulat
tidak bertanda, sementara sbyte merupakan bilangan bulat bertanda.
Beberapa pertimbangan
Secara umum, meski jika sebuah variabel tertentu hanya digunakan untuk menyimpan bilangan
bulat dengan nilai kurang dari 32767, kita lantas nggak harus menggunakan short ketimbang int.
Prosesor 32-bit modern saat ini dapat menangani nilai 32-bit dengan lebih mudah dan efisien jika
dibandingkan dengan 16-bit.
Rumus umum yang bisa digunakan untuk menulis variabel bilangan bulat adalah “saat
membutuhkan bilangan bulat, mulailah dari int.” Tipe data int mungkin menjadi pilihan terbaik
untuk sebagian besar kebutuhan terhadap bilangan bulat yang kita butuhkan. Jika memang kita
membutuhkan nilai yang lebih besar lagi, maka gunakanlah long.
Tipe data Integer dan .NET Framework
Pada Modul 2, saya menyebutkan bagaimana caranya untuk mengakses dokumentasi yang
terdapat di dalam .NET Framework. Jika kita telusuri ruang nama System di dalam
dokumentasi .NET Framework, kita akan menemukan sebuah struktur dengan nama Int32.
Nama "int" dalam C# sebenarnya merupakan alias (singkatan atau nama lain yang lebih pendek)
bagi struktur System.Int32 yang terdapat di dalam .NET Framework. Tujuh tipe data bilangan
bulat lainnya juga merupakan alias untuk struktur-struktur lainnya. Ketimbang kita
menggunakan sebuah variabel dengan menggunakan bahasa C#:
int A;
kita juga bisa mendeklarasikannya dengan menggunakan nama struktur .NET:
System.Int32 A;
Kedua statemen di atas adalah 100% sama! Atau, bahkan jika kita telah menggunakan direktif:
using System;
pada bagian atas kode kita, kita bahkan menyingkat pendeklarasian bilangan bulat bertanda
berukuran 32-bit dengan menggunakan statemen:
Int32 A;
Dan sekarang, ketimbang kita mengatakan bahwa kita mendeklarasikan sebuah variabel dengan
tipe data int, atau kita membuat objek dengan tipe data int, kita juga bisa menyebut hal tersebut
sebagai pembuatan sebuah kejadian (instance) dari struktur System.Int32. Whew! Apa lagi
tuh? Tapi, jika Anda bertanya kepada para programmer bahasa berorientasi objek, mereka akan
menjawab pilihan ketiga, ketimbang pilihan pertama dan kedua.