Program yang seluruh logikanya ditumpuk di dalam main akan memanjang dengan cepat: blok kode yang sama disalin-tempel di beberapa tempat, satu perbaikan harus dilakukan berulang kali, dan membaca alur program menjadi pekerjaan yang melelahkan. Java menyediakan method sebagai unit kerja kecil yang bernama — sekali didefinisikan, method dapat dipanggil dari mana pun sebanyak apa pun. Pada Chapter ini kita bedah anatomi deklarasi method, menulis method pertama, lalu mengamati bagaimana JVM mengatur pemanggilan method melalui call stack dan stack frame.
Anatomi Deklarasi Method #
Setiap method di Java hidup di dalam sebuah class — tidak ada method yang berdiri sendiri di luar class. Bentuk umum deklarasinya seperti berikut:
modifier returnType namaMethod(daftarParameter) {
// badan method: pernyataan yang dijalankan saat method dipanggil
}Empat bagian penyusunnya perlu kita kenali satu per satu:
| Bagian | Peran | Contoh |
|---|---|---|
modifier | Mengatur akses dan kepemilikan method | public, private, static |
returnType | Tipe nilai yang dikembalikan, atau void jika tidak ada | void, int, String |
namaMethod | Identifier pemanggilan | hitungTotal, tampilkanJudul |
daftarParameter | Masukan bertipe yang diterima method | String nama, () kosong |
Modifier bersifat opsional dalam arti boleh dikombinasikan, tetapi setiap method wajib memiliki return type dan nama. Return type void menyatakan method menjalankan aksi tanpa mengembalikan nilai — hasil kerjanya berupa efek seperti mencetak ke terminal. Daftar parameter yang kosong ditulis (); method seperti ini bekerja tanpa masukan dari pemanggil.
Method Pertama Kita #
Mari kita tulis class dengan dua method: satu tanpa parameter yang mencetak judul, dan satu yang menerima nama untuk disapa:
public class HaloMethod {
// Method tanpa parameter dan tanpa nilai balik (void)
static void tampilkanJudul() {
System.out.println("=== Laporan Penjualan ===");
}
// Method dengan satu parameter bernama nama
static void sapa(String nama) {
System.out.println("Halo, " + nama + "! Selamat belajar method.");
}
public static void main(String[] args) {
tampilkanJudul();
sapa("Budi");
sapa("Siti");
}
}Output yang Dihasilkan:
=== Laporan Penjualan ===
Halo, Budi! Selamat belajar method.
Halo, Siti! Selamat belajar method.Mari kita telaah baris-baris kode di atas:
- Baris 4 (
static void tampilkanJudul() {): mendeklarasikan methodtampilkanJuduldengan modifierstatic, return typevoid, dan daftar parameter kosong. Badan method dibuka dengan{. - Baris 5 (
System.out.println(...)): satu-satunya pernyataan dalamtampilkanJudul— mencetak judul laporan ke terminal. - Baris 9 (
static void sapa(String nama) {): mendeklarasikan methodsapayang menerima satu parameter bertipeStringbernamanama. Di dalam badan method,namadapat dipakai seperti variabel biasa. - Baris 14-16 (
tampilkanJudul(); sapa("Budi"); sapa("Siti");): tiga pemanggilan method darimain. Eksekusi melompat ke badan method yang dituju, menyelesaikan seluruh pernyataannya, lalu kembali ke baris pemanggilan.
Method sapa dipanggil dua kali dengan isi berbeda — kode sapaan ditulis sekali, dipakai berkali-kali. Inilah inti modularitas: satu tempat untuk satu tanggung jawab.
Memanggil Method dan Stack Frame #
Apa yang sebenarnya terjadi ketika satu method memanggil method lain? JVM menyimpan setiap pemanggilan aktif dalam struktur data bernama call stack. Setiap kotak di call stack disebut stack frame: satu frame dibuat setiap kali method dipanggil, menyimpan parameter, variabel lokal, dan alamat untuk kembali ke pemanggil. Saat method selesai, frame-nya dibongkar dan eksekusi berlanjut di pemanggil.
Program berikut memakai method bersarang tiga tingkat agar urutan naik-turun call stack terlihat dari jejak cetaknya:
public class AlurPanggilan {
static void cetakGaris() {
System.out.println("cetakGaris : ------");
}
static void cetakHeader() {
System.out.println("cetakHeader: mulai");
cetakGaris();
System.out.println("cetakHeader: selesai");
}
static void cetakLaporan() {
System.out.println("cetakLaporan: mulai");
cetakHeader();
System.out.println("cetakLaporan: selesai");
}
public static void main(String[] args) {
System.out.println("main : mulai");
cetakLaporan();
System.out.println("main : selesai");
}
}Output yang Dihasilkan:
main : mulai
cetakLaporan: mulai
cetakHeader: mulai
cetakGaris : ------
cetakHeader: selesai
cetakLaporan: selesai
main : selesaiUrutan hasilnya patut kita cermati. Setiap baris mulai tercetak sebelum pemanggilan berikutnya, dan setiap baris selesai tercetak setelah pemanggilan kembali — bukti bahwa eksekusi menurun ke method terdalam lalu menaik kembali:
- Baris 20 (
System.out.println("main : mulai")): framemainadalah satu-satunya penghuni call stack; program mencetak penanda mulai. - Baris 21 (
cetakLaporan();): JVM membuat frame baru untukcetakLaporandi atas framemain, lalu eksekusi berpindah ke method tersebut. - Baris 15 (
cetakHeader();di dalamcetakLaporan): framecetakHeaderditumpuk di atas framecetakLaporan; di dalamnyacetakGaris()menumpuk satu frame lagi — call stack sempat berisi empat frame. - Baris 16 (
System.out.println("cetakLaporan: selesai")): baris ini baru tercapai setelahcetakHeaderdancetakGarisselesai — frame keduanya sudah dibongkar, menyisakan framecetakLaporandanmain.
Alur naik-turun tersebut dapat digambarkan sebagai dialog berurutan:
Pemahaman tentang call stack akan terpakai langsung pada Chapter Recursive Methods, ketika satu method memanggil dirinya sendiri dan menumpuk frame berlapis-lapis. Sebelum ke sana, kita perlu meluruskan dua istilah yang sering tertukar: parameter yang dideklarasikan method, dan argument yang dikirim pemanggil — materi Chapter Parameter dan Argument.
Referensi #
- JLS SE25 §8.4: Method Declarations
- Java API: java.lang.Math (contoh method static)
- dev.java: Belajar Java
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
AlurPanggilan.java
Unduh berkaspublic class AlurPanggilan {
static void cetakGaris() {
System.out.println("cetakGaris : ------");
}
static void cetakHeader() {
System.out.println("cetakHeader: mulai");
cetakGaris();
System.out.println("cetakHeader: selesai");
}
static void cetakLaporan() {
System.out.println("cetakLaporan: mulai");
cetakHeader();
System.out.println("cetakLaporan: selesai");
}
public static void main(String[] args) {
System.out.println("main : mulai");
cetakLaporan();
System.out.println("main : selesai");
}
}
HaloMethod.java
Unduh berkaspublic class HaloMethod {
// Method tanpa parameter dan tanpa nilai balik (void)
static void tampilkanJudul() {
System.out.println("=== Laporan Penjualan ===");
}
// Method dengan satu parameter bernama nama
static void sapa(String nama) {
System.out.println("Halo, " + nama + "! Selamat belajar method.");
}
public static void main(String[] args) {
tampilkanJudul();
sapa("Budi");
sapa("Siti");
}
}