Bab 5, Method
Ringkasan
Pada dasarnya, penulisan kode program yang baik adalah tidak menulis kode yang serupa berulang kali, yang akan menimbulkan pemborosan biaya penulisan kode xD
. Maka dari itu, dalam Java (atau di programming language lain) mendukung penulisan method.
Dalam dunia Pascal, kita pasti mengenal yang nama procedure
dan function
. Hayo, siapa yang bisa menyebutkan perbedaannya? Oke, kalau tidak ada ya sudah. Lupakan :p
.
Java hanya mengenal satu istilah, yaitu method yang akan kita pelajari saat ini. Method dibagi menjadi 2 jenis, void
dan non-void
. Berikut penjelasan singkatnya
void
method tidak mengembalikan nilai (tidak punya return value), sedangkan;non-void
method memiliki return value.
Nanti akan dijelaskan secara detail terkait return value.
Sintaksis
Penulisan method dalam Java kira-kira seperti ini
<modifier> <return-type> <method-name> (<parameters>) {
// statement block
}
Kita akan urai satu per satu.
<modifier>
menandakan access modifier dari suatu method.- Dalam materi Progdas, modifier yang lazim dipakai yaitu
public static
. Sebenarnya ada banyak modifier yang lain, silakan cek disini dan untuk penjelasan static modifier silakan cek disini - Pembahasan yang mendalam terkait access modifier akan didapatkan di mata kuliah Pemrograman Lanjut di semester 2.
- Dalam materi Progdas, modifier yang lazim dipakai yaitu
<return-type>
menandakan tipe data return value dari method. Bisavoid
maupunnon-void
.<method-name>
menandakan nama method.<parameters>
menandakan parameter yang bisa di lewatkan ke dalam method untuk diproses. Parameter disini bersifat optional, bisa ada bisa tidak.
Void method
void
method adalah method yang tidak dapat mengembalikan nilai. Di dunia Pascal, method yang memiliki karakteristik seperti ini dinamakan procedure
.
public static void greetSomeone(String name) {
System.out.println("Hello "+name+", good day");
}
Jika potongan kode diatas dipanggil dengan greetSomeone("Fulan")
, maka akan mencetak output
Hello Fulan, good day
Jika method void memiliki perintah return
yang akan mengembalikan nilai dengan tipe tertentu, misalkan
public static void cariPangkat(int x) {
return x*x;
}
Potongan kode diatas adalah ilegal. Karena void
method tidak akan bisa mengembalikan nilai dengan tipe data tertentu, dalam kasus ini mengembalikan nilai bertipe int
.
Non-void method
Berbeda dengan method void
, method ini bisa mengembalikan nilai. Kalian tentunya pernah melihat fungsi yang memiliki bentuk sebagai berikut : f(x) = 3x
kan? x
yang didalam f(x)
itu menandakan parameter, 3x
menandakan return value dari fungsi.
Jika fungsi diatas dituliskan dalam bentuk method akan seperti ini
public static int f(int x) {
return 3 * x;
}
Tipe data kembalian yang dideklarasikan harus sesuai dengan tipe nilai yang akan dikembalikan. Contoh :
public static int faktorial(int x) {
int hasil = 1;
for (int i = x ; i >= 1 ; i--) {
hasil *= i;
}
return hasil; // nilai yang dikembalikan
}
public static double faktorial1(int x) {
int hasil = 1;
for (int i = x ; i >= 1 ; i--) {
hasil *= i;
}
return hasil; // nilai yang dikembalikan
}
Method faktorial1(int x)
adalah ilegal, karena nilai yang dikembalikan ternyata bertipe int
. Sedangkan return type methodnya minta double
.
Rekursif
Rekursif? Apa itu?
Method dikatakan rekursif jika didalam blok statemen method tersebut ada instruksi yang memanggil dirinya sendiri berdasarkan kondisi-kondisi tertentu. Bingung untuk dibayangkan? Ya sudah, berikut ini contoh dari potongan kode yang menerapkan rekursif.
// method ini akan mengembalikan nilai dari N faktorial
public static int faktorial(int N) {
// basis
if (N <= 1) return 1;
// rekuren
else return N * faktorial(N-1);
}
Jadi didalam method rekursif ada 2 bagian, yaitu basis dan rekuren. Bagian basis adalah bagian yang membatasi agar rekursif tidak berjalan terus menerus, dan bagian rekuren adalah bagian yang memanggil dirinya sendiri N * faktorial(N-1)
.
Jika dipanggil dengan faktorial(5)
, method tersebut akan mengembalikan nilai 120. Kok bisa? Mari dibongkar.
faktorial(5)
= 5 * faktorial(4)
= 4 * faktorial(3)
= 3 * faktorial(2)
= 2 * faktorial(1)
= 1
faktorial(5) = 5 * 4 * 3 * 2 * 1 = 120
Bingung? Begini, ketika nilai N
yang dilewatkan ke parameter method ternyata lebih dari 1, maka program akan mengembalikan nilai N * faktorial(N-1)
, nah pada pemanggilan inilah yang menyebabkan rekursif sehingga nilai N
sama dengan 1. Ketika sama dengan 1, maka method akan mengembalikan nilai 1 sehingga method tidak melakukan pemanggilan rekursif lagi. Eksekusi selesai.
Kalau tidak ada basis rekursif nya? Seperti ini
public static int testingRekursif(int x) {
return testingRekursif(x+3);
}
Maka yang akan terjadi akan menimbulkan Stack Overflow Exception. Kok disebut stack overflow? Pembahasannya silakan cari sendiri terkait perbedaan stack memory dan heap memory. Kelak akan menemukan jawabannya :)
.
Array sebagai parameter method
Beberapa contoh diatas hanya menggunakan parameter non array. Bagaimana kalau menggunakan array sebagai parameternya? Sangat bisa.
// method yang akan menukar nilai dari array
public static void tukar(int arr[], int idx1, int idx2) {
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
tukar(arr, 0, 3); // pemanggilan method tukar
}
Potongan kode diatas akan menukar elemen array indeks ke 0 dan indeks ke 3, jadi, ketika method tukar
selesai dijalankan, maka elemen array akan berubah menjadi {4,2,3,1,5}
. Kok bisa? Begini, temp
akan diinisialisasi dengan arr[idx1]
, sehingga temp = arr[0] = 1
. Nilai dari arr[0]
akan diisi dengan nilai dari arr[3]
, sehingga arr[0] = 4
. Nah arr[3]
diisi nilai dari variabel temp
(variabel pembantu) sehingga arr[3] = 1
.
Mungkinkah kita bisa melewatkan parameter dengan tidak terbatas?
Bisa sekali, dengan syarat, tipe datanya sama.
public static int testUnlimited(int... params) {
return params.length; // mengembalikan panjang array dari params
}
public static void main(String[] args) {
System.out.println(testUnlimited(1,2,3,1,1));
System.out.println(testUnlimited(1));
}
Akan mencetak output
5
1
int... params
oleh Java akan dianggap sebagai array integer.
Bagaimana jika diganti?
public static int testUnlimited(int[] params) {
return params.length; // mengembalikan panjang array dari params
}
public static void main(String[] args) {
System.out.println(testUnlimited(1,2,3,1,1));
System.out.println(testUnlimited(1));
}
Kode diatas ilegal. Ia akan meminta parameter sebagai array, dengan jumlah parameter 1, namun dilewatkan dengan non array berjumlah 5 dan 1. Jadi dianggap error oleh Java.