tatic jumlahLingkaran dengan tipe data integer bernilai 0
d. Konstruktor pertama tanpa ada masukan dan tidak melakukan apa-apa
e. Konstruktor kedua memiliki 1 masukan yaitu jari_jari_baru bertipe data
double
60
f. Method setJari memiliki 1 masukan yaitu jari_jari bertipe data double yang
memperbarui nilai dari property jari_jari
g. Method getJari, mengembalikan nilai jari_jari
h. Method getLuas, mengembalikan nilai luas lingkaran
i. Method getKeliling, mengembalikan nilai keliling lingkaran
j. Method static getJumlahLingkaran, mengembalikan nilai jumlah lingkaran
yang dibuat
Gunakan modifier private untuk semua property serta modifier public untuk
semua konstruktor dan method. Buat juga 3 objek, objek pertama tanpa inisialisasi
jari_jari, objek kedua dengan inisialisasi jari_jari dari method setter setJari, dan
objek ketiga dengan inisialisasi jari_jari dari konstuktor. Gambar pula UML class
diagramnya.
2. Buatlah program class PiramidaEnkapsulasi yang merepresentasikan bentuk piramida
yang merepresentasikan template Piramida dan menerapkan konsep enkasulapsi.
Kreasikan konten property, method, dan objek sesuai keinginan Anda.
3. Buatlah program class MahasiswaEnkapsulasi berdasarkan UML class diagram di
bawah ini
MahasiswaEnkapsulasi
-nim: string
-nama: string
-alamat: string
-ipk: double
+Mahasiswa()
+Mahasiswa(nim: string)
+Mahasiswa(nimBaru: string, namaBaru: string, alamatBaru: string, ipkBaru: string)
+setNim(nim: string): void
+getNim(): string
+setNama(nama: string): void
+getNama(): string
+setAlamat(alamat: string): void
+getAlamat (): string
61
+setIpk(ipk: double): void
+getIpk(): double
+predikat(ipk: double): Sstring
+cetak(): void
Penjelasan UML class diagram MahasiswaEnkapsulasi
Atribut
nim bertipe data string dengan modifier private
nama bertipe data string dengan modifier private
alamat bertipe data string dengan modifier private
ipk bertipe data double dengan modifier private
Konstruktor
Mahasiswa()
Tidak melakukan apapun
Mahasiswa(nim: string)
o Beri nilai property nim milik class diisi dengan nilai nim masukan method
Mahasiswa(nimBaru: string, namaBaru: string, alamatBaru: string, ipkBaru:
string)
o Beri nilai property nim milik class diisi dengan nilai nimBaru masukan
method
o Beri nilai property nama milik class diisi dengan nilai namaBaru masukan
method
o Beri alamat property nama milik class diisi dengan nilai alamatBaru
masukan method
o Beri nilai property ipk milik class diisi dengan nilai ipkBaru masukan
method
Method
setNim(nim: string): void
memberi nilai property nim milik class diisi dengan nilai masukan method
+getNim(): string
mengembalikan nilai dari property nim
+setNama(nama: string): void
62
memberi nilai property nama milik class diisi dengan nilai masukan method
+getNama(): string
mengembalikan nilai dari property nama
+setAlamat(alamat: string): void
memberi nilai property alamat milik class diisi dengan nilai masukan method
+getAlamat (): string
mengembalikan nilai dari property alamat
+setIpk(ipk: double): void
memberi nilai property ipk milik class diisi dengan nilai masukan method
+getIpk(): double
mengembalikan nilai dari property ipk
predikat(ipk: double): String
Jika ipk diantara 2.0 sampai 2.75, kembalikan string “Memuaskan”
Jika ipk diantara 2.76 sampai 3.5, kembalikan string ‘Sangat memuaskan”
Jika ipk diantara 3.51 sampai 4.0, kembalikan string “Dengan pujian”
Jika tidak, kembalikan string “-“
cetak(): void
o Menampilkan nim, nama, alamat, ipk dan predikat dalam susunan vertical
Contoh output:
Nama = Dilan
Alamat = Bandung
NIM = 1
IPK = 3.51
Predikat = Dengan Pujian
63
BAB 5 INTERAKSI ANTAR OBJEK
5.1 Keterkaitan antar Class
Kita perlu mengetahui keterkaitan antar class untuk merancang class. Keterkaitan
umum antar class yaitu asosiasi, agregrasi, komposisi dan pewarisan. Pada bab 5 ini akan
membahas keterkaitan antar class tentang asosiasi, agregrasi, dan komposisi, sedangkan
pewarisan akan dibahas pada bab 7.
5.2 Asosiasi
Asosiasi adalah hubungan umum yang menggambarkan keterkaitan antara 2 class.
Sebagai contoh, seorang penonton yang menonton film adalah keterkaitan class Penonton dan
class Film. Anggota rumah produksi, seorang sutradara membuat film adalah keterkaitan
class RumahProduksi dan class Film. Asosiasi dapat digambarkan dalam UML class diagram
pada gambar 5.1.
Gambar 5.1 UML asosiasi pada class Penonton, Film, dan RumahProduksi
Gambar 5.1 menunjukkan bahwa penonton dapat menonton beberapa film. Anggota
rumah produksi (sutradara) dapat membuat beberapa film. Film mungkin memiliki 1 sampai
300 penonton dan film dibuat oleh 1 atau 2 anggota rumah produksi (sutradara).
Sebuah asosiasi digambar oleh garis solid antar class. Label menunjukkan keterkaitan
antar class dan segitiga hitam menunjukkan arah hubungan. Pada gambar 5.1 memiliki label
menonton dan membuat. Simbol segitiga hitam menunjukkan bahwa penonton dapat
menonton beberapa film. Setiap class yang terlibat mungkin memiliki nama peran yang
menggambarkan peran yang dimainkannya dalam hubungan. Pada gambar 5.1, sutradara
adalah peran dari RumahProduksi.
Setiap class yang terlibat dalam hubungan asosiasi dapat menentukan multiplicity
yang ditempatkan disamping class dekat garis solid. Multiplicity berfungsi untuk menentukan
berapa banyak objek class yang terlibat dalam hubungan di UML. Multiplicity simbol *
berarti objek yang tidak terbatas dan interval m…n berarti objek yang berjumlah diantara
Penonton Film RumahProduksi
1..300 *
Menonton Membuat
* 1..2
Sutradara
64
angka m dan n. Pada gambar 5.1, penonton dapat menonton film sebanyak apapun dan setiap
film dapat ditonton antara 1 sampai 300 orang dalam satu kali penayangan. Setiap film
diproduksi oleh 1 atau 2 anggota rumah produksi, dan sutradara dapat membuat film
sebanyak apapun.
Dalam bahasa pemrograman Java, kita dapat menerapkan keterkaitan antar class
menggunakan property dan method. Gambar 5.2 menggambarkan implementasi dari gambar
5.1. Keterkaitan penonton menonton film dapat diimplemntasikan menggunakan method
nontonFilm di class Penonton dan method tambahPenonton di class Film. Keterkaitan rumah
produksi membuat film diimplementasikan menggunakan method buatFilm di class
RumahProduksi dan method setRumahProduksi di class Film. Class penonton dapat
menggunakan listFilm untuk menyimpan film-film apa saja yang ditonton, class
RumahProduksi dapat menggunakan listFilm untuk menyimpan film-film yang dibuat, dan
class Film dapat menggunakan listPenonton untuk menyimpan para penonton yang menonton
dan property rumahProduksi untuk menyimpan informasi pembuat film.
Gambar 5.2 Asosiasi yang diimplementasikan menggunakan property dan method di class
public class Penonton{
private Film[] listFilm;
public void nontonFilm(Film f){
...
}
}
public class Film{
private Penonton[] listPenonton;
private RumahProduksi[] listRumahProduksi;
public void tambahPenonton(Penonton p){
...
}
public void setRumahProduksi(RumahProduksi rp){
...
}
}
public class RumahProduksi{
private Film[] listFilm;
public void buatFilm(Film f){
...
}
}
65
5.3 Agregasi dan Komposisi
Agregasi adalah bentuk khusus dari asosiasi yang mewakili keterkaitan antara dua
objek. Pemilik objek disebut aggregating object dan kelasnya disebut aggregating class.
Objek subjek disebut aggregated object, dan kelasnya disebut aggregated class. Kita dapat
menyebut agregasi antara dua objek sebagai komposisi jika keberadaan aggregated object
tergantung pada aggregating object. Maka, aggregated object tidak dapat tercipta dengan
sendirinya.
Contoh "seorang penonton memiliki nama" adalah komposisi hubungan antara class
Penonton dan class Nama sebab nama tergantung pada penonton, sedangkan "seorang
penonton memiliki alamat" adalah hubungan agregasi antara class Penonton dan class Alamat
sebab alamat bisa ada dengan sendirinya. Komposisi menyiratkan kepemilikan. Satu objek
memiliki objek lain. Ketika objek pemilik dihancurkan, objek yang terkait hancur juga.
Lihat gambar 5.3 yang berisikan UML, simbol belah ketupan hitam menyatakan
bahwa aggregating class (Penonton) memiliki hubungan komposisi dengan aggregated class
(Nama). Sedangkan simbol belah ketupan putih yang melekat pada aggregating class
(Penonton) memiliki hubungan agregrasi dengan aggregated class (Alamat).
Gambar 5.3 Contoh UML dengan keterkaitan Agregrasi dan Komposisi
Pada gambar 5.3, setiap penonton hanya memiliki satu multiplicity alamat dan
masing-masing alamat bisa dibagikan oleh hingga 3 penonton. Setiap penonton memiliki satu
nama, dan nama itu unik untuk setiap penonton.
Keterkaitan agregasi biasanya direpresentasikan sebagai property dalam aggregating
class. Contohnya pada gambar 5.4 yang menunjukkan relasi "seorang penonton memiliki
nama" dan "seorang penonton memiliki alamat", terlihat dari variabel property nama dan
alamat di kelas Siswa.
Nama Penonton Alamat
1
Komposisi Agregrasi
1…3 1 1
66
Aggregated class Aggregating class Aggregated class
Gambar 5.4 Agregrassi dan Komposisi yang diimplementasi menggunakan property
Agregasi bisa muncul di antara objek-objek dari kelas yang sama. Misalnya, seorang
pegawai mungkin memiliki pengawas. Gambar 5.5 menjelaskan hubungan "seorang pegawai
memiliki pengawas". Seorang pengawas dapat direpresentasikan sebagai property di kelas
Pegawai.
Gambar 5.5 Agregasi Seorang Pegawai Memiliki Pengawas
Jika seorang pegawai dapat memiliki beberapa pengawas, maka kita perlu
menambahkan array, lihat gambar 5.6. Array itu berguna untuk pengawas produksi,
pengawas kualitas, dan lain-lain.
Gambar 5.6 Agregasi Seorang Pegawai Memiliki Banyak Pengawas
5.4 Studi Kasus
Agar lebih memahami materi, mari kita implementasi class Penonton, Film, dan
RumahProduksi. UML class diagram lengkap terdapat pada gambar 5.7 yang merupakan
perluasan dari UML pada gambar 5.2. Kode sumber 5.1 hanya menampilkan class Film
secara utuh, sedangkan class Penonton dan class RumahProduksi bisa dilengkapi secara
public class Nama{
…
}
public class Penonton{
private Nama nama;
private Alamat alamat;
…
}
public class Alamat{
…
}
public class Pegawai{
private Pegawai pengawas;
…
}
Penonton
1
1 pengawas
public class Pegawai{
private Pegawai[] pengawas;
…
}
Penonton
1
m pengawas
67
mandiri sebagai tugas praktikum. Kode sumber yang digunakan menerapkan konsep array of
object, kita dapat memahami praktiknya pada bab ini dan akan belajar tentang teorinya pada
bab 6.5.
Penonton
-nama: String
-listFilm: Film[] = new Film[1000];
-jumlahFilm: int
+Penonton(nama: String)
+getNamaPenonton(): String
+nontonFilm(f Film): void
+getListFilm(): Film[]
+getJumlahFilm(): int
+main(args String[]): void
Gambar 5.7 UML class diagram ClassPenonton, Film, dan RumahProduksi Lengkap
RumahProduksi
-sutradara: String
-listFilm: Film[] = new Film[1000];
-jumlahFilm: int
+RumahProduksi(sutradara: String)
+getNamaSutradara(): String
+buatFilm(f Film): void
+getListFilm(): Film[]
+getJumlahFilm(): int
+main(args String[]): void
Film
-namaFilm: String
-listPenonton: Penonton[] = new Penonton [300];
-jumlahPenonton: int
-listRumahProduksi: RumahProduksi[] = new RumahProduksi [300];
-jumlahRumahProduksi: int
+Film(namaFilm: String)
+getNamaFilm(): String
+tambahPenonton(p Penonton): void
+getPenonton(): Penonton[]
+getJumlahPenonton (): int
+setRumahProduksi(rp RumahProduksi): void
+getRumahProduksi(): RumahProduksi[]
+getRumahProduksi(): int
+main(args String[]): void
68
Kode 5.1 Penonton.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Penonton {
//property
private String nama;
/*Sebagai tugas praktikum 1, konversi property dibawah ini
menggunakan kode sumber
-listFilm: Film[] = new Film[1000];
//Array untuk menampung Film
-jumlahFilm: int
//Jumlah dari Film yang ditampung (default = 0)
sampai property ini*/
//konstruktor
public Penonton(String nama){
this.nama = nama;
}
//method
public String getNamaPenonton(){
return nama;
}
/*Buat dan isi method-method dibawah ini
+nontonFilm(f Film): void
//Tambah film yang ditonton
+getListFilm(): Film[]
//Kembalikan list film yang ditonton
+getJumlahFilm(): int
//Kembalikan jumlah film yang ditonton
sampai method ini*/
public static void main(String[] args) {
69
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Penonton p1 = new Penonton("Abas");
Penonton p2 = new Penonton("Yogi");
Penonton p3 = new Penonton("Anisa");
p1.nontonFilm(new Film("Dilan 1991"));
p1.nontonFilm(new Film("Avenger: Endgame"));
p2.nontonFilm(new Film("Dilan 1991"));
p2.nontonFilm(new Film("Avenger: Endgame"));
p3.nontonFilm(new Film("Dilan 1991"));
System.out.println("Jumlah film yang ditonton
"+p1.getNamaPenonton()+" adalah "+p1.getJumlahFilm());
Film[] f1 = p1.getListFilm();
System.out.print("|| ");
for(int i=0; i<p1.getJumlahFilm(); i++){
System.out.print(f1[i].getNamaFilm()+" || ");
}
System.out.println("\n");
System.out.println("Jumlah film yang ditonton
"+p2.getNamaPenonton()+" adalah "+p2.getJumlahFilm());
Film[] f2 = p2.getListFilm();
System.out.print("|| ");
for(int i=0; i<p2.getJumlahFilm(); i++){
System.out.print(f2[i].getNamaFilm()+" || ");
}
System.out.println("\n");
70
62
63
64
65
66
67
68
69
System.out.println("Jumlah film yang ditonton
"+p3.getNamaPenonton()+" adalah "+p3.getJumlahFilm());
Film[] f3 = p3.getListFilm();
System.out.print("|| ");
for(int i=0; i<p3.getJumlahFilm(); i++){
System.out.print(f3[i].getNamaFilm()+" || ");
}
}
}
Output:
Jumlah film yang ditonton Abas adalah 2
|| Dilan 1991 || Avenger: Endgame ||
Jumlah film yang ditonton Yogi adalah 2
|| Dilan 1991 || Avenger: Endgame ||
Jumlah film yang ditonton Anisa adalah 1
|| Dilan 1991 ||
Kode 5.2 Film.java
1
2
3
4
5
6
7
8
9
10
11
12
public class Film {
//property
private String namaFilm;
private Penonton[] listPenonton = new Penonton[300];
private int jumlahPenonton;
private RumahProduksi[] listRumahProduksi = new RumahProduksi[2];
private int jumlahRumahProduksi;
//konstruktor
public Film(String namaFilm){
this.namaFilm = namaFilm;
71
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
}
//method
public String getNamaFilm(){
return namaFilm;
}
public void tambahPenonton(Penonton p){
listPenonton[jumlahPenonton] = p;
jumlahPenonton++;
}
public Penonton[] getPenonton(){
return listPenonton;
}
public int getJumlahPenonton(){
return jumlahPenonton;
}
public void setRumahProduksi(RumahProduksi rp){
listRumahProduksi[jumlahRumahProduksi] = rp;
jumlahRumahProduksi++;
}
public RumahProduksi[] getRumahProduksi(){
return listRumahProduksi;
}
public int getJumlahRumahProduksi(){
return jumlahRumahProduksi;
}
public static void main(String[] args) {
Film film1 = new Film("Dilan 1991");
Film film2 = new Film("Avenger: Endgame");
film1.setRumahProduksi(new RumahProduksi("Pidi Baiq"));
film1.setRumahProduksi(new RumahProduksi("Fajar Bustomi"));
72
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
film2.setRumahProduksi(new RumahProduksi("Anthony Russo"));
film2.setRumahProduksi(new RumahProduksi("Joe Russo"));
film1.tambahPenonton(new Penonton("Abas"));
film1.tambahPenonton(new Penonton("Yogi"));
film1.tambahPenonton(new Penonton("Anisa"));
film2.tambahPenonton(new Penonton("Abas"));
film2.tambahPenonton(new Penonton("Yogi"));
System.out.println("=== Box Office 2019 ===");
System.out.println("Film 1 - "+film1.getNamaFilm());
System.out.print("Sutradara = ");
RumahProduksi[] rp1 = film1.getRumahProduksi();
for(int i=0; i<film1.getJumlahRumahProduksi(); i++){
System.out.print(rp1[i].getNamaSutradara()+", ");
}
System.out.println("");
System.out.println("Jumlah penonton film
"+film1.getNamaFilm()+" adalah "+film1.getJumlahPenonton());
Penonton[] p1 = film1.getPenonton();
System.out.print("|| ");
for(int i=0; i<film1.getJumlahPenonton(); i++){
System.out.print(p1[i].getNamaPenonton()+" || ");
}
System.out.println("\n\n");
System.out.println("Film 2 - "+film2.getNamaFilm());
System.out.print("Sutradara = ");
RumahProduksi[] rp2 = film2.getRumahProduksi();
for(int i=0; i<film2.getJumlahRumahProduksi(); i++){
System.out.print(rp2[i].getNamaSutradara()+", ");
73
76
77
78
79
80
81
82
83
84
85
86
}
System.out.println("");
System.out.println("Jumlah penonton film
"+film2.getNamaFilm()+" adalah "+film2.getJumlahPenonton());
Penonton[] p2 = film2.getPenonton();
System.out.print("|| ");
for(int i=0; i<film2.getJumlahPenonton(); i++){
System.out.print(p2[i].getNamaPenonton()+" || ");
}
System.out.println("");
}
}
Output:
=== Box Office 2019 ===
Film 1 - Dilan 1991
Sutradara = Pidi Baiq, Fajar Bustomi,
Jumlah penonton film Dilan 1991 adalah 3
|| Abas || Yogi || Anisa ||
Film 2 - Avenger: Endgame
Sutradara = Anthony Russo, Joe Russo,
Jumlah penonton film Avenger: Endgame adalah 2
|| Abas || Yogi ||
Kode 5.3 RumahProduksi.java
1
2
3
4
5
6
public class RumahProduksi{
//property
private String sutradara;
/*Sebagai tugas praktikum 1, konversi property dibawah ini
menggunakan kode sumber
-listFilm: Film[] = new Film[1000];
//Array untuk menampung Film
74
7
8
9
10
11
12
11
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-jumlahFilm: int
//Jumlah dari Film yang ditampung (default = 0)
sampai property ini*/
//konstruktor
public RumahProduksi(String sutradara){
this.sutradara = sutradara;
}
//method
public String getNamaSutradara(){
return sutradara;
}
/*Buat dan isi method-method dibawah ini
+buatFilm(f Film): void
//Tambah film yang dibuat
+getListFilm(): Film[]
//Kembalikan list film yang ditonton
+getJumlahFilm(): int
//Kembalikan jumlah film yang ditonton
sampai method ini*/
public static void main(String[] args) {
RumahProduksi rp1 = new RumahProduksi("Pidi Baiq");
RumahProduksi rp2 = new RumahProduksi("Fajar Bustomi");
RumahProduksi rp3 = new RumahProduksi("Anthony Russo");
RumahProduksi rp4 = new RumahProduksi("Joe Russo");
rp1.buatFilm(new Film("Dilan 1990"));
rp1.buatFilm(new Film("Dilan 1991"));
rp2.buatFilm(new Film("Dilan 1990"));
rp2.buatFilm(new Film("Dilan 1991"));
75
38
39
40
41
42
43
44
45
46
47
48
49
rp3.buatFilm(new Film("Avenger: Endgame"));
rp4.buatFilm(new Film("Avenger: Endgame"));
System.out.println("Jumlah film yang dibuat
"+rp1.getNamaSutradara()+" adalah "+rp1.getJumlahFilm());
Film[] f1 = rp1.getListFilm();
System.out.print("|| ");
for(int i=0; i<rp1.getJumlahFilm(); i++){
System.out.print(f1[i].getNamaFilm()+" || ");
}
}
}
Output:
Jumlah film yang dibuat Pidi Baiq adalah 2
|| Dilan 1990 || Dilan 1991 ||
Kode sumber 5.1 Class Penonton, Film, dan RumahProduksi
5.5 Kesimpulan
1. Keterkaitan umum antar class yaitu asosiasi, agregrasi, komposisi dan pewarisan
2. Asosiasi adalah hubungan umum yang menggambarkan keterkaitan antara 2 class.
3. Agregasi adalah bentuk khusus dari asosiasi yang mewakili keterkaitan antara dua
objek.
4. Pemilik objek disebut aggregating object dan kelasnya disebut aggregating class.
Objek subjek disebut aggregated object, dan kelasnya disebut aggregated class.
5. Kita bisa menyebut keteraitan komposisi jika keberadaan aggregated object
tergantung pada aggregating object.
5.6 Kuis dan Latihan Soal
1. Jelaskan perbedaan antara keterkaitan asosiasi, agregrasi, dan komposisi!
2. Disebut apakah keterkaitan yang menyiratkan kepemilikan?
3. Keterkaitan yang memungkinkan muncul di antara objek-objek dari kelas yang sama
adalah …
76
5.7 Praktikum
1. Lengkapi kode sumber 5.1 pada class Penonton
2. Lengkapi kode sumber 5.1 pada class RumahProduksi
Lihat pada class Film sebagai contoh acuan!
77
BAB 6 ARRAY DAN COLLECTION
6.1 Konsep Array
Biasanya seorang programmer membutuhkan suatu cara untuk menyimpan data dengan
jumlah data yang besar. Misalnya, setelah programmer berhasil menyimpan sejumlah data
yang besar tadi akan digunakan untuk mengurutkan setiap data yang disimpan. Hal ini akan
membutuhkan banyak variabel untuk menampung setiap nilai yang ada. Jika data itu
berjumlah kurang dari 10 mungkin tidak akan menjadi problem apabilai membuat sebanyak
10 variabel. Akan tetapi, jika jumlah data yang disimpan itu ratusan atau ribuan atau
bahkan lebih, tentu programmer tidak akan mungkin menuliskan variabel sebanyak itu. Jadi
bagaimana programmer akan menangani problem ini?
Dibutuhkan suatu cara yang efisien agar programmer tidak perlu menuliskan banyak variabel
untuk menampung data. Beberapa bahasa pemrograman tingkat tinggi (seperti Java) sudah
menyediakan struktur data yang disebut dengan istilah Array. Array memungkinkan
programmer untuk menyimpan suatu koleksi elemen nilai yang serupa secara terurut dengan
tipe data yang sama. Sebagai contoh, programmer membutuhkan penyimpanan nilai-nilai
integer sebanyak 6 elemen nilai integer. Maka programmer hanya cukup membuat satu
variabel array untuk menampung seluruh koleksi dari setiap elemen nilai integer yang ada.
Setiap elemen nilai yang ada didalam Array diakses dengan suatu indeks. Indeks itu
merepresentasikan urutan data yang ada didalam array. Pada bahasa pemrograman Java
indeks dimulai dari nilai 0 (sebab di bahasa pemrograman lain indeks kadang dimulai dari
nilai 1). Berikut adalah ilustrasi array ListNilai:
Tabel 6.1 Ilustrasi array ListNilai
Indeks 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ListNilai 34 5 23 23 2 12 123 1 28 4 6 76 45 64 66
Pada contoh itu kita memiliki variabel array dengan nama ListNilai dengan tipe
integer. Misal dari ListNilai itu elemen pertama memiliki nilai 34 dan berada pada
indeks ke-0. Kita dapat menyederhanakan pemanggilan nilai pada indeks ke-0 itu
dengan cara ListNilai[0]=34. Sehingga jika dilihat elemen variabel ListNilai akan menjadi
78
ListNilai[0], ListNilai[1], ... , ListNilai[14]. Perhatikan bahwa jumlah seluruh
elemen array pada variabel ListNilai adalah 15, bukan 14. Hal itu disebab kan indeks array
dimulai dari 0 bukan 1.
6.2 Deklarasi dan Pembuatan Array
Deklarasi variabel array berbeda dengan deklarasi variabel primitif biasa. Deklarasi suatu
variabel dari array tidak mengalokasikan ruang memori secara langsung, namun hanya
menyiapkan lokasi penyimpanan data didalam memory sebagai referensi. Jika suatu variabel
tidak memuat referensi dari array maka variabel itu akan bernilai null. Berikut adalah
cara untuk mendeklarasikan variabel array.
tipeElement[] arrRefVar;
atau,
tipeElement arrRefVar[];
Suatu tipeElement bisa jadi apapun termasuk tipe data primitif atau objek. Pada contoh
sintak kedua yaitu tipeElement arrRefVar[]; menggunakan gaya penulisan sintak pada
C/C++, untuk pemograman dengan Java menuliskan sintak array dengan cara itu tidak
disarankan. Implementasi kode dari deklarasi array dengan nama variabel ListNilai dengan
referensi array dari elemen bertipe data int adalah sebagai berikut:
int[] ListNilai;
Kita tidak dapat mengisi nilai element array sampai array itu selesai diciptakan. Setelah
mendeklarasikan array, untuk menciptakan array kita harus mengunakan operator new dan
melakukan assignment kepada tipe data yang direferensi pada variabel array itu . Berikut
adalah cara untuk menciptakan array pada variabel ListNilai yang sudah dideklarasikan
sebelumnya:
ListNilai = new int[15];
Atau kita dapat secara langsung mendeklarasikan dan menciptakan array, seperti berikut:
int[] ListNilai = new int[15];
Untuk men-assign suatu nilai didalam array tentu kita harus melakukan dengan tipe data yang
sesuai dengan yang di referensi oleh array itu . Pada variabel ListNilai hanya
memperbolehkan nilai yang bertipe integer saja. Sintak untuk men-assign suatu nilai kedalam
array adalah sebagai berikut:
79
arrRefVar[indeks] = nilai;
Sebagai contoh dari ListNilai yang sebelumnya sudah kita buat, adalah sebagai berikut:
ListNilai[0] = 34;
ListNilai[1] = 5;
ListNilai[2] = 23;
ListNilai[3] = 23;
ListNilai[4] = 2;
ListNilai[5] = 12;
ListNilai[6] = 123;
ListNilai[7] = 1;
ListNilai[8] = 28;
ListNilai[9] = 4;
ListNilai[10] = 6;
ListNilai[11] = 76;
ListNilai[12] = 45;
ListNilai[13] = 64;
ListNilai[14] = 66;
Pada dasarnya sewaktu array dibuat, programmer mendefinisikan nilai kapasitas dari array
itu , misalnya pada variabel ListNilai memiliki kapasitas array sejumlah 15 elemen.
Jumlah atau kapasitas dari elemen itu dapat diakses dengan memanggil length dari nama
variabel array yang dideklarasikan sebelumnya, seperti ListNilai.length. Sehingga kita
dapat mengisi elemen array ke 14 dengan cara ListNilai[ListNilai.length-1] = 66;
dari pada ListNilai[14] = 66;. Kenapa harus ListNilai.length-1? sebab maksimal
indeks yang dimiliki ListNilai adalah 14 bukan 15 yang merupakan jumlah seluruh element
array.
Bagaimana jika programmer tidak men-assign nilai dari variabel array yang sudah dibuat?
Secara otomatis, ketika array diciptakan setiap elemen dari array itu akan diberi nilai
awal. Untuk tipe data numerik nilai awal adalah 0, karakter adalah \u0000, dan false untuk
boolean.
80
Inisialiasasi suatu array dapat dilakukan dengan dua cara. Cara pertama memasukkan nilai-
nilai elemen array saat array diciptakan secara langsung. Cara kedua adalah memasukkan
nilai-nilai setelah array di ciptakan. Cara pertama adalah sebagai berikut:
double[] arrNilai = {23.2, 1.2, 4.2};
Cara yang kedua adalah sebagai berikut:
double[] arrNilai = new double[3];
arrNilai[0] = 23.2;
arrNilai[1] = 1.2;
arrNilai[2] = 4.2;
Perhatikan bahwa untuk cara pertama tidak bisa dipisahkan tanpa pembuatan array (dengan
keyword new). Berikut adalah cara yang SALAH ketika melakukan inisialisasi array di Java:
double[] arrNilai;
arrNilai[0] = 23.2;
arrNilai[1] = 1.2;
arrNilai[2] = 4.2;
Cara kedua memberikan leluasa kepada programmer untuk dapat menginisialisasi setiap
elemen array. Namun demikian, jika jumlah kapasitas array yang diciptakan besar, maka
tidak mungkin akan dilakukan di isi nilai satu per satu. Maka dari itu, biasanya programmer
akan menginisialisasi dengan bantuan perulangan. Berikut adalah Kode 7.1 merupakan
contoh mengisi array dan men-outputkan array dengan mekanisme perulangan.
Kode 6.1 ArrayInputOutputDemo.java
1
2
3
4
5
6
7
8
9
10
public class ArrayInputOutputDemo {
/* Main Method */
public static void main(String[] args){
// deklarasi dan ciptakan array
double[] arrNilai = new arrNilai[10];
// inputkan nilai pada setiap elemen array
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("Enter " + arrNilai.length + " values: ");
for (int i = 0; i < arrNilai.length; i++)
81
11
12
13
14
15
16
17
arrNilai[i] = input.nextDouble();
// outputkan setiap elemen array yang sudah diinputkan
for (int i = 0; i < arrNilai.length; i++) {
System.out.print(arrNilai[i] + " ");
}
}
}
Kode 7.1 dapat dimodifikasi jika user tidak menginginkan untuk menginputkan nilai secara
manual melainkan dengan nilai random dari 0 sampai 10 misalnya. Maka mekanisme input
nilai pada setiap elemen array dapat diganti seperti berikut:
for (int i = 0; i < arrNilai.length; i++) {
arrNilai [i] = Math.random() * 10;
}
Java juga memiliki mekanisme perulangan khusus yang disebut dengan foreach. Programmer
dapat menggunakan perulangan ini untuk menelusuri array tanpa harus mengakses indeksnya.
Secara umum sintaks untuk membuat perulangan foreach ini adalah sebagai berikut:
for(tipedataElemen elemen: variabelreferensiarray) {
//proses setiap elemen array
}
Kita akan mencoba untuk memodifikasi bagian output dari Kode 7.1 yang tadinya dengan
perulangan for menjadi perulangan foreach. Berikut adalah kode output yang sudah dirubah:
for(double e: arrNilai) {
System.out.print(e+" ");
}
6.3 Mengolah data dengan Array
Array berisi data-data yang mungkin akan diolah sedemikian rupa sehingga dapat
memberikan output keluaran seperti yang diinginkan. Array juga dapat di salin / copy dengan
cara membuat dua buah variabel dengan tipe data array dan memanfaatkan operator ‘=’.
Pastikan bahwa kedua variabel array itu bertipe sama.
82
arr1 = arr2;
Berikut adalah contoh implementasi menyalin nilai setiap member array dari suatu variabel
ke variabel lain:
int[] arrSumber = {1,2,3,4,5};
int[] arrTarget = new int[arrSumber.length];
for(int i=0;i<arrSumber.length;i++)
{
arrTarget[i] = arrSumber[i];
}
Cara yang lain adalah dengan menggunakan System.arraycopy. System.arraycopy
memiliki empat lima buah parameter yaitu variabel sumber yang akan di salin, posisi awal
indeks dari variabel sumber, variabel target, posisi awal indeks dari variabel target, dan
banyaknya member array yang akan di salin. Berikut adalah implementasi kodenya:
System.arraycopy(arrSumber, 0, arrTarget, 0, arrSumber.length);
Array juga dapat digunakan sebagai referensi didalam parameter suatu method dan
mengembalikan nilai dari suatu method. Misalnya kita akan membuat method untuk
menyalin array dengan versi sendiri:
public static int[] copyMyArray(int[] arrSumber)
{
int[] arrTarget = new int[arrSumber.length];
for(int i=0;i<arrSumber.length;i++)
{
arrTarget[i] = arrSumber[i];
}
return arrTarget;
}
Untuk memanggil method itu dapat dilakukan didalam method main seperti berikut:
int[] arrS = {23,42,2,1};
int[] arrT = copyMyArray(arrS);
for(int i=0;i<arrT.length;i++)
System.out.println(arrT[i]);
83
Java mendukung banyaknya argumen variabel dengan tipe data yang sama yang diteruskan
kedalam suatu method yang dapat dianggap sebagai array. Hal itu dapat juga disebut
dengan list dengan agrument yang panjang. Kode 7.2 merupakan contoh implementasi list
dengan argumen yang panjang yang digunakan pada pemanggilan dan parameter suatu
method.
Kode 6.2 AgumentVariabelDemo.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class AgumentVariabelDemo {
public static void main(String[] args) {
cetakMaks(34, 3, 3, 2, 56.5);
cetakMaks(new double[]{1, 2, 3});
}
public static void cetakMaks(double... numbers) {
if (numbers.length == 0) {
System.out.println("tidak ada argumen.");
return;
}
double result = numbers[0];
for (int i = 1; i < numbers.length; i++)
if (numbers[i] > result)
result = numbers[i];
System.out.println("Nilai maksimal: " + result);
}
}
Programmer juga dapat mencari element didalam array. Pada dasarnya array menyimpan
data-data yang mungkin akan di cari oleh user. Dalam pencarian data didalam array dapat
menggunakan algoritma pencarian seperti: pencarian linier/sekuensial, pencarian biner, dan
lain sebagainya. Berikut adalah contoh method yang berisi algoritma pencarian linier didalam
array.
84
public static int linierSearch(int[] arr, int yangdicari)
{
for(int i=0;i<arr.length;i++)
if(yangdicari == arr[i])
return i;
return -1;
}
Elemen array dapat juga diurutkan dengan suatu algoritma pengurutan. Seperti halnya
algoritma pencarian, banyak sekali algoritma pengurutan yang dapat digunakan untuk
mengurutkan setiap elemen array, seperti: pengurutan sekuensial, buble sort, merge sort, dan
lain sebagainya. Berikut adalah contoh method dengan pengurutan sekuensial:
public static void selectionSort(double[] list) {
for (int i = 0; i < list.length - 1; i++) {
// cari nilai minimal dari list[i..list.length−1]
double min = list[i];
int minIndex = i;
for (int j = i + 1; j < list.length; j++) {
if (min > list[j]) {
min = list[j];
minIndex = j;
}
}
// tukar list[i] dengan list[minIndex]
if (minIndex != i) {
list[minIndex] = list[i];
list[i] = min;
}
}
Jika programmer tidak ingin susah-susah untuk membuat method pencarian atau pengurutan
sendiri, Java menyediakan class Arrays. Class Arrays memungkinkan kita untuk memanggil
85
beberapa method seperti pencarian atau pengurutan. Untuk memanfaatkan method-method
atau operasi yang ada didalam class Arrays harus di tambahkan terlebih dahulu import
java.util.Arrays;. Berikut adalah contoh operasi sorting dan searching dengan class
Arrays:
double[] num = {1.2,31,2.65,10};
Arrays.sort(num);
Arrays.binarySearch(num, 1.2);
6.4 Array Multidimensi
Biasanya data secara fisik direpresentasikan dengan bentuk tabel. Sedangkan yang Array
hanya berisi sebaris atau secarik data. Java memungkinkan untuk merepresentasikan data
Array seperti halnya suatu tabel yaitu dengan Array 2D (dimensi). Misalnya ada tabel seperti
berikut:
Tabel 6.2 Tabel merepresentasikan Array 2D
Nama Nilai Matematika Nilai Fisika
Hanum 92 80
Eko 75.6 98.4
Heri 67 70
Dari data nilai itu , programmer dapat memubuat array 2D-nya dengan cara seperti
berikut:
double[][] nilai = {
{92,80},
{75.6,98.4},
{67,70}};
Perhatikan bahwa sintak [][] merupakan deklarasi untuk array 2D. Kode sebelumnya dapat
dibuat seperti berikut:
double[][] nilai = new double [3][2];
nilai[0][0] = 92; nilai[0][1] = 80; nilai[1][0] = 75.6;
86
nilai[1][1] = 98.4; nilai[2][0] = 67; nilai[2][1] = 70;
Array 2D seringkali juga dapat digunakan untuk pengganti “matriks”. Untuk dapat
menggunakan array 2D biasanya programmer tetap memanfaatkan perulangan. Berikut
adalah kode untuk deklarasi dan inisialisasi array 2D dengan diberikan nilai random dan
kemudian dicetak pada console output:
//deklarasi
int[][] matriks = new int[10][10];
//inisialisasi dan pemberian nilai random 0-99
for(int baris=0;baris<matriks.length;baris++)
for(int kolom=0;kolom<matriks[baris].length;kolom++)
matriks[baris][kolom] = (int)(Math.random() * 100);
//cetak pada console output
for(int baris=0;baris<matriks.length;baris++) {
for(int kolom=0;kolom<matriks[baris].length;kolom++) {
System.out.print(matriks[baris][kolom]+” ”);
}
System.out.println();
}
6.5 Array dari Objek
Kita juga dapat membuat array dari objek. Sebagai contoh, sebelumnya terdapat class
MahasiswaIndividu. Kemudian dari class MahasiswaIndividu itu akan dibuat array dari
MahasiswaIndividu dan akan digunakan untuk mengakses member class MahasiswaIndividu.
Kode 7.3 merupakan class MahasiswaIndividu dan Kode 7.4 merupakan class
TestMahasiswaIndividu yang mengimplementasikan array dari objek MahasiswaIndividu.
Kode 6.3 MahasiswaIndividu.java
1
2
3
4
5
6
public class MahasiswaIndividu
{
private String nim;
public void setNim(String nim)
{
this.nim = nim;
87
7
8
9
10
11
12
}
public String getNim()
{
return this.nim;
}
}
Kode 6.4 TestMahasiswaIndividu.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TestMahasiswaIndividu
{
public static void main(String[] args)
{
//deklarasi list dari objek
MahasiswaIndividu[] listMhs = new MahasiswaIndividu[10];
//instance setiap member list
for(int i=0;i<10;i++)
listMhs[i] = new MahasiswaIndividu();
//akses setter getter method dari setiap member
for(int i=0;i<10;i++)
listMhs[i].setNim("A11.2020."+(i+1));
for(int i=0;i<10;i++)
System.out.println(listMhs[i].getNim());
}
}
Kode 7.4 akan menghasilkan output sebagai berikut:
A11.2020.1
A11.2020.2
88
A11.2020.3
A11.2020.4
A11.2020.5
A11.2020.6
A11.2020.7
A11.2020.8
A11.2020.9
A11.2020.10
6.6 Array Dinamis (List Collection)
Berbeda dengan array yang sebelumnya dijelaskan, array dinamis merupakan bentuk array
yang memungkinkan programmer untuk dapat membuat list dengan mengatur setiap member
list sesuka hati. Di Java terdapat banyak cara untuk membuat array dinamis tanpa harus
membuat array dinamis manual, seperti, list, linked list, queue, ataupun stack. Terdapat class
ArrayList di Java. ArrayList merupakan kelas turunan dari List yang memiliki ukuran list
yang bisa bertambah (dinamis/growable). Class ini salah satu bagian dari Generic
Programming di Java. Generic Programming adalah suatu teknik pemorgraman dari
pembentukan variable atau method atau class yang dapat digunakan untuk semua jenis tipe
data. ArrayList termasuk dalam java framework collection.
Gambar 6.1 Class Diagram ArrayList
Didalam ArrayList terdapat beberapa method yang seringkali digunakan. Berikut adalah
beberapa method itu :
89
add(obj) untuk menambahkan member list
remove(obj) untuk menghapus/menghilangkan member list
get(index) mendapatkan akses memberlist ke-index
Kode 7.5 adalah Kode TestMahasiswaIndividu yang isinya telah dirubah menggunakan
ArrayList.
Kode 6.5 TestMahasiswaIndividu.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.ArrayList;
public class TestMahasiswaIndividu
{
public static void main(String[] args)
{
//deklarasi list dari objek
ArrayList<MahasiswaIndividu> listMhs = new
ArrayList<MahasiswaIndividu>();
//instance setiap member list dengan menambahkan kedalam
list
for(int i=0;i<10;i++)
listMhs.add(new MahasiswaIndividu());
//akses setter getter method dari setiap member
for(int i=0;i<10;i++)
listMhs.get(i).setNim("A11.2020."+(i+1));
for(int i=0;i<10;i++)
System.out.println(listMhs.get(i).getNim());
}
}
90
Selain ArrayList juga terdapat Vector. Turunan dan implementasi yang sama dengan
ArrayList. Setiap vektor mencoba untuk mengoptimalkan manajemen penyimpanan dengan
mempertahankan kapasitasnya. Termasuk juga kedalam Java Collection. Lebih banyak
Method dari Vector jika dibandingakan dengan ArrayList. Vector tensinkronisasi sedangkan
ArrayList tidak. Tensinkronisasi maksudnya ”Thread-Safe" dari semua keuntungan method
yang sedang disinkronkan (melalui kata kunci synchronized). Berikut adalah method-method
yang ada pada Vector:
addElement(element) Menambah element
capacity() Mengembalikan kapasitas vektor
clone() Mengembalikan objek yang di copy dari vector
containts(element) mencari element vector
copyInto(element[]) copy element pada array tertentu
elementAt(index) ambil elemen dari index yang ditentukan
insertElementAt(element , index) tambahkan element dengan indexnya
isEmpty() cek apakah vector Kosong atau tidak
remove(index) hapus element berdasarkan index
size() ukuran vektor
set(index, element) isikan elemen vector pada suatu index yang diingkan
Kode 7.6 merupakan implementasi dari penggunaan Vector.
Kode 6.6 TestVector.java
1
2
3
4
5
6
7
import java.util.Vector;
public class TestVector
{
public static void main(String[] args)
{
// initial size is 3, increment is 2
Vector v = new Vector(3, 2);
91
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
System.out.println("Initial size: " + v.size());
System.out.println("Initial capacity: " + v.capacity());
v.addElement(new Integer(1));
v.addElement(new Integer(2));
v.addElement(new Integer(3));
v.addElement(new Integer(4));
System.out.println("Capacity after four additions: " +
v.capacity());
v.addElement(new Double(5.45));
System.out.println("Current capacity: " + v.capacity());
v.addElement(new Double(6.08));
v.addElement(new Integer(7));
System.out.println("Current capacity: " + v.capacity());
v.addElement(new Float(9.4));
v.addElement(new Integer(10));
System.out.println("Current capacity: " + v.capacity());
v.addElement(new Integer(11));
v.addElement(new Integer(12));
System.out.println("First element: " +
(Integer)v.firstElement());
System.out.println("Last element: " +
(Integer)v.lastElement());
if(v.contains(new Integer(3)))
System.out.println("Vector contains 3.");
}
}
92
6.7 Kesimpulan
Array sangat membantu programmer untuk membuat list dari serangkaian data. Terdapat dua
jenis array yaitu array statis dan dinamis. Array Statis merupakan array yang sudah memiliki
ukuran yang ditentukan dari awal. Sedangkan array dinamis merupakan array yang dapat
memiliki ukuran yang dapat disesuaikan (growable). Pada dasarnya stuktur data akan lebih
teratur dan rapi jika menggunakan array. Pada java sudah disediakan beberapa objek array
dinamis seperti ArrayList dan Vector.
6.8 Kuis dan Latihan Soal
1. Jelaskan apa yang dimaksud dengan array?
2. Apa perbedaan array statis dan dinamis?
3. Apakah bisa membuat list dari objek dengan Vector? Jika bisa buatkan contoh
programnya!
6.9 Praktikum
Buat class Mobil dan kemudian buat implementasi list dari Mobil dengan menggunakan
ArrayList!
93
BAB 7 PEWARISAN
7.1 Konsep Pewarisan
Pewarisan/ inheritance memungkinkan kita untuk mendefinisikan class baru dari class yang
sudah ada. Konsep ini sangat penting dan bermanfaat untuk menghindari redundansi,
membuat sistem mudah dipahami dan musah dirawat. Misalnya terdapat class
PersegiPanjang, Persegi, Lingkaran, dan Segitiga. Class-class itu memiliki banyak fitur/
method umum yang sama seperti luas, keliling, volume dan lain-lain. Agar tidak membuat
method umum secara berulang-ulang, kita perlu menggunakan konsep pewarisan.
Meletakkan method umum ke dalam superclass dan method itu dapat digunakan oleh
subclass (class PersegiPanjang, Persegi, Lingkaran, dan Segitiga). Pewarisan ini disebut
hierarchical inheritance (1 superclass dan banyak subclass), terdapat jenis pewarisan yang
lain seperti single inheritance (1 superclass dan 1 subclass), multi level inheritance (1
superclass, banyak subclass, dan banyak subclass lagi), dan multiple inheritance (2 superclass
atau lebih dan 1 subclass), jenis ini bisa dilakukan dengan interface. Jenis-jenis pewarisan
dapat dilihat pada tabel 7.1.
Tabel 7.1. Jenis-jenis pewarisan
Struktur Contoh Kode Sumber
Single Inheritance
public class Bentuk{
….
}
public class PersegiPanjang extends Bentuk{
….
}
Multi Level
Inheritance
public class Bentuk{
….
}
public class PersegiPanjang extends Bentuk{
….
}
public class Balok extends PersegiPanjang{
….
}
Hierarchical
Inheritance
public class Bentuk{
….
}
public class PersegiPanjang extends Bentuk{
….
}
public class Lingkaran extends Bentuk{
….
}
PersegiPanjang
Bentuk
Balok
Bentuk
PersegiPanjang
PersegiPanjang
Bentuk
Lingkaran
94
Multiple
Inheritance
public class Bentuk{
….
}
public interface Dimensi{
….
}
public class Balok extends implements Dimensi{
….
}
7.2 Superclasses dan Subclasses
Superclass dapat juga disebut dengan parent class atau base class, dan subclass
disebut dengan child class, extended class, atau derived class. Superclass berisi method dan
property umum. Misal kita akan membuat superclass Bentuk, dengan property warna dan isi.
Sedangkan kita memiliki subclass PersegiPanjang, Persegi, Lingkaran, dan Segitiga. Property
yang dimiliki superclass Bentuk dapat digunakan pula oleh masing-masing subclassnya.
sebab kita sudah memiliki class PersegiPanjang dan Lingkaran pada bab-bab sebelumnya,
kita akan mengkonversi mandiri jadi class pewarisan di bagian praktikum.
Kali ini, mari kita menggunakan contoh lain dengan jenis multi level inheritance.
Class Kendaraan sebagai superclass, class Udara sebagai subclass, dan class Pesawat sebagai
subclass lainnya. Berikut gambar 7.1 yang berisi tentang UML Pewarisan Kendaraan.
Kendaraan
-nama: string
-tahunProduksi: integer
+getNama(): string
+setNama(nama: String): void
+getTahunProduksi(): integer
+setTahunProduksi(tahunProduksi: int): void
+Kendaraan()
+Kendaraan(nama: string, tahunProduksi: int)
+cetak(): void
Udara
-mesin: boolean
+getMesin(): boolean
+setMesin(mesin: boolean): void
+Udara()
+Udara(nama: string, tahunProduksi: int, mesin: boolean)
+cetak(): void
Pesawat
-muatan: integer
+getMuatan(): integer
+setMuatan(muatan: integer ): void
Balok
Bentuk
<<interface>>
Dimensi
95
+Pesawat ()
+Pesawat (nama: string, tahunProduksi: int, mesin: boolean, muatan: int)
+reset(nama: string, tahunProduksi; int, mesin: boolean, muatan: int): void
+kategori(muatan: int): String
+cetak(): void
Gambar 7.1. UML Pewarisan Kendaraan
Class Kendaraan memiliki property dan method umum, seperti contoh property nama
dan tahunProduksi, serta method-method pendukung. sebab class Kendaraan merupakan
superclass, maka semua property dan method itu dapat digunakan pada class Udara.
Class Udara juga merupakan superclass dari class Pesawat, jadi class Pesawat bisa
mengakses semua property dan method milik class Udara maupun class Kendaraan. Gunakan
katakunci extends untuk menunjukkan bahwa kelas itu merupakan pewarisan.
Subclass Superclass
public class Udara extends Kendaraan{}
Berikut kode sumber 7.1 yang menjelaskan pewarisan kendaraan berdasarkan UML gambar
7.1.
Kode 7.1 Kendaraan.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Kendaraan {
private String nama;
private int tahunProduksi;
public String getNama(){
return nama;
}
public void setNama(String nama){
this.nama = nama;
}
public int getTahunProduksi(){
return tahunProduksi;
}
public void setTahunProduksi(int tahunProduksi){
this.tahunProduksi = tahunProduksi;
96
16
17
18
19
20
21
22
23
24
25
26
27
28
}
public Kendaraan(){ //overloading method, ingat.. kontruktor juga
merupakan methhod
}
public Kendaraan(String nama, int tahunProduksi){ //overloading
method
setNama(nama);
setTahunProduksi(tahunProduksi);
}
public void cetak(){//overriding method
System.out.println("Nama\t\t= "+nama);
System.out.println("Tahun Produksi = "+tahunProduksi);
}
}
Kode 7.2 Udara.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Udara extends Kendaraan{
private boolean mesin;
public boolean getMesin(){
return mesin;
}
public void setMesin(boolean mesin){
this.mesin = mesin;
}
public Udara(){//overloading method
}
public Udara(String nama, int tahunProduksi, boolean mesin){
//overloading method
97
15
16
17
18
19
20
21
22
23
24
25
26
super(nama, tahunProduksi); //memanggil konstruktor Kendaraan
setMesin(mesin);
}
public void cetak(){ //overriding method
super.cetak(); //memanggil method cetak dari Kendaraan
System.out.print("Mesin\t\t= ");
if(mesin==true)
System.out.println("Jet");
else
System.out.println("Baling-baling");
}
}
Kode 7.3 Pesawat.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Pesawat extends Udara{
private int muatan;
public int getMuatan(){
return muatan;
}
public void setMuatan(int muatan){
this.muatan = muatan;
}
public Pesawat(){//overloading method
}
public Pesawat(String nama, int tahunProduksi, boolean mesin, int
muatan){ //overloading method
super(nama, tahunProduksi, mesin); //memanggil konstruktor
Udara
setMuatan(muatan);
98
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
}
public void reset(String nama, int tahunProduksi, boolean mesin,
int muatan){
setNama(nama); //memanggil method setNama dari Kendaraan
setTahunProduksi(tahunProduksi); //memanggil method
setTahunProduksi dari Kendaraan
setMesin(mesin); //memanggil method setMesin dari Udara
setMuatan(muatan);
}
public String kategori(int muatan){
if(muatan<=100)
return "Mini";
else if(muatan<=200)
return "Sedang";
else
return "Besar";
}
public void cetak(){ //overriding method
super.cetak();//memanggil method cetak dari Udara
System.out.println("Muatan \t\t= "+muatan+" orang");
System.out.println("Kategori\t= "+kategori(muatan));
}
}
Kode 7.4 PesawatDemo.java
1
2
3
4
5
6
7
public class PesawatDemo {
public static int min2(int a, int b){
if(a<b)
return a;
else
return b;
99
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
}
public static boolean isNamaSama(Pesawat p1, Pesawat p2){
if(p1.getNama().toLowerCase().equals(p2.getNama().toLowerCase()))
return true;
else
return false;
}
public static void main(String[] args){
Pesawat[] p = new Pesawat[3];
p[0] = new Pesawat();
p[1] = new Pesawat("Garuda Boeing 777", 1990, true, 305);
p[2] = new Pesawat("Citilink Airbus A320", 1988, true, 150);
p[0].reset("Wings Air ATR 72-500", 1988, false, 72);
p[0].cetak(); System.out.println("");
p[1].cetak(); System.out.println("");
p[2].cetak(); System.out.println("");
System.out.print("Nama pesawat pertama dan kedua ");
if(isNamaSama(p[0], p[1]))
System.out.println("sama");
else
System.out.println("tidak sama");
System.out.print("");
if(p[0].getMuatan()<min2(p[1].getMuatan(), p[2].getMuatan()))
System.out.println("Muatan paling sedikit =
"+p[0].getNama());
else if(p[1].getMuatan()<min2(p[0].getMuatan(),
p[2].getMuatan()))
System.out.println("Muatan paling sedikit =
100
38
39
40
41
"+p[1].getNama());
else
System.out.println("Muatan paling sedikit =
"+p[2].getNama());
}
}
Output:
Nama = Wings Air ATR 72-500
Tahun Produksi = 1988
Mesin = Baling-baling
Muatan = 72 orang
Kategori = Mini
Nama = Garuda Boeing 777
Tahun Produksi = 1990
Mesin = Jet
Muatan = 305 orang
Kategori = Besar
Nama = Citilink Airbus A320
Tahun Produksi = 1988
Mesin = Jet
Muatan = 150 orang
Kategori = Sedang
Nama pesawat pertama dan kedua tidak sama
Muatan paling sedikit = Wings Air ATR 72-500
101
7.3 Keyword Super
Keyword super digunakan untuk merujuk langsung property/ method/ konstruktor pada
superclass. Contoh masing-masing penerapan sebagai berikut:
Keyword super untuk property,contohnya super.nama berarti kita merujuk property nama
dari class Kendaraan
Keyword super untuk method, contohnya pada kode sumber 7.1 Udara.java baris ke-17.
Menggunakan super.cetak(); berarti memanggil method cetak dari Kendaraan. sebab
pada class Udara juga memiliki method cetak, maka kita wajib menggunakan super jika
ingin memanggil method cetak milik superclass
Keyword super untuk konstruktor, contohnya pada kode sumber 7.1 Udara.java baris ke-
13. Menggunakan super(nama, tahunProduksi); berarti memanggil konstruktor
Kendaraan yang memiliki parameter inputan nama dan tahunProduksi.
7.4 Overriding Method
Overriding method adalah method yang memiliki nama dan parameter inputan yang sama. Itu
berarti overriding menyediakan implementasi baru untuk suatu method dalam subclass.
Contohnya pada kode sumber 7.1 untuk method cetak(). Method cetak pada Kendaraan.java
terletak di baris ke 23, pada Udara.java terletak di baris 16, dan pada Pesawat.java terletak di
baris ke 31. Jika kita ingin memanggil method cetak milik superclass, kita harus
menggunakan keyword super. Kalau tidak, maka method cetak merujuk pada diri sendiri.
7.5 Overriding vs Overloading
Overriding method adalah method yang memiliki nama dan parameter inputan yang sama.
Sedangkan overloading method adalah method-method yang memiliki nama yang sama
namun berbeda-beda parameter inputannya, kita sudah membahsanya tuntas pada BAB 3.3.
Untuk melihat perbedaan overriding dan overloading dengan lebih jelas, mari kita lihat tabel
7.1 di bawah ini.
102
Tabel 7.1. Overriding vs Overloading
Overriding Overloading
public class Kendaraan {
public void
cetak(){//overriding method
…
}
}
public class Udara extends Kendaraan
{
public void
cetak(){//overriding method
…
}
}
public class Kendaraan {
public Kendaraan(){
//overloading method, ingat..
kontruktor juga merupakan methhod
…
}
public Kendaraan(String nama,
int tahunProduksi){ //overloading
method
…
}
}
7.6 Kesimpulan
Pewarisan/ inheritance memungkinkan kita untuk mendefinisikan class baru dari class yang
sudah ada. Konsep ini sangat penting dan bermanfaat untuk menghindari redundansi,
membuat sistem mudah dipahami dan musah dirawat. Superclass dapat juga disebut dengan
parent class atau base class berisi property atau method umum yang akan diturunkan untuk
subclass. Subclass disebut dengan child class, extended class, atau derived class, dapat
menggunakan property atau method dari superclass. Syarat untuk melakukan pewarisan,
harus menggunakan keywords extends. Keyword super digunakan untuk merujuk langsung
property/ method/ konstruktor pada superclass. Overriding method adalah method yang
memiliki nama dan parameter inputan yang sama. Itu berarti overriding menyediakan
implementasi baru untuk suatu method dalam subclass.
7.7 Kuis dan Latihan Soal
1. Apa manfaat dari pewarisan?
2. Apakah benar, kita bisa menggunakan semua property atau method dari superclass?
103
3. Apa keyword yang digunakan untuk melakukan pewarisan?
4. Apa keyword yang digunakan untuk merujuk langsung property/ method/ konstruktor
pada superclass?
5. Jelaskan perbedaan overloading dan overriding!
7.8 Praktikum
1. Buatlah implementasi kode sumber dari UML class diagram di bawah ini!
2. Buatlah UML Class Diagram dan kode sumber yang menerapkan konsep pewarisan
dengan tema bebas! Minimal 3 class.
Lingkaran
-radius: double = 0.0
+Lingkaran()
+Lingkaran(radius: double)
+Lingkaran(radius: double, warna:
String, isi: boolean)
+setRadius(): double
+getRadius(): double
+getLuas(): double
+getKeliling(): double
+toString(): String
Bentuk
-warna: String = “red”
-isi: boolean = true
+Bentuk()
+Bentuk(warna: String, isi: boolean)
+getWarna(): String
+setWarna(warna: String): void
+setIsi(isi: boolean): boolean
+getIsi(): Boolean
+toString(): String
PersegiPanjang
-panjang: double = 1.0
-lebar: double = 1.0
+PersegiPanjang()
+PersegiPanjang(panjang: double, lebar:
double)
+PersegiPanjang(panjang: double, lebar:
double: double, warna: String, isi: boolean)
+setPanjang(): void
+getPanjang (): double
+setLebar(): void
+getLebar(): double
+getLuas(): double
+getKeliling(): double
+toString(): String
104
BAB 8 POLYMORPHISM
8.1 Konsep Polymorphism
Tiga pilar dasar pada PBO yaitu Enkapsulasi, Inheritance, dan Polymorphism. Kita sudah
mempelajari Enkapsulasi dan Inheritance. Sebelum ke polymorphism, ada dua istilah yang
harus dimengerti terlebih dahulu:
Class yang didefinisikan oleh sub-class disebut dengan subtype
Class yang didefinisikan oleh super-class disebut dengan supertype
Sebagai contoh ObjekGeometri merupakan supertype dan Kotak merupakan subtype
sebagaimana yang sudah dipahami seperti pada konsep inheritance. Secara sederhana
Polymorphism berarti memiliki arti banyak bentuk. Dalam pemrograman berorientasi objek,
polymorphism berarti suatu variable dari supertype dapat mereferensi objek subtype.
Lalu apa yang dimaksud dengan mereferensi? Hubungan inheritance memungkinkan subclass
untuk mewarisi fitur dari superclass-nya dengan tambahan fitur baru. Subclass adalah
spesialisasi superclass-nya. Setiap contoh dari subclass juga merupakan instance dari
superclass, tetapi tidak sebaliknya. Misalnya setiap kotak adalah ObjekGeometri, tetapi tidak
setiap ObjekGeometri adalah kotak. sebab itu, kita bisa selalu meneruskan instance dari
subclass ke parameter dari jenis superclassnya.
Kode 8.1 ObjekGeometri.java
1
2
3
4
5
6
7
8
9
10
11
public class ObjekGeometri
{
private String color = "red";
public void setColor(String color)
{
this.color = color;
}
public String getColor()
{
return this.color;
105
12
13
}
}
Kode 8.2 Lingkaran.java
1
2
3
4
public class Lingkaran extends ObjekGeometri
{
}
Kode 8.3 Kotak.java
1
2
3
4
public class Kotak extends ObjekGeometri
{
}
Kode 8.4 TestPolymorphism.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TestPolymorphism
{
public static void main(String[] args)
{
Kotak persegi = new Kotak();
persegi.setColor("Blue");
ObjekGeometri bentukSem = new ObjekGeometri();
bentukSem.setColor("Black");
displayObject(persegi);
displayObject(new Lingkaran());
displayObject(bentukSem);
}
public static void displayObject(ObjekGeometri obj)
{
106
16
17
18
System.out.println(obj.getColor());
}
}
Output
Blue
Red
Black
Pada Kode 8.4 terdapat static method untuk mendisplay warna objek yaitu displayObject.
Pada mehthod itu terdapat parameter masukan ObjekGeometri yang berarti super-type
dari Lingkaran dan Kotak. Secara sederhana polymorphism berarti variabel super-type dapat
merujuk ke objek sub-type.
8.2 Dynamic Binding
Dynamic Binding merupakan perluasan dari konsep polymorphism yang tidak hanya super-
type dan sub-type juga, tetapi terkadang super-type juga merupakan sub-type dari super-type
yang lain. Sehingga jika akan membuat method dengan dynamic binding berarti method yang
dapat diimplementasi pada beberapa kelas sepanjang rantai keturunan. Method yang akan di
panggil secara dinamis dan terikat saat runtime. Kode 8.5 adalah contoh penerapan Dynamic
Binding.
Kode 8.5 DynamicBindingDemo.java
1
2
3
4
5
6
7
8
9
10
public class DynamicBindingDemo {
public static void main(String[] args) {
m( new GraduateStudent());
m(new Student());
m(new Person());
m(new Object());
}
public static void m(Object x) {
System.out.println(x.toString());
107
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
}
}
class GraduateStudent extends Student { }
class Student extends Person {
@Override
public String toString() {
return "Student" ;
}
}
class Person extends Object {
@Override
public String toString() {
return "Person";
}
}
Output:
Student
Student
Person
Java.lang.Object@15db9742
8.3 Kesimpulan
Salah satu konsep penting dalam pemrograman berorientasi objek adalah polymorphism.
Dengan polyomrphism objek akan dianggap memiliki banyak bentuk sehingga hal ini akan
memudahkan programmer dalam membuat referensi pemanggilan objek dari satu method.
Perluasan dari teknik polymorphism adalah Dynamic Binding. Dynamic Binding
memungkinkan programmer untuk melakukan polymorphism disepanjang hierarki turunan
dari suatu objek-objek dari sistem yang dikembangkan.
108
8.4 Kuis dan Latihan Soal
1. Jelaskan apa yang dimaksud dengan polymorphism?
2. Mengapa programmer membutuhkan polymorphism?
3. Apakah polymorphism selalu terkait dengan inheritance?
8.5 Praktikum
Buat class Kendaraan, Mobil, Truk, SepedaMotor, Bus, MobilBerat. Pehatikan bahwa
Kendaraan merupakan super-class dari Mobil, SepedaMotor, dan MobilBerat. Kemudian,
MobilBerat merupakan super-class dari Truk dan Bus. Buat method yang dapat
mengimplementasikan Dynamic Binding! Member class (property atau method) pada setiap
Class boleh dibuat sesuka hati.
109
BAB 9 ABSTRACT CLASS DAN INTERFACE
9.1 Abstract Class
Pada konsep pewarisan, super-class biasanya memiliki struktur yang umum dan sub-class
lebih spesifik. Seharusnya pada super-class memiliki fitur-fitur umum yang akan diwariskan
kepada sub-class. Bisa jadi, programmer membutuhkan super-class yang hanya menyajikan
fitur-fitur umum yang harus dijelaskan lebih spesifik didalam sub-class tanpa harus membuat
objek dari super-class itu . Suatu class yang hanya menyajikan fitur-fitur umum dan
tidak dapat dibuat objek disebut dengan class abstract. Kita dapat menyebut class abstract ini
sebagai class yang akan digunakan sebagai acuan pada desain sub-class yang akan diwarisi
oleh abstract class ini. Suatu abstract class juga dapat memiliki abstract method. Abstract
method harus di implementasikan secara konkret didalam sub-class. Misalnya pada Kode 9.1
mencoba untuk membuat abstract class untuk Hewan dan Kode 9.2 membuat sub-class
Ayam.
Kode 9.1 Hewan.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public abstract class Hewan
{
public boolean terbang = false;
public void bisaTerbang(boolean terbang)
{
this.terbang = terbang;
}
public boolean isTerbang()
{
return this.terbang;
}
public abstract void bernapas();
}
110
Kode 9.2 Ayam.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Ayam extends Hewan
{
public void bernapas()
{
System.out.println("aku bernapas");
}
public static void main(String[] args)
{
Ayam kutuk = new Ayam();
kutuk.bisaTerbang(true);
System.out.println("Apakah bisa terbang:
"+kutuk.isTerbang());
kutuk.bernapas();
}
}
Setiap sub-class yang menerapkan abstract class sebagai super-class harus dengan
menambahkan kata kunci “extends” seperti halnya menerapkan pewarisan biasa. Perhatikan
bahwa jika didalam abstract class memiliki abstract method, abstract method itu harus
dijelaskan secara konkret di dalam sub-class seperti pada method bernapas(). Kita juga
tidak dapat membuat objek Hewan sebab merupakan abstract class.
Hewan
+terbang: boolean = false
+bisaTerbang(terbang: boolean): void
+isTerbang(): boolean
+bernapas(): void
Ayam
+main(args: String[]): void
Gambar 9.1 UML class diagram abstract class Hewan
Abstract class
dan abstract
method
ditandai
dengan huruf
miring
111
Gambar 9.1 menjelaskan tentang UML class diagram abstract Hewan yang mewariskan
atribut dan methodnya ke class Ayam. Untuk menandakan jika class Hewan termaksud class
abstract, maka harus ditulis dengan huruf miring, begitu pula untuk method dan atribut.
Method bernafas() pada class Ayam tidak perlu ditulis kembali, sebab default harus
dijelaskan secara konkret dalam artian wajib dikoding di kelas Ayam.
9.2 Interface
Mirip dengan abstract, interface hanya berfokus pada konstruksi operasi umum pada suatu
object. Kita dapat menganggap interface ini sebagai kerangka dari suatu class. Secara struktu
interface bukan merupakan class. Sehingga dalam membuat kode program interface tidak lagi
menggunakan kata “class”. Kode 9.3 merupakan contoh interface MahlukHidup.
Kode 9.3 MahlukHidup.java
1
2
3
4
5
public interface MahlukHidup
{
public abstract void bernapas();
public boolean isHidup();
}
Interface hanya berisi abstract method baik yang menggunakan kata abstract maupun tidak.
Disini ditandai dengan definisi method yang langsung ditutup dengan tanda titik koma bukan
kurung kurawal buka dan tutup. Interface dapat diterapkan kepada class biasa maupun
abstract class. Untuk mengimplementasikan interface dibutuhkan tambahan sintak
implements seperti Kode 9.4 Hewan.java yang telah dimodifikasi ini.
Kode 9.4 Hewan.java
1
2
3
4
5
6
7
public abstract class Hewan implements MahlukHidup
{
public boolean terbang = false;
public void bisaTerbang(boolean terbang)
{
this.terbang = terbang;
112
8
9
10
11
12
13
14
15
16
17
18
19
20
21
}
public boolean isTerbang()
{
return this.terbang;
}
public abstract void bernapas();
public boolean isHidup()
{
return true;
}
}
Semua method yang sudah didefinisikan didalam interface WAJIB di implementasikan
didalam class yang sudah menerapkan interface itu (kecuali jika diterapkan pada
abstract method). Kode 9.5 merupakan class Ayam yang sudah dimodifikasi dengan
memanggil method isHidup().
Kode 9.5 Ayam.java
1
2
3
4
5
6
7
8
9
10
11
public class Ayam extends Hewan
{
public void bernapas()
{
System.out.println("aku bernapas");
}
public static void main(String[] args)
{
Ayam kutuk = new Ayam();
kutuk.bisaTerbang(true);
113
12
13
14
15
16
System.out.println("Apakah bisa terbang:
"+kutuk.isTerbang());
kutuk.bernapas();
System.out.println("Apakah benda hidup:
"+kutuk.isHidup());
}
}
Pada contoh kode sebelumnya interface diterapkan pada abstract method. Bagaimana jika
diterapkan pada class biasa. Kode 9.6 merupakan contoh penerapan interface MahlukHidup
pada class biasa.
Kode 9.6 Tumbuhan.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Tumbuhan implements MahlukHidup
{
public void bernapas()
{
System.out.println("aku tidak bernapas");
}
public boolean isHidup()
{
return true;
}
public static void main(String[] args)
{
Tumbuhan cemara = new Tumbuhan();
cemara.bernapas();
System.out.println("Apakah benda hidup:
"+cemara.isHidup());
}
}
114
<<interface>>
MahlukHidup
+bernapas(): void
+isHidup(): boolean
Hewan
+terbang:boolean = false
+bisaTerbang(terbang: boolean): void
+isTerbang():boolean
Ayam
+main(args: String[]): void
Gambar 9.2 UML class diagram interface class MahlukHidup
Gambar 9.2 menjelaskan tentang UML class diagram interface MahlukHidup. Class interface
dapat diwariskan dengan keyword implements, dalam UML class diagram digambarkan
dengan garis panah putus-putus. Class interface dituliskan dengan huruf miring dan
dijelaskan lagi dengan keterangan kata <<interface>>. Secara implisit atribut di class
interface bersifat public static dan final. Sedangkan untuk method, secara implisit bersifat
public dan abstrak sehingga ditulis dengan huruf miring. Method bernafas() dan
isHidup() pada class Hewan dan Tumbuhan tidak perlu ditulis kembali, sebab method
itu bersifat abstract dan wajib dikoding.
9.3 Implementasi Kombinasi Abstract Class dan Interface
Dalam mendesain class diagram, terkadang desainer membuat desain yang mengharuskan
programmer untuk menerapkan abstract class dan interface secara langsung pada class biasa.
Apakah itu memungkinkan? Tentu saja bisa. Misalnya kita membuat abstract class Dedaunan
seperti pada Kode 9.7.
Kode 9.7 Dedaunan.java
1
2
3
public abstract class Dedaunan
{
public void daunBergerak()
Tumbuhan
+main(args: String[]): void
115
4
5
6
7
{
System.out.println("daun melambai-lambai");
}
}
Kita akan memodifikasi Kode 9.6 tidak hanya menerapkan interface MahlukHidup, tetapi
juga menerapkan abstract class Dedaunan. Kode 9.8 merupakan class Tumbuhan yang telah
dimodifikasi. UML class diagram dapat dilihat pada GAMBAR 9.
Kode 9.8 Tumbuhan.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Tumbuhan extends Dedaunan implements MahlukHidup
{
public void bernapas()
{
System.out.println("aku tidak bernapas");
}
public boolean isHidup()
{
return true;
}
public static void main(String[] args)
{
Tumbuhan cemara = new Tumbuhan();
cemara.bernapas();
System.out.println("Apakah benda hidup:
"+cemara.isHidup());
cemara.daunBergerak();
}
}
116
<<interface>>
MahlukHidup
+bernapas(): void
+isHidup(): boolean
Hewan
+terbang:boolean = false
+bisaTerbang(terbang: boolean): void
+isTerbang():boolean
Ayam
+main(args: String[]): void
Gambar 9.3 UML class diagram kombinasi abstract interface
9.4 Kesimpulan
Seorang desainer sistem, dalam mendesain suatu class terkadang membutuhkan bentuk class
yang abstrak atau kerangka dari sebuah class sebelum diimplementasikan. Hal ini digunakan
untuk memudahkan programmer dalam menerjemahkan “bahasa bisnis” kedalam kode
program. Abstract class merupakan class yang hanya menyajikan fitur-fitur umum dan tidak
dapat dibuat objek. Sedangkan interface merupakan bentuk kerangka suatu class yang juga
berisi fitur-fitur umum yang berbentuk abstrak.
9.5 Kuis dan Latihan Soal
1. Jelaskan apa perbedaan abstrak dan interface?
2. Yang mana dari gambar berikut yang benar?
3. Dapatkah suatu abstract class mengimplementasikan interface?
Dedaunan
+daunBergerak(); void
Tumbuhan
+main(args: String[]): void
117
9.6 Praktikum
Perusahaan “Harpindo Kita” membutuhkan sebuah sistem informasi jual beli mobil. Sistem
mampu mendaftarkan biodata karyawan dan pembeli. Pembeli dibagi dalam 2 jenis yaitu:
pembeli individu dan pembeli borongan. Mobil yang dijual ada tiga tipe yaitu: Mobil sedan,
Mobil minibus, dan mobil bus. Karyawan dapat menambahkan harga setiap mobil yang ada.
Pembeli hanya dapat membeli satu tipe mobil saja (berarti dalam hal ini berarti dapat
membeli mobil banyak dengan tipe yang sama). Karyawan dapat melihat data pembeli yang
sudah membeli mobil. Karyawan mendapatkan keuntungan 10% dari total jumlah harga
terbayar oleh setiap pembeli dalam setiap waktu.
PETUNJUK:
1. Minimal terdapat 7 kelas (terserah boleh subclass, superclass, abstract class, atau
interface)
2. Method dan property bebas yang sesuai dengan ilustrasi kasus diatas.
3. Keterangan setiap property dan method yang ada pada class diagram dijelaskan
beserta potongan kode programnya.
4. Boleh dikembangkan. Dan beri keterangan pengembangan dari kasus diatas.
118
BAB 10 EXCEPTION, PEMROGRAMAN GENERIK, DAN
DESIGN PATTERN
10.1 Exception
Pada dasarnya ada tiga jenis error didalam pemrograman dengan Java, yaitu: syntax error,
logic error, dan runtime error. Syntax error merupakan kesalahan yang terjadi saat
programmer salah menuliskan kode program. Misalnya, saat programmer kurang
memberikan titik koma di akhir dari statement. Biasanya error ini akan muncul saat progam
di-compile. Logic error berkaitan dengan kesalahan yang dilakukan programmer saat
programmer membuat kode sehingga akan menghasilkan output kode yang tidak sesuai
dengan yang diinginkan. Kesalahan logic error seringkali disebut sebagai bug/kutu. Untuk
menangani bug dilakukan proses debugging. Proses debugging adalah mencari satu persatu
baris perbaris kode yang mana yang membuat output yang dihasilkan tidak sesuai.
Runtime error adalah kesalahan program yang terjadi saat program sudah berjalan dimana
jika lingkungan pemrograman mendeteksi operasi yang tidak mungkin dapat ditangani.
Contoh nyata dari error runtime ini adalah misalnya saat kita menjalankan aplikasi berbasis
java yang membutuhkan koneksi internet, tiba-tiba internet mati dan menyebabkan aplikasi
tadi berhenti/terminate secara mendadak. Error runtime disebabkan oleh exception. Exception
adalah objek yang mewakili error atau kondisi yang mencegah eksekusi dari proses yang
tidak berjalan normal.
Ada banyak sekali objek atau tipe exception, misalnya: input mismatch exception, aritmethic
exception, null pointer exception, index of out bound exception, illegal argument exception,
dll. Berikut adalah contoh kode yang berpotensi menghasilkan input mismatch exception:
import java.util.Scanner;
public class TestException
{
public static void main(String[] args)
{
// Buat objek Scanner
Scanner input = new Scanner(System.in);
// Kabari user untuk memasukkan angka sisi persegi
119
System.out.print("Masukkan sisi persegi: ");
double sisi = input.nextDouble();
System.out.print("Sisi: "+sisi);
}
}
Perhatikan bahwa output dari program itu adalah “Masukkan sisi persegi: ”. Jika user
memberikan inputan berupa string misalnya “as”. Maka akan muncul error exception
Exception in thread "main" java.util.InputMismatchException“. Kita sebagai programmer
terkadang tidak memerhatikan user dalam hal inputan sederhana ini. Tetapi hal ini bisa saja
terjadi. Maka dari itu perlu penanganan exception.
10.2 Mekanisme Try-Catch
Menangani exception pada dasarnya merupakan cara untuk mencegah terjadinya runtime
errors. Terdapat mekanisme untuk menangani exception yaitu dengan Try-Catch. Try-Catch
memiliki dua blok yaitu blok kode untuk try dan blok kode untuk catch. Pada blok Try
programmer akan mencoba menuliskan kode yang mungkin dapat menyebabkan exception.
Ketika terjadi exception saat aplikasi berjalan (runtime) blok Catch akan menangkap pesan
error exception yang terjadi dan akan mengeksekusi yang ditulis oleh programmer pada blok
itu . Misalnya ketika user memberikan inputan string padahal semestinya user
memberikan input integer. Program tidak akan langsung terminate (berhenti) tetapi akan
memunculkan pesan kesalahan input. Pesan kesalahan itu berasal dari blok catch.Kode
10.1 merupakan contoh implementasi dari permisalan sebelumnya.
Kode 10.1 AngkaError.java
1
2
3
4
5
6
7
8
9
import java.util.Scanner;
public class AngkaError
{
public static void main(String[] args)
{
// Buat objek Scanner
System.out.print("Masukkan sembarang angka: ");
Scanner input = new Scanner(System.in);
int angka;
120
10
11
12
13
14
15
16
17
18
19
20
try{
angka = input.nextInt();
System.out.print("Angka yang dimasukkan: "+angka);
}
catch(Exception e)
{
System.out.print("Inputan salah!");
}
}
}
Output:
Masukkan sembarang angka: 12
Angka yang dimasukkan: 12
Suatu program yang dapat mendeteksi error dapat dibuat dari instance dari tipe exception
yang sesuai dan lemparkan (throw it). Sebagai contoh, terdapat program meneruskan nilai
dari suatu method dan argument harus berupa argument non-negative, tetapi malah argument
negative. Program dapat dibuat dari instance IllegalArgumentException dan kemudian di
throw seperti berikut:
IllegalArgumentException ex = new IllegalArgumentException(“Argumen
salah!”);
Throw ex;
atau
throw new IllegalArgumentException(“Argumen salah!”);
Block catch dapat lebih dari satu dan terdapat tambahan blok untuk finally. Jika ingin
beberapa kode dieksekusi terlepas dari apakah exception itu terjadi atau tertangkap kita
dapat menggunakan finally. Finally juga dapat digunakan tanpa catch. Dari Kode 10.1 kita
dapat menambahkan finnaly setelah block catch.
121
finally
{
System.out.print("Terima kasih.");
}
10.3 Pemrograman Generik
Secara sederhana, pemrograman generik dalam hal ini Generic Type/ Tipe Generik
merupakan class atau interface generik yang memperbolehkan semua jenis tipe data sebagai
suatu parameter. Sebelumnya sudah di implementasi pada ArrayList dan Vector dengan
simbol “<....>”. Berikut adalah contoh sederhana dari perbandian class biasa dengan class
generik:
Tabel 10.1 Perbandingan class biasa dengan generik
Biasa Generik
public class Box {
private int object;
public void set(int object) {
this.object = object;
}
public int get() {
return object;
}
}
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
Pada versi non-generic clas Box jika seandainya instance dari Box adalah Kotak dan
Kotak.set(“50”), maka akan menghasilkan error. Error disebabkan hanya boleh diset oleh
nilai integer saja. Pada versi generic dapat di set oleh berbagai tipe data, baik primitive
maupun tipe data bentukan, dan bahkan array/list. Format class generic:
class name<T1, T2, ..., Tn> { /* ... */ }
Untuk instance dari class box versi generik, berikut caranya:
Box<Integer> integerBox = new Box<Integer>();
Meskipun tipe data atau objek yang digenerik-kan dapat diberi nama dengan bebas, beberapa
programmer memberikan standar sebagai berikut:
E - Elemen (sering digunakan di Java Collections Framework)
K - Kunci
122
N – Angka (number)
T - Tipe
V – Nilai (value)
S,U,V, dll
Timbul pertanyaan, dalam satu class terkadang programmer menginginkan tidak hanya satu
variabel atau properti yang akan di-generik-kan. Kode 10.2 memberikan contoh satu class
memiliki dua tipe generik.
Kode 10.2 OrderedPair.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class OrderedPair<K, V> {
private K key;
private String value;
public OrderedPair(K key, V value) {
this.key = key;
this.value = (String)value;
}
public K getKey() {
return key;
}
public String getValue()
{
if(this.key == "aaa")
return this.value;
else
return "salah";
}
public static void main(String[] args)
{
OrderedPair<String, String> p2 = new OrderedPair<String,
String>("aaa", "2");
System.out.println(p2.getValue());
123
24
25
}
}
Output:
2
Contoh lain dari generik tidak hanya pada class tetapi juga dapat diterapkan pada method
secara langsung. Berikut adalah contoh method generic untuk menampilkan elemen array:
public static < E > void printArray( E[] inputArray ) {
// Display array elements
for(E element : inputArray) {
System.out.printf(element+” ”);
}
System.out.println();
}
10.4 Design Pattern
Design pattern merupakan istilah untuk merepresentasikan paktik penggunaan terbaik yang
digunakan oleh programmer/pengembang software yang berpengalaman dalam pemrograman
berorientasi objek. Menyediakan solusi untuk perproblem an umum dari
programmer/pengembang software selama mengembangkan software. Solusi ini diperoleh
dari trial & error yang dilakukan oleh programmer/pengembang perangkat lunak yang
berpengalaman.
10.5 Singleton Pattern
Merupakan Design Pattern paling sederhana yang memungkinkan untuk dapat diprogram
dengan Java. Pola ini melibatkan satu Class tunggal yang bertanggung jawab untuk membuat
sebuah objek tunggal yang akan tercipta. Class ini menyediakan cara untuk mengakses
objeknya yang secara langsung dapat diakses tanpa harus melakukan instance objek dari
Class. Class diagram untuk class singleton ini seperti pada Gambar 10.1.
124
Gambar 10.1 Class Diagram Singleton
Kode 10.3 merupakan contoh implementasi singleton patten untuk class SingleObject.
Kode 10.3 SingleObject.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SingleObject {
//buat static instance objek ini
private static SingleObject instance = new SingleObject();
//buat konstruktor secara private sehingga
//tidak akan bisa di instance dengan cara biasa
private SingleObject(){}
//dapatkan instance
public static SingleObject getInstance(){
return instance;
}
//tampilkan pesan
public void showMessage(){
125
17
18
19
20
21
22
23
24
System.out.println("Hello World!");
}
public static void main(String[] args) {
SingleObject object = SingleObject.getInstance();
object.showMessage();
}
}
Pada main method tidak ada keyword untuk melakukan instance atau “new”. Objek langsung
dibuat dan langsung dapat digunakan ketika memanggil method getInstance(). Dua baris
kode didalam main dapat digantikan dengan kode dibawah ini:
SingleObject.getInstance().showMessage();
Eksekusi dari kode itu akan menghasilkan output yang sama dengan dua baris kode
sebelumnya.
10.6 Model-View-Controller Pattern
Model-View-Controller atau MVC adalah sebuah metode untuk membuat sebuah aplikasi
dengan memisahkan data (Model) dari tampilan (View) dan cara bagaimana memprosesnya
(Controller). Dalam implementasinya kebanyakan framework dalam aplikasi website adalah
berbasis arsitektur MVC. MVC memisahkan pengembangan aplikasi berdasarkan komponen
utama yang membangun sebuah aplikasi seperti manipulasi data, antarmuka pengguna, dan
bagian yang menjadi kontrol dalam sebuah aplikasi.
126
Gambar 10.2 Model View Controller (MVC)
Pola MVC memiliki layer yang disebut dengan Model yang merepresentasikan data yang
digunakan oleh aplikasi sebagaimana proses bisnis yang diasosiasikan terhadapnya. Dengan
memilahnya sebagai bagian terpisah, seperti penampungan data, persistence, serta proses
manipulasi, terpisah dari bagian lain aplikasi. Terdapat beberapa kelebihan dalam pendekatan
ini. Pertama, membuat detail dari data dan operasinya dapat ditempatkan pada area yang
ditentukan (Model) dibanding tersebar dalam keseluruhan lingkup aplikasi. Hal ini
memberikan keuntungan dalam proses pemeliharaan aplikasi. Kedua, dengan pemisahan total
antara data dengan implementasi interface, komponen model dapat digunakan kembali oleh
aplikasi lain yang memiliki kegunaan yang hampir sama.
Layer view mengandung keseluruhan detail dari implementasi user interface. Disini,
komponen grafis menyediakan representasi proses internal aplikasi dan menuntun alur
interaksi user terhadap aplikasi. Tidak ada layer lain yang berinteraksi dengan pengguna,
hanya View. Penggunaan layer View memiliki beberapa kelebihan: memudahkan
pengabungan divisi desain dalam development team. Divisi desain dapat berkonsentrasi pada
style, look and feel, dan sebagainya, dalam aplikasi tanpa harus memperhatikan lebih pada
detail yang lain. Dengan memiliki layer View yang terpisah memungkinkan ketersediaan
multiple interface dalam aplikasi. Jika inti dari aplikasi terletak pada bagian lain (dalam
127
Model), multiple interfaces dapat dibuat (Swing, Web, Console), secara keseluruhan
memiliki tampilan yang berbeda namun mengeksekusi komponen Model sesuai
fungsionalitas yang diharapkan.
Terakhir, arsitektur MVC memiliki layer Controller. Layer ini menyediakan detail alur
program dan transisi layer, dan juga bertanggungjawab akan penampungan events yang
dibuat oleh user dari View dan melakukan update terhadap komponen Model menggunakan
data yang dimasukkan oleh user. Kelebihan dalam penggunaan layer Controller secara
terpisah adalah dengan menggunakan komponen terpisah untuk menampung detail dari
transisi layer, komponen view dapat didesain tanpa harus memperhatikan bagian lain secara
berlebih. Hal ini memudahkan team pengembang multiple interface bekerja secara terpisah
dari yang lain secara simultan. Interaksi antar komponen View terabstraksi dalam Controller.
Data Access Object (DAO) merupakan sebuah object yang menyediakan sebuah abstract
interface terhadap beberapa database atau mekanisme persistence, menyediakan beberapa
operasi tertentu tanpa mengekspos detail database. Penerapan konsep ini sering disebut
dengan separation of concern dimana setiap kode dipisahkan berdasarkan fungsinya sehingga
kode diatasnya hanya perlu mengetahui secara abstrak cara mengakses data tanpa perlu
mengetahui bagai