November 2, 2017

2220 words 11 mins read

Java dan OOP - Bagian 1

Java dan OOP - Bagian 1

Artikel berikut tentang bahasa Java pernah diterbitkan sebagai bagian dari buku versi cetak lebih dari 6-7 th yg lalu. Beberapa (akan) diperbaharui dan disesuaikan. Mudah-mudahan masih berguna buat yg baru belajar pemrograman, Java khususnya. Walaupun akan disesuaikan dengan kondisi saat ini, bahasa Java yg dimaksud dalam artikel ini adalah bahasa Java lawas, tidak mencakup fitur-fitur modern seperti pada versi Java 7, 8 atau yg lebih baru lagi.

Sebuah bahasa pemrograman mendefinisikan istilah-istilah (words) dan simbol-simbol yang bisa digunakan untuk menulis sebuah program. Selain itu, bahasa pemrograman juga menerapkan aturan-aturan yang harus diikuti dalam menyusun istilah dan simbol sehingga membentuk pernyataan (statements) yang valid. Bahasa pemrograman Java dibuat oleh Sun Microsystems (yg sudah diakuisisi Oracle) dan diperkenalkan pertama kali pada tahun 1995.

Bahasa pemrograman Java didisain sebagai bahasa yang “netral” terhadap arsitektur komputer dimana program akan dijalankan. Hal ini dimungkinkan dengan proses kompilasi kode sumber (source code) kedalam format bytecode. Proses eksekusi program Java secara ringkas dapat dilihat pada Gambar 1.1. Dengan mekanisme seperti ini, program yang didistribusikan dalam format bytecode dikatakan cross-platform, dapat dijalankan pada bermacam-macam jenis komputer / sistem operasi, selama tersedia bytecode interpreter yang sesuai.

Gambar 1.1. Kompilasi dan eksekusi program Java

Bahasa Java merupakan bahasa pemrograman yang berorientasi objek (OOP – Object Oriented Programming). Dalam bahasa OOP seperti Java, objek (object) merupakan entitas fundamental, yang secara efektif dapat digunakan untuk merepresentasikan entitas nyata. Misalnya, kalau entitas nyata ini merujuk pada pegawai di sebuah perusahaan, maka “objek pegawai” akan menangani semua proses dan manajemen data yang terkait dengan pegawai tertentu.

Sebuah objek mempunyai state (status/keadaan) dan behavior (perilaku). State dari objek merupakan atribut atau karakteristik yang menerangkan keadaan objek terkait. Misalnya sebuah objek rekening bank, mempunyai state yang berhubungan nomor rekening dan jumlah saldo. Behavior objek merupakan sesuatu yang bisa dilakukan oleh/pada objek ybs. Untuk objek rekening bank, behavior bisa berupa aksi menabung atau mengambil saldo. Perlu dicatat bahwa behavior objek dapat mengubah dan mempengaruhi state objek tersebut.

Kelas menggunakan metode (method) untuk mendefinisikan behavior objek. Dalam konteks pemrograman Java untuk aplikasi, sebuah metode yang disebut main() merupakan representatif logika program atau entry point, dimana alur aplikasi secara keseluruhan tercermin didalamnya. Sedangkan state/atribut objek didefinisikan oleh data (member) dalam kelas yang bersangkutan, yang dapat berbentuk konstanta atau variabel. Struktur dari sebuah kelas dapat dilihat pada Gambar 1.2.

Gambar 1.2. Struktur sebuah kelas dalam Java

Program Java terdiri dari satu atau beberapa kelas. Sebuah kelas dibentuk dari metode dan data. Metode merupakan sekumpulan perintah/pernyataan. Sedangkan data member dapat berupa data primitif (sederhana) atau berupa referensi ke objek lain.

Sebuah kelas dapat digunakan untuk membuat atau “menurunkan” (inherit) kelas yang lain, sehingga membentuk struktur hirarki. Kelas yang berada pada level hirarki bawah “mewarisi” sifat-sifat (metode & data dari) kelas hirarki diatasnya.

Gambar 1.3. Hirarki kelas dan dua contoh objek

Gambar 1.3 menunjukan contoh hirarki kelas untuk entitas kendaraan darat. Kelas mobil dan sepeda motor diturunkan dari kendaraan, sehingga kedua kelas ini mewarisi sifat / konsep kelas induknya (kendaraan darat). Jika kendaraan darat mempunyai atribut tipe, jumlah kilometer dan warna, maka baik kelas mobil maupun kelas sepeda motor akan mempunyai sifat-sifat tersebut tanpa harus mendeklarasikan ulang. Disebelah kanan gambar, dapat dilihat dua buah contoh objek yang merupakan realisasi kelas mobil.

Dalam terminologi OOP, proses menurunkan sebuah kelas baru dari kelas yang telah ada disebut sebagai inheritansi (inheritance). Proses ini merupakan proses yang fundamental dan penting dalam pembuatan kode program yang reusable. Komponen software yang telah ada atau pernah dibuat dapat langsung digunakan, dimodifikasi dan diperluas tanpa harus menulis “semua lagi” dari awal.

Sehingga software yang didisain dengan baik, akan meningkatkan nilai kegunaan dan efisiensi dalam hal waktu serta tenaga untuk pemeliharaan dan pengembangan lebih lanjut.

Komponen Bahasa Java

Seperti telah disebutkan di atas, sebuah bahasa pemrograman mendefinisikan istilah, simbol dan aturan untuk penyusunan program. Di bagian ini, kita akan membahas beberapa elemen bahasa Java sebagai tinjauan singkat untuk menyegarkan kembali ingatan kita yang sudah pernah berkenalan dengan bahasa Java sebelumnya atau sebagai bahan kajian awal bagi pemula. Walau bagaimanapun, cakupan pembahasan ini tidak dimaksudkan sebagai bahan komprehensif yang meliputi semua aspek bahasa Java dan pemrograman berorientasi objek. Sebagai catatan tambahan, pembahasan elemen bahasa Java yang akan disajikan di bawah ini tidak didasarkan pada pembagian sistematik, melainkan pada aspek-aspek yang nanti akan sering dijumpai ketika kita berinteraksi dan menyusun program melalui pendekatan visual seperti yg akan dibahas selanjutnya.

Komentar

Komentar merupakan bagian program yang tidak akan diproses oleh compiler. Komentar dalam Java dapat ditulis dalam tiga bentuk:

  • menggunakan karakter slash ganda: // ...
  • menggunakan komentar dengan style bahasa C: /* ... */
  • menggunakan format komentar javadoc: /** ... */

Komentar dengan slash ganda hanya berlaku untuk satu baris (diawali dengan karakter // tersebut). Sedangkan komentar dengan format yang lain, bisa digunakan untuk sejumlah baris (diawali dengan /* atau /** dan diakhiri dengan */).

Pengenal (Identifier)

Pengenal dalam Java bersifat case-sensitive, berupa huruf, angka, underscore (_) dan karakter dollar ($). Konvensi dalam pemilihan pengenal adalah sbb:

  • title-case untuk nama kelas, misalnya MyClass
  • upper-case untuk konstanta, misalnya MAXIMUM

Secara umum ada tiga jenis pengenal:

  • yang dipilih sendiri oleh pemrogram, misalnya: jumlah, MyClass.
  • yang digunakan oleh pustaka (library) bahasa Java, misalnya: println.
  • reserved-words (pengenal khusus) yang digunakan oleh core bahasa Java, misalnya: void, class. Pengenal jenis ini mempunyai makna khusus untuk bahasa Java, dan tidak bisa digunakan untuk kepentingan lain. Reserved-words dalam Java diberikan dalam Tabel 1.1.
    Tabel 1.1. Reserved-words (pengenal khusus) dalam Java

White-Space

Seperti dalam bahasa pemrograman lain pada umumnya, white space dalam Java terdiri dari spasi, baris kosong atau tab, digunakan untuk memisahkan simbol / istilah dalam program. White-space bisa digunakan untuk memformat kode program supaya lebih mudah dibaca. Untuk memisahkan elemen satu dengan lainnya hanya diperlukan sebuah karakter white-space. Karakter white-space ekstra akan diabaikan oleh compiler Java.

Gambar 1.4. Beberapa elemen dalam sebuah program Java

Variabel dan Konstanta

Variabel adalah nama untuk sebuah lokasi penyimpan (memory). Variabel harus dideklarasikan dengan menyebutkan nama dan tipe dari informasi yang akan disimpan. Selain itu, pada saat deklarasi, sebuah variabel dapat di-inisiasi dengan diberikan nilai awal. Contoh:

int jumlah, count;
int awal = 32, maksimum = 150;

Konstanta merupakan pengenal yang serupa dengan variabel, kecuali bahwa ia menyimpan nilai yang sama dan tidak berubah selama program berjalan. Compiler akan memberikan pesan kesalahan bila kita mencoba untuk mengubah nilai sebuah konstanta. Dalam Java, sebuah konstanta dibentuk dengan menggunakan kata kunci final. Contoh:

final int MIN_HEIGHT = 70;

Konstanta berguna setidaknya untuk tiga alasan. Alasan pertama adalah untuk memberikan arti. Dalam contoh di atas, istilah MIN_HEIGHT mempunyai arti yang lebih daripada hanya menggunakan literal 70. Kedua, adalah untuk memfasilitasi dan mempermudah penulisan dan pemeliharaan program. Jika sebuah konstanta digunakan di banyak tempat, nilainya bisa diubah hanya dari satu tempat saja. Terakhir, adalah untuk membuat sebuah “nilai” yang tidak berubah sehingga menghindari kesalahan yang bisa terjadi, terutama bagi pihak atau programmer lain yang memanfaatkan program kita.

Konstanta dan variabel dapat menyimpan data primitif (sederhana). Tipe primitif dalam Java terdiri dari 8 jenis: 4 untuk bilangan bulat (integer), 2 untuk bilangan real (floating point) dan masing-masing 1 untuk karakter dan boolean. Perbedaan utama antara tipe data primitif yang berjenis sama adalah dalam hal ukuran penyimpanan,yang akhirnya menentukan nilai maksimum/minimum yang bisa disimpan didalamnya. Tipe data bilangan integer dan real beserta ukuran penyimpanan dan nilai maksimum/minimumnya diberikan oleh Tabel 1.2.

Tabel 1.2. Tipe data primitif integer dan real

Ekspresi dan Operator

Ekspresi adalah sebuah kombinasi dari satu atau lebih operator dan operand. Contoh yang sering kita jumpai adalah, ekspresi aritmetika yang menghitung nilai numerik menggunakan operator aritmetika (Tabel 1.3).

Tabel 1.3. Operator aritmetika

Beberapa catatan untuk ekspresi aritmetika:

  • Jika salah satu atau kedua operand dari operator aritmetika bertipe real, maka hasilnya juga bertipe real
  • Jika kedua operand untuk operator pembagian adalah integer, hasilnya juga bertipe integer (sisa pembagian diabaikan)
  • Operator remainder memberikan nilai sisa pembagian operand pertama oleh operand kedua
  • Perkalian, pembagian dan remainder dievaluasi lebih dulu daripada penambahan dan pengurangan (lihat kolom prioritas dalam tabel di atas). Operator aritmetika dengan prioritas yang sama dieksekusi dari kiri ke kanan, tanda kurung bisa digunakan untuk mengubah urutan eksekusi

Operator penugasan (assignment operator) mempunyai prioritas yang lebih rendah dibandingkan dengan operator aritmetika. Dalam pernyataan berikut:

jumlah = total / 4 + tinggi;

sisi sebelah kanan dari tanda = akan dievaluasi terlebih dahulu, kemudian hasilnya akan disimpan dalam variabel jumlah disisi kiri. Sisi kiri dan kanan dari pernyataan penugasan dapat mengandung variabel yang sama, misalnya count=count+1;. Aturan yang sama seperti di atas masih berlaku, artinya pertama kali akan dievaluasi count+1 kemudian hasilnya akan disimpan dalam variabel count dengan menggantikan nilai sebelumnya (overwriting).

Kasus di atas cukup sering terjadi dalam penulisan program, yaitu ketika kita harus melakukan operasi tertentu pada sebuah variabel dan menyimpannya kembali dalam variabel yang sama (variable updating). Java menyediakan beberapa operator penugasan dan operator increment/decrement untuk menyederhanakan proses variable updating (Tabel 1.4).

Tabel 1.4. Increment, decrement dan beberapa assignment operator

Sisi kanan dari sebuah operator penugasan bisa berupa ekspresi yang kompleks. Walaupun demikian, seluruh ekspresi di bagian kanan akan dievaluasi terlebih dahulu, sebelum hasilnya dikombinasikan dengan variabel di sebelah kiri. Selain itu perilaku dari sebuah operator penugasan (misalnya +=) selalu konsisten dengan perilaku operator aritmetika yang bersangkutan (dalam hal ini +).

Ekspresi Kondisional

Urutan eksekusi pernyataan dalam program adalah linear, satu-per-satu secara berurut. Karena dalam banyak kasus kita memerlukan fasilitas untuk:

  • memutuskan apakah kita wajib mengeksekusi sebuah (blok) pernyataan atau tidak; atau
  • untuk mengeksekusi sebuah (blok) pernyataan berulang-ulang

maka, bahasa pemrograman menyediakan fasilitas untuk kontrol aliran eksekusi program (flow of control) yang didasarkan pada kondisi atau ekspresi boolean.

Pernyataan kondisional dalam Java yang tanpa melibatkan repetisi (looping) adalah pernyataan if beserta variasinya dan pernyataan switch.

Gambar 1.5. Pernyataan kondisional if beserta interpretasi alur eksekusinya
Gambar 1.6. Pernyataan kondisional switch

Sintaks dan alur eksekusi dari pernyataan if ditampilkan dalam Gambar 1.5. “Pernyataan_1” akan dieksekusi jika “kondisi” bernilai benar (true). Jika „kondisi“ bernilai false, maka “pernyataan_2” yang akan dijalankan. Pengenal else dalam pernyataan if adalah opsional. Diantara blok if dan else masih bisa disisipkan sejumlah blok dengan pengenal else if (kondisi).

Sintaks untuk pernyataan switch diilustrasikan dalam Gambar 1.6. Ekspresi yang dimaksud sebagai argumen switch harus berupa ekspresi yang menghasilkan bilangan integer atau karakter (byte, short, int, long atau char). Dengan kata lain, ekspresi dengan yang menghasilkan nilai boolean dan bilangan real tidak diperbolehkan. Kondisi yang digunakan secara implisit dalam pernyataan switch (antara ekspresi dengan valueX dalam Gambar 1.6) adalah kondisi ekualitas. Pemeriksaan relasi (relational check) baik pada ekspresi maupun pada valueX tidak bisa dilakukan dengan pernyataan switch. Penggunaan pengenal break dan default dalam pernyataan switch adalah opsional. Fungsi keduanya adalah:

  • break digunakan supaya setelah mengeksekusi pernyataan-pernyataan pada case valueX yang sesuai, aliran eksekusi dialihkan ke bagian akhir dari blok pernyataan switch;
  • default digunakan untuk menentukan operasi yang harus dilakukan bila switch tidak menemukan case yang sesuai.

Ekspresi boolean (kondisi) sering menggunakan operator relasional dan operator logika. Operator relasional diberikan dalam Tabel 1.5. Operator relasional == akan memeriksa apakah operand disebelah kanan dan kiri bernilai sama. Hal ini berbeda dengan operator penugasan (assignment operator) = yang akan mengasosiasikan nilai ekspresi sebelah kiri dengan variabel di sebelah kanan.

Sebagai catatan, untuk ekspresi yang kompleks dengan melibatkan banyak operator, prioritas operator aritmetika lebih tinggi dari operator relasional. Dan prioritas operator relasional lebih tinggi dari operator logika.

Tabel 1.5. Operator relasional dan logika untuk ekspresi boolean

Pernyataan if dengan sebuah else (Gambar 1.5) dapat disederhanakan menggunakan operator kondisional, dengan sintaks sbb:

kondisi ? ekspresi_1 : ekspresi_2

Jika kondisi bernilai true, maka ekspresi_1 yang akan dievaluasi. Sedangkan jika kondisi bernilai false, ekspresi_2 yang akan dijalankan. Nilai yang diberikan oleh operator kondisional secara keseluruhan adalah nilai dari ekspresi yang dipilih. Contoh:

bilangan = ((num1 >num2) ? num1 : num2);

Nilai dari bilangan akan sama dengan num1 bila num1 lebih besar dari num2. Sebaliknya, bila num1 lebih kecil atau sama dengan num2, maka nilai dari bilangan akan sama dengan num2. Pernyataan diatas ekivalen dengan pernyataan if else berikut:

if (num1 >num2)  bilangan = num1;
else bilangan = num2;

Repetisi / Loop

Fungsionalitas repetisi atau pengulangan dapat dibentuk oleh tiga buah pernyataan: while, do dan for. Seperti pernyataan kondisional, pernyataan repetisi juga dikontrol oleh ekspresi boolean.

Sintaks pernyataan while dapat dilihat dalam Gambar 1.7. Jika kondisi bernilai true maka pernyataan akan dieksekusi. Jika bagian akhir blok sudah tercapai, proses yang sama akan diulang. Apabila kondisi bernilai false pada saat pertama kali dievaluasi, maka pernyataan dalam blok while, tidak akan pernah dieksekusi.

Sintaks pernyataan do dapat dilihat dalam Gambar 1.8.

Gambar 1.7. Pernyataan repetisi while
Gambar 1.8. Pernyataan repetisi do

Seperti terlihat melalui diagram alir, blok pernyataan do akan dieksekusi minimal satu kali, karena sebelum kondisi dievaluasi, blok pernyataan do harus dilalui terlebih dahulu.

Diagram alir dan sintaks pernyataan for diberikan dalam Gambar 1.9. Inisialisasi akan dieksekusi sekali, sebelum iterasi dimulai. Pernyataan dalam blok akan dieksekusi selama kondisi bernilai true. Increment dijalankan di akhir setiap iterasi.

Gambar 1.9. Pernyataan repetisi for

Beberapa catatan untuk pernyataan for:

  • Bagian inisialisasi bisa digunakan untuk deklarasi variabel.
  • Seperti pernyataan while, kondisi akan dites sebelum menjalankan pernyataan di dalam blok, sehingga blok pernyataan akan dieksekusi mulai 0 sampai “tak berhingga” kali.
  • Bagian increment dapat melakukan sembarang kalkulasi. Artinya bagian ini tidak hanya memperbolehkan i++ tetapi juga i -= 5 misalnya.
  • Setiap ekspresi pada header pernyataan for adalah opsional. Jika kondisi tidak ditulis, akan menyebabkan loop yang kontinyu / tak pernah berhenti. Jika increment tidak diberikan, tidak ada operasi “increment” yang dilakukan di akhir setiap iterasi. Begitu pula bila insialisasi tidak ditulis.

Lisensi

CC Attribution-NonCommercial-NoDerivatives (Lisensi)

comments powered by Disqus