Friday, March 16, 2018

5. Pengantar Kelas



Kelas merupakan inti dari pemrograman Java. Kelas merupakan konstruksi logis dan menjadi pondasi dimana bahasa Java dibangun. Kelas mendefinisikan bangun dan watak objek. Dengan demikian, kelas membentuk dasar untuk pemrograman berorientasi-objek pada Java. Semua konsep yang ingin Anda implementasikan dalam program Java harus dienkapsulasi dalam sebuah kelas.

Karena kelas merupakan elemen paling fundamental dalam Java, bab ini dan bab selanjutnya akan dicurahkan untuk membahasnya. Di sini, Anda akan dikenalkan elemen-elemen dasar dari sebuah kelas dan belajar bagaimana sebuah kelas dapat dipakai untuk menciptakan objek-objek. Anda juga akan belajar tentang metode, konstruktor, dan katakunci this.


Dasar Kelas
Kelas telah digunakan sejak awal buku ini. Namun, sampai sekarang, hanya bentuk yang paling dasar dari kelas yang telah ditunjukkan. Kelas-kelas yang diciptakan pada bab-bab terdahulu umumnya diberikan untuk mengenkapsulasi metode main(), yang dipakai untuk mendemonstrasikan dasar dari sintaksis Java. Seperti yang akan Anda lihat nanti, kelas merupakan substansi yang sangat tangguh.

Hal yang paling penting untuk dipahami tentang sebuah kelas adalah bahwa kelas mendefinisikan tipe data baru. Setelah didefinisikan, tipe data baru ini dapat dipakai untuk menciptakan objek-objek dengan tipe data itu. Jadi, sebuah kelas merupakan template atau cetakan bagi objek-objek, dan sebuah objek merupakan hasil cetakan dari sebuah kelas. 


Bentuk Umum dari Sebuah Kelas
Ketika Anda mendefinisikan sebuah kelas, Anda mendeklarasikan secara lengkap rancangan kelas. Anda melakukannya dengan menetapkan data yang dimuat dan kode yang diterapkan pada data tersebut. Kelas yang sangat sederhana hanya memuat kode atau hanya data, tetapi kelas pada aplikasi di dunia nyata tentu memiliki keduanya. 

Sebuah kelas dideklarasikan menggunakan katakunci class. Bentuk umum dari definisi kelas adalah sebagai berikut:

class namakelas {
   tipe variabel_kelas1;
   tipe variabel_kelas2;
   // ...
   type variabel_kelasN;

   tipe namametode1(daftar-parameter) {
      // tubuh metode
   }

   tipe namametode2(daftar-parameter) {
      // tubuh metode
   }

   // ...

   type namametodeN(daftar-parameter) {
      // tubuh metode
   }
}

Data, atau variabel, yang didefinisikan di dalam sebuah kelas dinamakan dengan variabel kelas atau variabel instans. Kode dimuat di dalam metode. Secara kolektif, metode dan variabel yang didefinisikan di dalam sebuah kelas dinamakan anggota kelas. Pada kebanyakan kelas, variabel kelas dipakai dan diakses oleh metode-metode yang didefinisikan untuk kelas tersebut. Jadi, sebagai aturan umum, adalah metode yang menentukan bagaimana data kelas dapat digunakan.

Variabel yang didefinisikan di dalam sebuah kelas dinamakan variabel kelas atau variabel instans karena setiap objek kelas memuat salinan sendiri dari variabel kelas. Jadi, data untuk satu objek terpisah dan unik dari data untuk objek lain.

Semua metode memiliki bentuk umum yang sama seperti main(), yang telah digunakan sejauh ini. Namun, kebanyakan metode tidak akan dideklarasikan static atau public. Perhatikan bahwa bentuk umum dari sebuah kelas tidak memiliki metode main(). Kelas dalam Java tidak harus memiliki metode main(). Anda hanya memerlukan metode main() pada kelas yang menjadi titik awal eksekusi untuk program Anda.


Sebuah Kelas Sederhana
Anda akan belajar kelas melalui contoh sederhana berikut. Berikut adalah sebuah kelas Kotak yang mendefinisikan tiga variabel kelas: lebar, tinggi, dan dalam. Untuk saat ini, Kotak tidak memuat metode apapun (yang nanti akan ditambahkan):

class Kotak {
   double lebar;
   double tinggi;
   double dalam;
}

Seperti disebutkan sebelumnya, sebuah kelas mendefinisikan tipe data baru. Pada kasus ini, tipe data baru tersebut dinamakan dengan Kotak. Anda akan menggunakan nama ini untuk mendeklarasikan objek-objek bertipe Kotak. Adalah penting untuk mengingat bahwa sebuah deklarasi kelas hanya menciptakan template atau cetakan; ia tidak menciptakan objek aktual. Jadi, kode yang mendefinisikan kelas Kotak tersebut tidak menyebabkan objek bertipe Kotak menjadi ada.

Untuk menciptakan sebuah objek Kotak, Anda akan menggunakan statemen seperti berikut:

Kotak kotakKu = new Kotak(); // menciptakan sebuah objek Kotak dengan nama kotakKu

Setelah statemen ini dieksekusi, kotakKu akan menjadi sebuah objek bertipe data Kotak. Jadi, objek itu memiliki realitas fisik. Untuk sementara ini, Anda tidak perlu khawatir tentang detil dari statemen ini.

Seperti disebutkan sebelumnya, setiap kali Anda menciptakan objek dari sebuah kelas, Anda sedang menciptakan sebuah objek yang memuat salinan sendiri dari setiap variabel kelas. Jadi, setiap objek Kotak akan memuat salinan sendiri dari variabel kelas lebar, tinggi, dan dalam. Untuk mengakses variabel ini, Anda memerlukan operator dot (titik). Operator dot menghubungkan nama objek dengan nama variabel kelas. Sebagai contoh, untuk menugaskan nilai 100 kepada variabel lebar dari objek kotakKu, Anda menggunakan statemen berikut:

kotakKu.lebar = 100;

Statemen ini memberitahu kompilator untuk menugaskan nilai 100 kepada salinan dari variabel lebar yang dimuat di dalam objek kotakKu. Umumnya, Anda menggunakan operator dot untuk mengakses baik variabel maupun metode di dalam sebuah objek.

Berikut adalah sebuah program yang menggunakan kelas Kotak:

/* Program yang menggunakan kelas Kotak.
   Namai file ini dengan DemoKotak.java
*/

class Kotak {
   double lebar;
   double tinggi;
   double dalam;
}

//Kelas ini mendeklarasikan sebuah objek bertipe Kotak.
public class DemoKotak {
   public static void main(String args[]) {
      Kotak kotakKu = new Kotak();
      double vol;
  
      // menugaskan nilai pada tiap variabel objek
      kotakKu.lebar = 10;
      kotakKu.tinggi = 20;
      kotakKu.dalam = 15;
  
      // menghitung volume kotak
      vol = kotakKu.lebar * kotakKu.tinggi * kotakKu.dalam;
      System.out.println("Volume = " + vol);
   }
}

Anda harus menamai file yang memuat program ini dengan DemoKotak.java, karena main() berada di dalam kelas DemoKotak, bukan pada kelas Kotak. Ketika Anda mengkompilasi program ini, Anda akan menemukan bahwa dua file .class telah diciptakan, satu untuk Kotak dan satu lagi untuk DemoKotak.

Anda bisa saja menempatkan tiap kelas ke dalam file sendiri, dengan nama Kotak.java dan DemoKotak.java. Untuk menjalankan program ini, Anda perlu mengeksekusi DemoKotak.java. Ketika Anda melakukannya, Anda akan melihat keluaran berikut:

Volume = 3000.0

Seperti disebutkan sebelumnya, setiap objek memiliki salinan sendiri atas variabel-variabel kelas. Ini berarti bahwa jika Anda memiliki dua objek Kotak, maka masing-masing objek memiliki salinan sendiri dari dalam, lebar, dan tinggi. Penting untuk dipahami bahwa perubahan pada variabel kelas pada satu objek tidak berpengaruh pada variabel kelas pada objek lain. Sebagai contoh, program berikut mendeklarasikan dua objek Kotak:

class Kotak {
   double lebar;
   double tinggi;
   double dalam;
}

public class DemoKotak2 {
   public static void main(String args[]) {
      Kotak kotakKu1 = new Kotak();
   Kotak kotakKu2 = new Kotak();
      double vol;
  
      // menugaskan nilai pada tiap variabel objek kotakKu1
      kotakKu1.lebar = 10;
      kotakKu1.tinggi = 20;
      kotakKu1.dalam = 15;
  
      // menugaskan nilai pada tiap variabel objek kotakKu2
      kotakKu2.lebar = 3;
      kotakKu2.tinggi = 6;
      kotakKu2.dalam = 9;
  
      // Menghitung volume kotak pertama
      vol = kotakKu1.lebar * kotakKu1.tinggi * kotakKu1.dalam;
      System.out.println("Volume Kotak 1 = " + vol);
  
      // Menghitung volume kotak kedua
      vol = kotakKu2.lebar * kotakKu2.tinggi * kotakKu2.dalam;
      System.out.println("Volume Kotak 2 = " + vol);
   }
}

Keluaran yang dihasilkan oleh program di atas:

Volume Kotak 1 = 3000.0
Volume Kotak 2 = 162.0


Mendeklarasikan Objek
Seperti yang telah dijelaskan, ketika Anda menciptakan sebuah kelas, Anda sedang menciptakan tipe data baru. Anda dapat menggunakan tipe data ini untuk mendeklarasikan objek-objek dengan tipe data itu. Namun, hal ini merupakan sebuah proses dua-langkah. Pertama, Anda perlu mendeklarasikan sebuah variabel dengan tipe kelas itu. Variabel ini tidak mendefinisikan objek apapun. Kedua, Anda perlu menciptakan objek aktual dan menugaskannya kepada variabel itu.

Anda melakukannya menggunakan operator new. Operator new secara dinamis mengalokasikan memori bagi sebuah objek dan menghasilkan sebuah referensi yang menunjuk ke objek tersebut. Referensi ini kemudian disimpan ke dalam variabel. Jadi, dalam Java, objek kelas perlu dialokasikan secara dinamis.

Pada dua program sebelumnya, sebuah baris berikut dipakai untuk mendeklarasikan sebuah objek bertipe Kotak:

Kotak kotakKu = new Kotak();

Statemen ini menggabungkan dua langkah yang baru saja dijelaskan. Statemen di atas dapat dituliskan ulang untuk menunjukkan setiap langkah dengan lebih jelas:

Kotak kotakKu;   // mendeklarasikan referensi ke objek
kotakKu = new Kotak();  // mengalokasikan sebuah objek Kotak

Baris pertama mendeklarasikan kotakKu sebagai sebuah referensi yang menunjuk ke sebuah objek bertipe Kotak. Pada titik ini, kotakKu tidak menunjuk ke objek apapun. Baris berikutnya mengalokasikan sebuah objek dan menugaskan sebuah referensi kepadanya. Setelah baris kedua dieksekusi, Anda dapat menggunakan kotakKu sebagai objek Kotak. Pada kenyataannya, kotakKu hanyalah memuat alamat memori dari objek aktual Kotak. Efek dari dua baris kode di atas ditampilkan pada Gambar 5.1.

Gambar 5.1 Pendeklarasian objek bertipe Kotak


Lebih Dekat Dengan Operator new
Seperti yang baru saja dijelaskan, operator new secara dinamis mengalokasikan memori bagi sebuah objek. Operator ini memiliki bentuk umum berikut:

var-kelas = new namakelas();

Di sini, var-kelas adalah sebuah variabel dengan tipe kelas yang sedang diciptakan. Dan, namakelas adalah nama dari kelas yang sedang diinstansiasi. Nama kelas yang diikuti dengan kurung menetapkan konstruktor kelas. Konstruktor mendefinisikan apa yang terjadi ketika sebuah objek dari suatu kelas diciptakan. Konstruktor merupakan bagian penting dari semua kelas. Hampir semua kelas di dunia nyata secara eksplisit mendefinisikan konstruktornya sendiri di dalam definisi kelas. Namun, jika tidak ada konstruktor eksplisit, maka Java akan secara otomatis menyediakan sebuah konstruktor default. Ini lah yang terjadi pada kelas Kotak. Untuk sekarang, Anda akan menggunakan konstruktor default. Nanti, Anda akan melihat bagaimana menciptakan konstruktor Anda sendiri.

Pada titik ini, Anda mungkin bertanya mengapa Anda tidak perlu menggunakan new untuk integer atau karakter. Jawabannya adalah bahwa tipe-tipe data primitif Java tidak diimplementasikan sebagai objek. Tetapi, diimplementasikan sebagai variabel biasa. Ini dilakukan demi efisiensi. Anda akan melihat, objek memiliki banyak fitur dan atribut yang mengharuskan Java untuk memperlakukannya secara berbeda.

Penting dipahami bahwa operator new mengalokasikan memori untuk objek pada saat program dijalankan. Keuntungan dari pendekatan ini adalah program Anda dapat menciptakan sebanyak atau sedikit mungkin objek yang diperlukan saat eksekusi program. Namun, tentu memori bersifat terbatas, sangat dimungkinkan bahwa new tidak bisa mengalokasikan memori untuk objek karena keterbatasan memori.


Menugaskan Variabel Referensi Objek
Variabel referensi objek berperilaku berbeda dari apa yang Anda duga tentang sebuah penugasan. Misalnya, apa yang Anda pikirkan tentang potongan kode berikut:

Kotak b1 = new Kotak();
Kotak b2 = b1;

Anda mungkin berpikir bahwa b2 sedang ditugasi sebuah referensi yang menunjuk ke sebuah salinan objek yang direferensi oleh b1. Jadi, Anda mengira bahwa b1 dan b2 mereferensi objek yang terpisah dan berbeda. Namun, hal ini keliru. Yang terjadi adalah, setelah potongan kode ini dieksekusi, b1 dan b2 keduanya akan menunjuk atau mereferensi objak yang sama. Penugasan b1 kepada b2 tidak mengalokasikan memori apapun atau menyalin bagian apapun dari objek semula. Jadi, perubahan apapun yang terjadi pada objek melalui b2 akan memengaruhi objek yang ditunjuk b1, karena keduanya mereferensi objek yang sama. Situasi ini digambarkan berikut:



Meskipun b1 dan b2 merujuk atau mereferensi ke objek yang sama, keduanya tidak terhubung dengan cara lain. Sebagai contoh, penugasan ke b1 akan melepaskan b1 dari objek semula tanpa memengaruhi objek semula atau memengaruhi b2. Misalnya:

Kotak b1 = new Kotak();
Kotak b2 = b1;
// ...
b1 = null;

Di sini, b1 ditetapkan menjadi null, tetapi b2 masih tetap menunjuk ke objek semula.


Mengenalkan Metode
Seperti disebutkan di awal bab ini, kelas umumnya memuat dua hal: variabel kelas dan metode. Topik tentang metode merupakan bahasan yang sangat luas karena Java memberikannya banyak kekuatan dan fleksibilitas. Metode akan dibahas lebih banyak pada bab ini. Ada sejumlah hal mendasar yang perlu Anda pelajari sekarang agar Anda dapat menambahkan metode-metode pada kelas Anda.

Ini merupakan bentuk umum dari sebuah metode:

tipe nama(daftar-parameter) {
   // tubuh metode
}

Di sini, tipe adalah tipe data yang dihasilkan oleh metode. Ini dapat berupa sembarang tipe data yang valid dalam Java, termasuk tipe data kelas yang Anda ciptakan. Jika metode tidak menghasilkan nilai balik, maka tipe datanya harus void. Nama metode ditetapkan oleh nama. Nama metode dapat berupa sembarang pengenal valid dalam Java. Elemen daftar-parameter merupakan pasangan-pasangan tipe data dan pengenal yang dipisahkan dengan koma. Parameter adalah variabel yang menerima nilai argument yang dilewatkan kepada metode ketika metode tersebut dipanggil. Jika metode tidak memiliki parameter, maka daftar parameter dibiarkan kosong.

Metode yang memiliki tipe data nilai balik selain void menghasilkan sebuah nilai yang diberikan kepada pemanggil menggunakan bentuk statemen return berikut:

return nilai;

Di sini, nilai adalah nilai balik metode.


Selanjutnya  >>>



No comments: