Sistem Input pada Bahasa Java

baca 7 menit
Sistem Input pada Bahasa Java

Sebelumnya kita telah membahas tentang sistem output. Kita juga sudah membahas tentang variabel dan literal. Tetapi, sejauh ini program yang kita buat masih begitu-begitu saja. Satu arah, hanya menampilkan output tanpa ada sesuatu yang interaktif.

Salah satu cara yang bisa dilakukan untuk membuat program kita lebih interaktif adalah dengan menggunakan sistem input.

Bagaimana cara membuat sistem input pada Java, dan apa yang bisa kita lakukan dengan ini? mari kita bahas lebih lanjut.

Sekilas tentang Sistem Input dan Scanner

Sistem input, adalah perintah yang kita gunakan untuk memerintahkan komputer mengambil masukan dari pengguna.

Secara umum, masukan ini bisa berupa ketikan keyboard, klik mouse, sentuhan layar, dan lain sebagainya.

Walaupun ada banyak cara melakukan input, fokus kita kali ini cukup inputan dari ketikan user saja. Jadi kita akan coba membaca ketikan user pada layar terminal dan memasukkannya pada sebuah variabel.

Pada bahasa Java, sistem input dilayani oleh objek yang bernama Scanner. Objek ini sudah tersedia dan bisa kita gunakan dengan melakukan import library terlebih dahulu, yaitu java.util.* atau java.util.Scanner.

Library merupakan koleksi kode yang sudah sudah dituliskan, sehingga kita tidak perlu lagi menulis kode dari awal untuk melakukan hal-hal sepele seperti sistem input ini.

Dalam inisialisasinya, objek Scanner harus memiliki sumber input sebagai argumennya. Karena kali ini kita mengambil inputan dari terminal, maka argumen yang diberikan adalah System.in.

Untuk lebih jelasnya tentang Scanner, bisa kalian coba ketik dan jalankan kode berikut:

java
import java.util.Scanner;  // import Scanner

public class SistemOutput {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);  // inisialisasi objek scanner
    System.out.print("Masukkan nama: ");
    String nama = scanner.nextLine();          // membaca inputan dari keyboard
    System.out.println("Halo " + nama);        // output hasil inputan
  }
}

Ketika program dijalankan, maka program akan berhenti pada tulisan Masukkan nama:. Ini karena ketika kita panggil scanner.nextLine() program akan menunggu inputan dari user.

Selanjutnya coba ketikkan sebuah nama, misal "Inva" lalu tekan tombol enter. Nantinya akan keluar outputan "Halo Inva". Lengkapnya seperti ini:

Masukkan nama: Inva
Halo Inva

Pada contoh tersebut kita telah menggunakan method nextLine. Method ini berfungsi untuk mengambil inputan yang bertipe String alias huruf atau kumpulan huruf.

Biasanya terjadi salah paham antara Scanner dan scanner. Walaupun sekilas terlihat sama, 2 keyword ini sangat berbeda. Scanner dengan kapital "S" merupakan objek, sedangkan scanner dengan "s" kecil merupakan identifier yang kita buat untuk menampung objek Scanner. Bisa dibilang scanner adalah variabel yang menampung Scanner.

Karena `scanner` pada contoh ini adalah identifier, seperti identifier pada umumnya, kalian bisa mengganti namanya sesuka hati. Yang perlu diperhatikan adalah ketika melakukan pemanggilan, identifier yang digunakan juga harus sama.

Method-method dalam Scanner

Penggunaan method pada objek Scanner harus disesuaikan dengan tipe data inputan, sehingga ada banyak method yang disediakan, diantaranya yaitu:

  • nextLine — Mengambil inputan string
  • nextInt — Mengambil inputan int atau angka bulat
  • nextFloat — Mengambil inputan float atau angka desimal

Selain itu juga ada method lainnya seperti nextBoolean, nextDouble, dan nextLong. Dari namanya sudah kelihatan ya fungsinya apa.

Penggunaan method-method ini kurang lebih sama seperti sebelumnya. Kita harus membuat objek Scanner terlebih dahulu lalu memanggil method sesuai fungsinya. Contohnya seperti ini.

java
import java.util.Scanner;

public class SistemOutput {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    
    System.out.print("Masukkan nama         : ");
    String nama = scanner.nextLine();
    System.out.print("Masukkan angka bulat  : ");
    int bulat = scanner.nextInt();
    System.out.print("Masukkan angka pecahan: ");
    float pecahan = scanner.nextFloat();
    float hasil = bulat + pecahan;
    
    System.out.println("Halo " + nama);
    System.out.printf("Hasil dari %d + %.2f adalah %.2f", bulat, pecahan, hasil);
  }
}

Pada program tersebut kita menginginkan user melakukan 3 inputan. Pertama adalah nama dengan tipe data string, selanjutnya ada angka bulat dengan tipe data int, dan terakhir adalah angka pecahan dengan tipe data float. Karena semua punya tipe data yang berbeda, method yang digunakan juga harus disesuaikan.

Selanjutnya dilakukan penjumlahan antara angka bulat dan angka pecahan dan dimasukkan ke dalam variabel hasil. Variabel ini bertipe float karena kita memiliki variabel pecahan yang juga bertipe float.

Terakhir, kita mengoutputkan nama dengan method println, serta angka bulat, pecahan, dan hasil dengan method printf seperti yang terlihat di atas. Kalau lupa apa maksud dari printf tersebut bisa lihat lagi di sini.

Jika kita coba jalankan dan memasukkan data dengan tipe data yang sesuai, maka kurang lebih akan keluar hasil sebagai berikut.

Masukkan nama         : Inva
Masukkan angka bulat  : 23
Masukkan angka pecahan: 3.1415
Halo Inva
Hasil dari 23 + 3.14 adalah 26.14

Bisa dilihat ya, hasilnya sudah sesuai dengan logika yang kita buat sebelumnya. Tetapi, jika kita coba memasukkan data yang tidak sesuai tipenya, program akan error seketika. Silahkan bisa dicoba sendiri.

Karakter Pemisah Input pada Java

Sebenarnya Java bukan membaca inputan berdasarkan hasil klik tombol, melainkan karakter yang dihasilkan oleh tombol tersebut yang sebenarnya digunakan. Bingung? jadi begini..

Ketika kita menggunakan method nextLine, objek scanner akan membaca seluruh baris inputan kita sampai menemukan karakter \n atau yang disebut escaped character newline. Nah, untuk menginputkan karakter \n ini kita bisa menggunakan tombol enter pada keyboard.

Lain cerita jika kita menggunakan method selain nextLine, seperti nextInt dan nextFloat. Method-method ini tidak hanya menggunakan karakter \n sebagai tanda, melainkan juga karakter whitespace lain seperti space alias spasi.

Supaya dapat gambaran, kita langsung saja coba dengan kode program.

java
import java.util.Scanner;

public class SistemOutput {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Masukkan 2 angka dipisah dengan spasi: ");
    int angka1 = scanner.nextInt();
    int angka2 = scanner.nextInt();
    int hasil = angka1 + angka2;
    
    System.out.printf("hasil dari %d + %d adalah %d", angka1, angka2, hasil);
  }
}

Pada kode tersebut kita bermaksud untuk menjumlahkan 2 angka yang berasal dari inputan pengguna. Kali ini kita coba memasukkan 2 angka yang dipisahkan dengan karakter spasi, semisal `23 7`. Maka hasilnya akan seperti ini.

Masukkan 2 angka dipisah dengan spasi: 23 7
hasil dari 23 + 7 adalah 30

Bisa dilihat ya, hasil yang keluar sesuai dengan inputan yang diberikan, yaitu 30 sebagai hasil penjumlahan dari 23 dan 7.

Jika kita coba menggunakan tombol enter hasilnya juga akan sama, kurang lebih seperti ini:

Masukkan 2 angka dipisah dengan spasi: 23
7
hasil dari 23 + 7 adalah 30

Ingat ya, hal ini tidak berlaku untuk inputan dengan method nextLine. Ini karena nextLine hanya akan membaca inputan ketika sudah menemukan karakter \n alias ketika kita menekan tombol enter.

Catatan: Hati-hati dengan Scanner

Seperti yang disebutkan di atas, method selain nextLine akan diproses ketika sudah menemukan karakter whitespace. Hal ini ternyata menimbulkan sedikit masalah pada Java.

Masalah yang muncul adalah ketika kita coba memanggil method nextLine setelah pemanggilan method lainnya seperti nextInt atau nextFloat. Contohnya seperti ini.

java
import java.util.Scanner;

public class SistemOutput {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Masukkan angka : ");
    int angka = scanner.nextInt();
    System.out.print("Masukkan nama  : ");
    String nama = scanner.nextLine();
    
    System.out.println("Isi variabel angka : " + angka);
    System.out.println("Isi variabel nama  : " + nama);
  }
}

Sekarang coba jalankan kode tersebut dan inputkan sesuai perintah yang diberikan.

Jika sudah, maka kurang lebih hasilnya akan seperti ini.

Masukkan angka : 24
Masukkan nama  : Isi variabel angka : 24
Isi variabel nama  :

Nah loh, ketika kita menginputkan angka lalu menekan tombol enter, inputan kedua untuk meminta nama tidak dijalankan malah langsung keluar output seperti itu. Kira-kira kenapa?

Hal ini disebabkan karena method nextInt atau lainnya tidak menghilangkan karakter \n alias newline. Jadi ketika kita menekan enter setelah memasukkan angka, karakter \n sebenarnya masih tertinggal di sana.

Masih ingat ya, kalau method nextLine membaca baris sampai ditemukan karakter \n. Nah, karena setelah pemanggilan nextInt karakter tersebut masih tertinggal, maka method nextLine akan membaca baris kosong. Ini juga yang menyebabkan inputan nama tidak diminta oleh program.

Untuk tahu lebih lanjut mengenai hal ini bisa join baca di lapak stackoverflow ini

Lalu solusinya bagaimana?

Solusinya gampang, tinggal minta inputan lagi. Jadi kode yang sebelumnya bisa kita ubah menjadi seperti ini.

java
import java.util.Scanner;

public class SistemOutput {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Masukkan angka : ");
    int angka = scanner.nextInt();
    System.out.print("Masukkan nama  : ");
    scanner.nextLine(); // tambahkan baris ini
    String nama = scanner.nextLine();
    
    System.out.println("Isi variabel angka : " + angka);
    System.out.println("Isi variabel nama  : " + nama);
  }
}

Jika dijalankan maka luarannya pasti akan sesuai.

Masukkan angka : 24
Masukkan nama  : Inva
Isi variabel angka : 24
Isi variabel nama  : Inva

Sedikit penjelasan, pada kode tersebut kita memanggil method nextLine sebanyak 2 kali. Pemanggilan pertama bertujuan untuk membaca sekaligus menghilangkan karakter \n sisa dari method nextInt sebelumnya. Sedangkan panggilan kedua berfungsi untuk mengambil inputan nama dari user.

Jadi jangan heran kalau pemanggilan nextLine pertama tidak melibatkan assignment variabel sama sekali.

Selanjutnya

Setelah mengetahui tentang sistem input pada Java, pada kesempatan selanjutnya kita akan membahas lebih dalam tentang variabel dan tipe datanya.

Selamat berkoding ria