METODE
Putra Pandu Adikara
Indriati
Sutrisno
Fakultas Ilmu Komputer
Universitas Brawijaya
1
Learning Outcomes
2
Outline Materi
• Pemrograman Modular
• Metode
• Metode Rekursi
• Iterasi vs Rekursi
• Static vs Non Static
3
Pemrograman Modular
• Program dibagi-bagi menjadi sekumpulan modul
program, sehingga dapat diperoleh beberapa
keuntungan berikut:
• Rancangan sebuah program besar dapat dibagi menjadi
modul-modul yang lebih kecil.
• Dapat dikerjakan oleh lebih dari satu orang dengan koordinasi
yang relatif mudah.
• Mencari kesalahan relatif lebih mudah karena alur proses
dapat terlihat lebih jelas, dan kesalahan dapat dilokalisir dalam
satu modul.
• Modifikasi dapat dilakukan, tanpa menggangu program secara
keseluruhan
• Reusable
• Mempermudah dokumentasi
4
Modularitas di Java
5
Modularitas
di Pemrograman Terstruktur
• Pemrograman terstruktur merupakan
pemrograman berbasis proses, yang memisahkan
antara data dan fungsi/prosedur.
• Modularitas pemrograman terstruktur berarti
menyusun sebuah program terdiri dari satu atau
lebih (sejumlah) subprogram yang dapat berupa
fungsi/prosedur (metode).
• fungsi/prosedur (metode) dapat memuat sejumlah
konstanta, variabel atau instruksi.
6
Pemrograman
Terstruktur Modular
• Pemrograman terstruktur modular tersusun dari
sebuah program utama disertasi sejumlah
subprogram
Program Utama
SubProgram SubProgram
7
Pemrograman Modular
8
Sekilas Tentang Metode
• Sejak menulis program Java pertama, sudah pasti
menggunakan metode, yaitu metode main().
• Metode lain yang sering digunakan ketika pertaman menulis
program Java adalah: print().
9
Sekilas Tentang Metode
10
Metode dan
Penyembunyian Informasi
• Salah satu keuntungan yang paling penting dari penggunaan
metode adalah bahwa pengguna metode tidak perlu
memikirkan/memperhatikan operasi di dalam metode yang
bisa jadi sangat kompleks.
• Ketika menjadi sebagai pengguna metode, yang lebih
penting diketahui adalah untuk apa metode tersebut
dibandingkan dengan memahami tentang cara kerjanya
(instruksi-instruksi di dalamnya).
• Rincian instruksi yang terdapat di dalam metode diperlukan
hanya untuk programmer yang mengimplementasikan
metode tersebut.
11
Metode dan
Penyembunyian Informasi
• Programmer sebagai pengguna metode biasanya
tidak perlu harus memahami proses kerja yang
terdapat di dalam metode tersebut.
• Gagasan bahwa pemanggil metode harus terisolasi
dari rincian operasi metode merupakan prinsip dari
penyembunyikan informasi (information hiding),
yang merupakan salah satu pilar dari rekayasa
perangkat lunak.
12
Metode
Sebagai Alat Bagi Programmer
• Terutama ketika pertama kali belajar pemrograman, perlu
diingat bahwa metode tidak sama dengan program aplikasi,
meskipun keduanya menyediakan layanan yang
menyembunyikan kompleksitas perhitungan yang termuat di
dalamnya.
• Perbedaan utama adalah bahwa program aplikasi
menyediakan layanan kepada pengguna program, yang
biasanya bukan programmer melainkan seseorang yang
menggunakan program aplikasi.
• Sebaliknya, metode menyediakan layanan untuk
programmer, yang biasanya pembuat/pengembang
beberapa jenis program aplikasi.
13
Metode
Sebagai Alat Bagi Programmer
• Pemahaman tentang perbedaan konsep antara metode dan
program aplikasi ini sangat penting.
• Ketika mencoba memahami bagaimana konsep dari
program aplikasi input dan output berbeda dengan konsep
dari argumen dan hasil pengembalian nilai.
• Metode seperti nextInt() dan println() digunakan untuk
berkomunikasi dengan pengguna program dan tidak
memainkan peran dalam mengkomunikasikan informasi dari
satu bagian program dengan bagian program lainnya.
14
Pemanggilan Metode
• Dalam sintaksis, pemanggilan metode di pemrograman Java
merupakan bagian dari ekspresi.
• Metode yang mempunyai pengembalian nilai dapat
digunakan sebagai operand dalam ekspresi, layaknya
variabel atau konstanta.
• Kelas Math dalam paket java.lang mendefinisikan
beberapa metode yang berguna dalam membuat ekspresi
matematika.
• Misalnya, untuk menghitung jarak dari sebuah titik (x,y) ke
titik 0 (titik 0,0) dapat dilakukan dengan menggunakan
rumusan sbb.:
15
Pemanggilan Metode
• Misalnya, untuk menghitung jarak dari sebuah titik (x,y)
ke titik 0 (titik 0,0) dapat dilakukan dengan
menggunakan rumusan sbb.:
x2+y2
• Penulisan kode program dapat menerapkan fungsi akar
kuadrat dengan memanggil metode sqrt() di kelas
Math sbb. :
double jarak = Math.sqrt(x*x + y*y);
• Catatan:
penulisan nama kelas diikuti nama metode perlu dilakukan
untuk metode static (seperti Math.sqrt()).
16
Pemanggilan Metode
17
Deklarasi Metode
• Sintaksis penulisan deklarasi metode adalah sbb.:
lingkup tipe namaMetode(daftar-argumen) {
pernyataan-pernyataan (bodi metode)
}
• lingkup menunjukkan siapa yang berhak memiliki akses ke
metode,
• tipe menunjukkan jenis nilai yang dikirimkan kembali oleh
metode,
• namaMetode adalah nama/identifier dari metode,
• daftar-argumen adalah daftar deklarasi untuk variabel
digunakan untuk menyimpan nilai pesan/informasi dari
setiap argumen.
18
Deklarasi Metode
• Nilai dari lingkup dapat berupa: public, private,
protected atau kosong (default).
• private berarti bahwa metode ini hanya dapat diakses
(dipanggil) dari dalam kelasnya sendiri.
• public berarti kelas lain juga dapat mengakses metode
tersebut.
• protected berarti selain kelasnya sendiri, juga dapat
diakses oleh kelas lain dalam satu paket (direktori).
• kosong (default) sama dengan default package (bisa diakses
di paket yang sama).
19
Deklarasi Metode
20
Pengembalian Nilai Dari Metode
21
Pengembalian Nilai Dari Metode
22
Pernyataan IF Dalam Metode
• Dalam sebuah metode dapat memuat berbagai
pernyataan, termasuk pernyataan if.
• Perhatikan pada contoh deklarasi metode berikut:
public int maksimum(int x, int y) {
if (x>y) return x ;
else return y;
}
23
Metode Faktorial
24
Metode Non Numerik
• Metode di Java dapat mengirim kembali nilai data ke
pemanggilnya dari tipe data apa saja termasuk kelas. Metode
berikut, misalnya, mengembalikan nilai data bertipe String berupa
nama hari dalam seminggu, yaitu angka antara 0 (Minggu) hingga
6 (Sabtu):
private String namaHari(int hari) {
switch (hari) {
case 0: return "Minggu";
case 1: return "Senin";
case 2: return "Selasa";
case 3: return "Rabu";
case 4: return "Kamis";
case 5: return "Jumat";
case 6: return "Sabtu";
default: return "Nilai Salah";
}
} 25
Metode Predikat
• Metode yang mengembalikan nilai boolean memainkan
peran penting dalam pemrograman dan biasa disebut
metode predikat.
• Sebagai contoh, metode berikut ini mengembalikan
nilai true jika argumen pertama habis dibagi oleh
argumen kedua, dan false jika tidak:
private boolean habisDibagi(int x, int y) {
return x % y == 0;
}
• Setelah metode predikat didefinisikan, metode tersebut
dapat digunakan layaknya nilai Boolean lainnya.
• Misalnya, akan digunakan untuk mencetak bilangan bulat
antara 1 dan 100 yang habis dibagi 7 sebagai berikut:
26
Metode Predikat
27
Metode Predikat
• Contoh metode predikat kelipatanDua() yang memiliki
argumen integer n dan mengembalikan nilai true jika n
merupakan nilai kelipatan dua, dan false jika tidak.
• Nilai kelipatan 2 adalah 1, 2, 4, 8, 16, 32, dan seterusnya,
sedangkan bilangan kurang dari atau sama dengan nol
bukan merupakan nilai kelipatan dua.
private boolean kelipatanDua(int n) {
if (n <= 0) return false;
while(n>1){
if (n % 2 == 1) return false;
n /= 2;
}
return true;
}
28
Mekanisme Proses Pemanggilan
Metode
Ketika sebuah metode dipanggil, terjadi mekanisme berikut:
1. Java mengevaluasi ekspresi argumen dalam konteks
pemanggilan metode.
2. Java menyalin setiap nilai argumen ke variabel parameter
yang sesuai, yang dialokasikan di lokasi memori baru yang
disebut stack frame. Pengalokasian memori ini mengikuti
urutan argumen: argumen pertama disalin ke variabel
parameter pertama, dst.
3. Java kemudian mengeksekusi pernyataan-pernyataan
dalam tubuh metode, menggunakan stack frame baru
untuk alokasi setiap variabel lokal.
29
Mekanisme Proses Pemanggilan
Metode
4. Ketika Java menemukan pernyataan return, akan
menghitung nilai return dan mengganti nilai di tempat
pemanggil dengan nilai return tsb.
5. Java kemudian membebaskan memori frame stack yang
dipakai untuk pemanggilan metode dan proses kembali ke
pemanggilnya untuk melanjutkan proses yang telah
ditinggalkan selama mengeksekusi metode yang
dipanggil.
30
Fungsi Kombinasi
1. Sebuah fungsi kombinasi C (n, k) dipergunakan untuk
menghitung berapa kemungkinan yang dapat terjadi
dalam memilih sejumlah k elemen dari satu set yang
terdiri atas n objek.
2. Anggaplah, kita memiliki lima kelereng berwarna: biru,
kuning, hijau, merah dan putih.
3. Berapa kemungkinan dapat terjadi seandainya diambil 2
kelereng dari 5 kelereng di atas.
4. Bisa saja didapat kelereng warna: biru+kuning, biru+hijau,
biru+merah, biru+putih, kuning+hijau, kuning+merah,
kuning+putih, hijau+merah, hijau+putih dan merah+putih.
Dimana jumlah kemungkinannya adalah 10.
31
Fungsi Kombinasi
• Untungnya, matematika menyediakan cara yang lebih
mudah untuk menghitung fungsi kombinasi dibandingkan
dengan cara menghitung semua kemungkianan di atas. Nilai
fungsi kombinasi dapat dihitung menggunakan rumus sbb.:
n!
C(n, k) =
k ! x (n – k) !
SubProgram-2a SubProgram-2b
34
Metode Algoritmik
1. Metode merupakan hal penting dalam pemrograman, karena metode
menyediakan struktur yang dapat mengekspresikan algoritma.
Algoritma adalah ekspresi abstrak dari strategi solusi.
2. Penerapan algoritma sebagai metode dapat membuat strategi abstrak
yang lebih konkret.
3. Algoritma untuk memecahkan suatu masalah tertentu dapat
bervariasi agar lebih efisien. Perlu berpikir hati-hati ketika memilih
algoritma, karena membuat pilihan yang buruk dapat berisiko besar.
4. Berikut algoritma untuk menghitung pembagi bersama terbesar dari
bilangan bulat x dan y, yang didefinisikan sebagai bilangan bulat
terbesar yang membagi secara merata ke kedua.
35
Pendekatan Brute-force
• Salah satu strategi untuk mendapatkan pembagi terbesar adalah dengan
menghitung mundur dari nilai yang lebih kecil sampai ditemukan satu
pembagi secara merata dari kedua nilai. Kode program dapat terlihat sbb.:
public int pembagiTerbesar(int x, int y) {
int duga = Math.min(x, y);
while (x % duga!= 0 || y % duga != 0) duga--;
return duga;
}
• Algoritma ini harus berhenti untuk nilai-nilai positif x dan y karena nilai
dugaan akhirnya akan mencapai 1. Di saat itu, nilai dugaan merupakan nilai
pembagi terbesar karena pengulangan while telah menguji semua nilai yang
lebih besar.
• Mencoba setiap kemungkinan di atas disebut sebagai strategi Brute-Force.
36
Algorithma Euclid
• Jika menggunakan pendekatan Brute-Force untuk menghitung
pembagi terbesar dari 1000005 dan 1000000, program akan
mengambil hampir satu juta langkah untuk bisa mendapatkan
jawabannya adalah 5.
• Untuk mendapatkan jawaban yang jauh lebih cepat, bila dapat dipilih
algoritma yang lebih baik. Matematikawan Euclid dari Alexandria
menemukan algoritma yang lebih efisien pada 23 abad yang lalu,
sbb.:
public int pembagiTerbesar(int x, int y) {
int r = x % y;
while (r != 0) {
x = y; y = r;
r = x % y;
}
return y;
}
37
Metode Algorithmik
1. Jika menggunakan algoritma Euclid untuk nilai 1000005
dan 1000000, jawaban yang benar akan diperoleh hanya
dalam dua langkah, yang jauh lebih baik daripada sejuta
langkah yang diperlukan bila menggunakan Brute-Force.
2. Gagasan besar Euclid adalah bahwa pembagi terbesar dari
x dan y juga harus menjadi pembagi terbesar dari y dan
sisa x dibagi dengan y.
3. Sangat mudah untuk melihat bagaimana algoritma Euclid
bekerja, jika kita berpikir tentang masalah geometris,
sebagaimana yang dilakukan Euclid.
Contoh berikut memuat langkah-langkah perhitungan
menggunakan algoritma Euclid untuk x=78 dan y=33.
38
Ilustrasi Algoritma Euclid
Step 1: Hitung sisa pembagian 78 dengan 33:
x 78
y 33 33 12
40
Lingkup Identifier
41
Metode Rekursif
(Recursive)
42
Metode Rekursi (Recursion)
• Metode rekursi adalah metode yang di dalamnya terdapat
pernyataan yang memanggil dirinya sendiri.
• Metode rekursif sangat berguna dalam pemecahan masalah jika
masalah tersebut dapat didefinisikan secara rekursif pula.
• Contoh: Faktorial(n) atau n! didefinisikan sebagai berikut:
n! = 1, untuk n = 0;
n! = n * (n-1)!, untuk n > 0
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1* 0!
0! = 1
Bila ditelusur mundur: 4! = 1*2*3*4 = 24
43
Metode Rekursi (Recursion)
Hal yang perlu diperhatikan dalam penggunaan metode rekursi:
• Memerlukan memori lebih banyak, karena memerlukan tambahan
memori untuk ‘Activation Record Stack’.
• Memerlukan waktu eksekusi lebih lama, karena perlu menjejaki
setiap pemanggilan metode secara rekursif melalui ‘Activation
Record’.
• Secara umum, gunakan penyelesaian secara rekursif, jika:
• Penyelesaian sulit dilaksanakan secara iteratif
• Efisiensi dengan cara rekursif sudah memadai
• Efisiensi bukan masalah dibandingkan dengan kejelasan logika
program
• Pemborosan (redundancy) dapat terjadi dalam penyelesaian
permasalahan menggunakan rekursif
44
Contoh Metode Rekursi
Deklarasi metode:
int faktorial(int n) {
if(n>0) return n*faktorial(n-1);
else return 1;
}
45
Contoh Metode Rekursi
• Bilangan Fibonacci:
fib(n) = n, untuk n = 0 atau n = 1
fib(n) = fib(n-2) + fib(n-1), untuk n>=2
Deklarasi metode:
int fibonacci(int n) {
if (n==0 || n==1) return n;
else return fibonacci (n-2)+fibonacci(n-1);
}
46
Bilangan Fibonacci
FIB (4)
47
Fungsi Rekursif vs Iterasi
• Contoh
48
Static vs Non Static
49
Variabel & Metode Dinamis
• Semua instansiasi variabel dan metode yang telah kita buat
selama ini merupakan variabel dan metode dinamis.
• Deklarasi variabel dan metode secara default bersifat
dinamis, tidak ada keyword dynamic di Java.
• Secara umum, dinamis mengacu pada hal-hal yang
instansiasi (pengalokasian memori) di saat “run time" (saat
dijalankan).
• Setiap objek memiliki instansiasi sendiri dari setiap variabel
dinamisnya.
• Setiap objek secara efektif memiliki salinan sendiri
dari setiap metode dinamis.
• Tidak dituliskannya kata kunci static sebelum variabel
non-lokal dan metode berarti bersifat dinamis (satu setiap
instansiasi objek )
50
Variabel Static
• Static dalam arti “secara umum berkaitan dengan kelas",
tidak “berkaitan dengan obyek secara individual”.
• Sebuah variabel dapat dideklarasikan (di luar metode)
dengan kata kunci static:
• Misalnya: static int n;
• Hanya ada satu variabel n untuk semua objeknya.
• Sebuah variabel static digunakan bersama oleh semua
instansiasinya (objeknya), dalam arti semua instansiasi dari
kelas yang memiliki variabel static mengakses pada sebuah
variabel.
• Sebuah variabel static dengan lingkup public dapat
diakses dengan cara:
• namaKelas.namaVariabel
• Misalnya Math.PI
51
Metode Static
• Sebuah metode dapat dideklarasikan dengan menggunakan
kata kunci static.
• Metode static berada di tingkat kelas, bukan pada tingkat
objek.
• Metode static hanya dapat mengakses variabel static
dan metode static.
• Contoh:
52
Metode Static
53
Konteks static
54
Contoh
public class Tambah {
int x;
int y;
int z;
55
Solusi
void penambahan() {
x = 5;
y = 10;
z = x + y;
}
}
56
Kapan Menggunakan static
57
Aturan Static
59
Contoh Jumlah Argumen Tak-tentu
60
61
Parameter Array
62
Parameter Referensi
63
Parameter Array
64
Contoh Referensi Array
65
Contoh Referensi Array
66
Contoh Referensi Array-2
67
Contoh Referensi Array-2
68
69
Pengurutan Data (Sorting)
• Bubble Sort
• Banyak macam algoritma untuk mengurutkan data, salah satu
algoritma pengurutan data yang paling sederhana adalah
Bubble Sort.
• Algoritma Bubble Sort:
• Nilai lebih kecil diarahkan ke indeks array semakin kecil
• Nilai lebih besar diarahkan ke indeks array semakin besar
• Gunakan loop bersarang untuk membuat beberapa langkah
mempertukarkan urutan nilai data pada elemen array
• Setiap langkah membandingkan pasangan berurutan dari elemen array
• Pasangan yang urutan nilai datanya semakin besar atau sama tidak
dipertukarkan
• Pasangan yang urutan nilai datanya semakin kecil dipertukarkan nilai
datanya
70
Contoh Program Bubble Sort
71
Contoh Program Bubble Sort
72
73
Searching
74
Contoh Program Pencarian Linier
75
Contoh Program Pencarian Linier
76
77