Cari artikel di situs ini

Parameter

Versi ramah cetakVersi ramah cetak

Jika subrutin adalah kotak hitam, maka parameter merupakan alat atau mekanisme untuk memberikan informasi dari dunia luar ke dalam kotak. Parameter merupakan bagian dari antar muka dengan suatu subrutin. Dengan menggunakan parameter, kita dapat mengatur perilaku suatu subrutin sesuai dengan input yang diberikan.

Sebagai analogi, kita ambil contoh AC -- yaitu alat yang mengatur suhu ruangan pada temperatur konstan. AC memiliki parameter, yaitu tombol remote yang digunakan untuk memasukkan suhu yang diinginkan. AC akan selalu melakukan tugas yang sama, yaitu mengatur suhu ruangan. Akan tetapi, tugas persis yang dilakukan tergantung suhu yang diterima dari remote control.

Kita ambil contoh pada kelas KonsolInput pada bagian terdahulu.

    public static double ambilDouble(String pertanyaan) {
        String strbilangan = null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        double bilangan;
 
        System.out.print(pertanyaan);
        try {
            strbilangan = br.readLine();
        } catch (IOException ioe) {
            System.out.println("Kesalahan IO, program berhenti");
            System.exit(1);
        }
 
        bilangan = Double.parseDouble(strbilangan);
        return bilangan;
    }

Di sini subrutin ambilDouble memiliki parameter tunggal yang bertipe String dan bernama pertanyaan. Ketika subrutin ini dipanggil, suatu nilai harus ikut disertakan, dan nilai ini dimasukkan dalam parameter "pertanyaan". Misalnya, subrutin dapat dipanggil dengan a = ambilDouble("hallo");. Ketika komputer menjalankan perintah ini, komputer akan memasukkan "hallo" ke dalam parameter "pertanyaan", kemudian subrutin ambilDouble menjalankan semua perintah di dalamnya.

Jika parameter yang diberikan berupa variabel, misalnya variabel str berisi "kabar", kemudian subrutin ambilDouble panggil dengan perintah ambilDouble(str), maka isi dari str akan dikopi ke dalam parameter "pertanyaan" terlebih dahulu sebelum seluruh perintah dalam subrutin ambilDouble dilaksanakan.

Perlu dicatat bahwa istilah "parameter" digunakan dalam dua konsep berbeda tetapi berkaitan. Yang pertama adalah "parameter" digunakan untuk mendefinisikan suatu subrutin. Parameter yang digunakan pada definisi suatu subrutin disebut parameter formal. "Parameter" yang digunakan untuk memanggil suatu subrutin disebut parameter aktual. Ketika suatu subrutin dipanggil, parameter aktual akan dievaluasi, dan hasilnya akan dimasukkan ke dalam parameter formal.

Parameter formal berbentuk seperti pengenal atau nama, dan bersifat seperti halnya variabel dan memiliki tipe -- misalnya int, double, atau String. Parameter aktual bersifat seperti nilai atau angka, jadi bisa berbentuk ekspresi atau perintah apapun yang menghasilkan nilai atau angka. Sewaktu kita memanggil subrutin, kita harus memberi parameter aktual untuk setiap parameter formal yang didefinisikan.

Misalnya, lihat contoh berikut.

static void lakukanSesuatu(int N, double d, boolean b) {
    ... // perintah lainnya di sini
}

Subrutin ini bisa saja dipanggil dengan instruksi berikut.

lakukanSesuatu(1, Math.random() * 3, x == 3);

Ketika komputer mengevaluasi subrutin ini, pada dasarnya sama dengan menglakukan perintah-perintah berikut.

{
    int N;
    double d;
    boolean b;
 
    N = 1;
    d = Math.random() * 3;
    b = (x == 3);
    ... // perintah lainnya di sini
}

Untuk memanggil subrutin, yang kita perlukan adalah nama, berapa banyak parameter formal yang dimilikinya, dan tipe dari parameter formal tersebut. Infomasi ini disebut juga tanda subrutin. Tanda subrutin lakukanSesuatu dapat ditulis sebagai lakukanSesuatu(int,double,boolean). Perhatikan bahwa tanda subrutin tidak memiliki nama parameter; sebetulnya jika kita hanya ingin menggunakan subrutin tersebut, nama parameter tidaklah penting, karena nama bukan merupakan bagian dari antar muka subrutin.

Java agak sedikit berbeda karena memungkinkan dua atau lebih subrutin yang berbeda dalam kelas yang sama memiliki tanda subrutin yang berbeda. (Mirip seperti bahasa C++) Subrutin yang seperti ini disebut subrutin yang dibebanlebihkan (overloaded). Misalnya,

void taruh(String s) { ... }
void taruh(int i) { ... }
void taruh(double d) { ... }
void taruh(boolean b) { ... }

Kita sudah menggunakan subrutin yang dibebanlebihkan ini misalnya pada System.out.println(). Jika kita coba ketik System.out.println pada Eclipse, Eclipse akan membantu kita untuk melihat parameter apa saja yang dibutuhkan, termasuk juga dapat menunjukkan apakah suatu subrutin dibebanlebihkan.

Catatan : Overload tidak berlaku pada tipe keluaran subrutin. Dua atau lebih subrutin dengan nama sama dalam suatu kelas tetapi memiliki tipe keluaran yang berbeda tidak diperbolehkan dalam Java. Misalnya, kalau kita coba definisikan 2 fungsi seperti berikut, maka Java akan memberi pernyataan kesalahan sintaks.

int ambil(String s) { ... }
boolean ambil(String s) { ... }
double ambil(String s) { ... }

Terakhir, hingga saat ini kita sudah mengenal 3 jenis variabel: variabel lokal, yang didefinisikan di dalam suatu blok, variabel statik, yang didefinisikan di dalam suatu kelas, dan parameter formal, yang didefinisikan pada definisi subrutin di dalam suatu kelas.

Variabel lokal tidak memiliki hubungan dengan dunia luar sama sekali. Parameter digunakan untuk berhubungan dengan dunia luar sebagai alat untuk menerima nilai atau angka dari dunia luar. Perubahan nilai pada variabel lokal dan parameter tidak mempengaruhi variabel itu sendiri karena sifatnya terisolasi.

Hal yang sama sekali berbeda akan terjadi apabila suatu subrutin menggunakan variabel yang didefinisikan di luar subrutin itu. Variabel tersebut hidup secara terpisah dari subrutin, dan bisa diakses oleh apapun di luar subrutin itu. Variabel ini disebut variabel global. Variabel ini terlihat oleh semua subrutin dalam kelas tersebut. Perubahan yang terjadi di sini dapat mempengaruhi cara kerja subrutin lain yang menggunakan variabel tersebut.

Hal ini kita lihat pada contoh sebelumnya tentang subrutin dan variabel statik untuk menghitung statistik komputerMenang, userMenang, dan seri.

Tidak ada yang salah dalam menggunakan variabel global, akan tetapi kita harus terus ingat bahwa variabel global itu harus sebagai bagian dari antar muka subrutin kita dengan keseluruhan dunia luar. Cara ini sebetulnya jalan belakang yang tidak terdokumentasi seperti pada definisi subrutin, yang apabila aturan-aturannya tidak dipenuhi secara disiplin mungkin akan menyebabkan bug atau kesalahan lain di luar kontrol kita.

Paling tidak ada satu alasan untuk menggunakan variabel global, yaitu apabila kelas secara keseluruhan dianggap sebagai kotak hitam, akan lebih masuk akal apabila subrutin bisa mengintip sedikit keluar dan saling menukar informasi jika cara ini jauh lebih mudah diimplementasikan dan dilihat dari dunia luar.