Sunday, March 11, 2018

2. Tipe Data, Variabel, dan Array



Bab ini akan mendiskusikan tiga elemen fundamental pada Java: tipe data, variabel, dan array. Sebagai bahasa pemrograman modern, Java mendukung keberadaan sejumlah tipe data. Anda dapat menggunakan tipe data tersebut untuk mendeklarasikan variabel dan untuk menciptakan array. Anda akan melihat bahwa pendekatan Java pada ketiga elemen fundamental ini sangat efisien.


Java: Bahasa Dengan Tipe Data Ketat
Java merupakan bahasa dengan aturan penentuan tipe data yang sangat ketat. Keamanan dan ketangguhan Java berasal dari fakta ini. Pertama, setiap variabel harus memiliki tipe data dan setiap ekspresi juga harus memiliki tipe data. Kedua, semua penugasan, apakah penugasan eksplisit maupun melalui pelewatan parameter pada pemanggilan metode, akan diperiksa kompatibilitas (kesesuaian) tipe datanya. Kompilator Java akan memeriksa semua ekspresi dan parameter untuk memastikan kompatibilitas tipe data. Ketidaksesuaian tipe data akan dipandang sebagai error yang perlu dikoreksi sebelum kompilator menuntaskan proses kompilasi kelas.


Tipe Data Primitif
Java mendefinisikan delapan tipe data primitif: byte, short, int, long, char, float, double, dan boolean. Tipe data ini juga dikenal sebagai tipe data sederhana.

Tipe-tipe data ini dikelompokkan menjadi empat kelompok:
  • Integer Kelompok ini mencakup byte, short, int, dan long, yang merepresentasikan bilangan bulat.
  • Titik-Mengambang Kelompok ini mencakup float dan double, yang merepresentasikan bilangan pecahan.
  • Karakter Kelompok ini mencakup char, yang merepresentasikan simbol.
  • Boolean Kelompok ini mencakup boolean, yang merupakan tipe data spesial yang merepresentasikan nilai true/false.



Integer
Java mendefinisikan empat tipe data integer: byte, short, int, dan long. Semua tipe data ini adalah tipe data bertanda, yang memiliki nilai positif dan negatif. Java tidak mendukung keberadaan tipe data tak-bertanda, yang hanya memiliki nilai positif. Banyak bahasa pemrograman komputer yang mendukung keberadaan tipe data integer bertanda dan tak-bertanda. Namun, para perancang Java merasa bahwa integer tak-bertanda tidak diperlukan. Mereka merasa bahwa konsep tipe data tak-bertanda umumnya dipakai untuk menetapkan watak dari bit orde-tinggi, yang menentukan tanda dari sebuah nilai integer. Seperti yang akan Anda lihat pada Bab 3, Java mengelola bit orde-tinggi secara berbeda, dengan menambahkan sebuah operator spesial, yang dinamakan dengan operator “penggeseran kanan tak-bertanda”.  

Lebar dari tipe data integer tidak dipandang sebagai memori penyimpanan yang dibutuhkan, tetapi sebagai watak yang didefinisikan untuk variabel dan ekspresi dengan tipe data ini. Lingkungan run-time Java secara bebas menggunakan ukuran tipe data yang diinginkan, sepanjang Anda menetapkan tipe data pada saat mendeklarasikannya. Lebar dan rentang tipe data integer ditampilkan pada tabel berikut:

Nama
Lebar
Rentang
long
64
-9,223,372,036,854,775,808 sampai 9,223,372,036,854,775,807
int
32
-2,147,483,648 sampai 2,147,483,647
short
16
-32,768 sampai 32,767
byte
8
-128 sampai 127


byte
Tipe data integer terkecil adalah byte. Ini merupakan tipe data bertanda 8-bit yang memiliki rentang nilai dari -128 sampai 127. Variabel dengan tipe data byte umumnya berguna ketika Anda bekerja dengan sebuah aliran data dari jaringan atau dari file. Tipe data ini juga berguna ketika Anda bekerja dengan data biner mentah yang secara langsung tidak kompatibel dengan tipe data pustaka Java lain.

Variabel dengan tipe data byte dideklarasikan dengan katakunci byte. Sebagai contoh, statemen berikut mendeklarasikan dua variabel byte dengan nama b dan c:

byte b, c;


short
short adalah tipe data bertanda 16-bit. Tipe data ini memiliki rentang -32,768 sampai 32,767. Ini mungkin merupakan tipe data Java yang paling jarang digunakan. Berikut adalah beberapa contoh deklarasi variabel short:

short s;
short t;


int
Tipe data yang paling banyak digunakan adalah int. Ini merupakan sebuah tipe data bertanda 32-bit yang memiliki rentang nilai dari -2,147,483,648 sampai 2,147,483,647. Variabel dengan tipe data int umumnya dipakai untuk mengendalikan loop dan sebagai indeks array.

// Menghitung jarak tempuh cahaya menggunakan variabel long.
class Cahaya {
   public static void main(String args[]) {
      int kecepatan_cahaya;
      long hari;
      long detik;
      long jarak;
  
      // kecepatan cahaya dalam mil per detik
      kecepatan_cahaya = 186000;
  
      hari = 1000; // menetapkan banyak hari
  
      detik = hari * 24 * 60 * 60; // konversi ke detik
  
      jarak = kecepatan_cahaya * detik; // menghitung jarak
  
      System.out.print("Dalam " + hari);
      System.out.print(" hari, cahaya akan menempuh jarak sekitar ");
      System.out.println(jarak + " mil.");
   }
}

Program ini menghasilkan keluaran berikut:

Dalam 1000 hari, cahaya akan menempuh jarak sekitar 16070400000000 mil.

Jelaslah, hasil ini tidak mungkin bisa ditampung oleh variabel int.


Tipe Data Titik-Mengambang
Bilangan titik-mengambang (pecahan), yang dikenal pula dengan bilangan riil, dipakai ketika mengevaluasi ekspresi yang memerlukan kepresisian fraksional. Sebagai contoh, perhitungan seperti akar kuadrat, atau trigonometri seperti sinus dan kosinus, akan menghasilkan sebuah nilai dengan kepresisian yang memerlukan tipe data titik-mengambang. Java mengimplementasikan tipe-tipe data dan operator-operator titik-mengambang standar berbasis IEEE-754. Ada dua jenis tipe data titik-mengambang: float dan double, yang merepresentasikan bilangan kepresisian tunggal dan bilangan kepresisian ganda. Lebar dan rentang nilainya ditunjukkan berikut:

Nama
Lebar dalam Bit
Rentang Pendekatan
double
64
4.9e-324 sampai 1.8e+308
float
32
1.4e-045 sampai 3.4e+038


float
Tipe data float menetapkan nilai kepresisian-tunggal yang menggunakan penyimpanan 32 bit. Kepresisian tunggal lebih cepat pada sejumlah prosesor dan memerlukan ruang penyimpanan setengah kali lebih luas daripada kepresisian tunggal. Tipe data ini akan menjadi tidak presisi ketika nilai yang direpresentasikannya sangat besar atau sangat kecil. Variabel dengan tipe data float berguna ketika Anda memerlukan komponen pecahan, tetapi tidak memerlukan derajat kepresisian yang besar. Sebagai contoh, float dapat dipakai untuk merepresentasikan dollar dan sen.

Berikut adalah contoh deklarasi variabel float:

float suhu_tinggi, suhu_rendah;


double
Kepresisian ganda, yang ditandai dengan katakunci double, menggunakan ruang penyimpanan 64 bit untuk menyimpan sebuah nilai. Kepresisian ganda sebenarnya lebih cepat daripada kepresisian tunggap pada prosesor modern yang telah dioptimalkan untuk perhitungan matematis berkecepatan tinggi. Semua fungsi matematika seperti sin(), cos(), dan sqrt(), menghasilkan nilai balik bertipe data double. Ketika Anda mengharapkan keakuratan perhitungan, double menjadi tipe data terbaik.

Berikut adalah sebuah program pendek yang menggunakan variabel-variabel double untuk menghitung luas dari sebuah lingkaran:

// Menghitung luas lingkaran.
public class Luas {
   public static void main(String args[]) {
      double pi, r, a;
 
      r = 10.8; // radius lingkaran
      pi = 3.1416; // pi, pendekatan
      a = pi * r * r; // menghitung luas
 
      System.out.println("Luas lingkaran adalah " + a);
   }
}

Program ini menghasilkan keluaran berikut:

Luas lingkaran adalah 366.436224


Karakter
Dalam Java, tipe data yang dipakai untuk menyimpan karakter adalah char. Namun, bagi para programer C/C++, Anda perlu hati-hati: char dalam Java tidak sama dengan char pada C atau C++. Dalam C/C++, char memiliki lebar 8 bit. Ini tidak berlaku pada Java. Java menggunakan Unicode untuk merepresentasikan karakter. Unicode mendefinisikan sebuah himpunan karakter internasional yang dapat merepresentasikan semua himpunan karakter pada semua bahasa manusia. Jadi, pada Java char adalah sebuah tipe data 16 bit. Rentang dari char adalah 0 sampai 65,536. Tidak ada nilai negatif pada char. Karena Java dirancang agar program dapat ditulis untuk keperluan mendunia, masuk akal bila tipe data char menggunakan Unicode untuk merepresentasikan karakter.

Berikut adalah sebuah program yang mendemonstrasikan variabel char:

//Mendemonstrasikan tipe data char
public class DemoChar {
 public static void main(String args[]) {
  char ch1, ch2;
  ch1 = 88; // kode untuk X
  ch2 = 'Y';
  
  System.out.print("ch1 dan ch2: ");
  System.out.println(ch1 + " " + ch2);
  }
}

Program ini menghasilkan keluaran berikut:

ch1 dan ch2: X Y

Pada program tersebut, ch1 pertama-tama diberikan nilai X. Selanjutnya, ch1 diinkremen. Ini menyebabkan ch1 memuat Y, yaitu karakter berikutnya pada runtun ASCII (dan Unicode).


Boolean
Java memiliki sebuah tipe data primitif, yang dinamakan dengan boolean, untuk nilai-nilai logis. Tipe data ini hanya memiliki satu dari dua nilai: true atau false. Ini merupakan tipe data yang dihasilkan oleh semua operator relasional, seperti pada kasus a<b. Tipe data boolean yang diperlukan oleh ekspresi kondisional yang mengendalikan statemen if dan for,

Berikut adalah sebuah program yang mendemonstraskan tipe data boolean:

//Mendemonstrasikan tipe data boolean
public class UjiBoolean {
   public static void main(String args[]) {
      boolean b;
      
      b = false;
      System.out.println("b bernilai " + b);
  
      b = true;
      System.out.println("b bernilai " + b);
  
      // Nilai boolean dapat mengendalikan statemen if
      if(b) System.out.println("Ini akan dieksekusi.");
      
      b = false;
      if(b) System.out.println("Ini tidak akan dieksekusi.");
  
      // Keluaran dari operator relasional adalah nilai boolean
      System.out.println("10 > 9 menghasilkan " + (10 > 9));
   }
}

Program ini menghasilkan keluaran berikut:

b bernilai false
b bernilai true
Ini akan dieksekusi.
10 > 9 menghasilkan true

Ada tiga hal yang penting diperhatikan pada program ini. Pertama, seperti yang dapat Anda lihat, ketika sebuah nilai boolean ditampilkan oleh println(), nilai “true” atau “false” akan ditampilkan. Kedua, nilai dari variabel boolean dapat dipakai untuk mengendalikan statemen if. Tidak diperlukan statemen if seperti ini:

if(b == true) 

Ketiga, keluaran dari sebuah operator relasional, seperti <, adalah nilai boolean. Inilah mengapa ekspresi 10<9 menampilkan nilai “true”.


Lebih Dekat Dengan Literal
Literal telah dijelaskan secara singkat pada Bab 1. Setelah tipe-tipe data primitif dijelaskan, Anda akan mempelajarinya lebih jauh.

Literal Integer
Integer merupakan tipe data yang paling umum digunakan pada program. Semua bilangan bulat merupakan literal integer. Misalnya, 1, 2, 3, dan 34. Semuanya ini adalah nilai desimal, yang merupakan bilangan dengan basis 10. Dua basis lain yang dapat dipakai pada literal integer adalah oktal (basis delapan) dan heksadesimal (basis 16). Nilai oktal dinotasikan dengan menambahkan sebuah nol di depannya. Nilai desimal normal tidak bisa memilikinya. Jadi, nilai valid 09 akan menghasilkan error, karena 9 di luar rentang oktal, yaitu 0 sampai 7. Basis bilangan yang umum dipakai programer adalah heksadesimal. Anda menandai konstanta heksadesimal dengan menambahkan 0x atau 0X di depan nilainya. Rentang dari dijit heksadesimal adalah 0 sampai 15, jadi A sampai F (atau a sampai f) diganti menjadi 10 sampai 15.

Literal integer menciptakan sebuah nilai int, yang dalam Java merupakan sebuah nilai integer 32-bit. Karena Java sangat ketat dalam penentuan tipe data, Anda mungkin bertanya-tanya bagaimana menugaskan sebuah literal integer dari satu tipe integer Java, seperti byte atau long, tanpa menyebabkan error ketidakcocokan. Beruntung karena kejadian seperti ini dapat ditangani dengan mudah. Ketika sebuah nilai literal ditugaskan kepada sebuah variabel byte atau short, tidak akan error yang dihasilkan jika nilai literal tersebut berada dalam rentang dari tipe data target. Literal integer selalu dapat ditugaskan kepada variabel long. Namun, untuk menetapkan sebuah literal long, Anda harus secara eksplisit memberitahu kompilator bahwa nilai literal tersebut bertipe long. Anda dapat melakukannya dengan menempatkan l atau L di belakang nilainya. Sebagai contoh, 0x7fffffffffL.

Mulai dari JDK 7, Anda dapat menetapkan literal integer menggunakan biner. Untuk melakukannya, awali nilai dengan 0b atau 0B. Misalnya, berikut ini menetapkan nilai desimal 10 menggunakan literal biner:

int x = 0b1010;

Penggunaan literal biner dapat mempermudah memasukkan nilai-nilai yang dipakai sebagai bitmask. Pada kasus tersebut, representasi desimal (atau heksadesimal) secara visual tidak menyampaikan makna relatif terhadap penggunaannya.

Juga mulai dengan JDK 7, Anda bisa menanamkan satu atau lebih tanda garis-bawah pada literal integer. Ini dapat mempermudah pembacaan literal integer yang besar. Ketika literal dikompilasi, karakter garis-bawah akan diabaikan. Sebagai contoh, bila diberikan

int x = 123_456_789;

maka nilai yang dituaskan kepada x menjadi 123,456,789. Karakter garis-bawah akan diabaikan kompilator. Garis-bawah dapat dipakai untuk memisahkan dijit-dijit. Karakter ini tidak bisa dipakai di awal atau di akhir dari sebuah literal. Anda bisa menggunakan lebih dari satu garis-bawah seperti berikut:

int x = 123___456___789;

Penggunaan karakter garis-bawah pada sebuah literal integer khususnya berguna ketika pengkodean perlu dilakukan, misalnya, pada nomor telepon, nomor ID konsumen, kode barang, dan lainnya. Karakter garis-bawah juga berguna untuk pengelompokan secara visual ketika menetapkan literal biner. Misalnya, nilai biner bisa dikelompokkan secara biner menjadi unit-unit empat-dijit, seperti berikut:

int x = 0b1101_0110_0001_1001;

Literal Titik-Mengambang
Bilangan pecahan atau titik-mengambang merepresentasikan nilai-nilai desimal yang memiliki komponen fraksional. Literal ini dapat diekspresikan dengan notasi standar maupun notasi saintifik. Notasi standar terdiri-dari sebuah komponen bilangan bulat yang diikuti oleh titik desimal dan komponen fraksional. Sebagai contoh, 3.2, 3.14, dan 0.65446 merepresentasikan notasi standar untuk bilangan titik-mengambang. Notasi saintifik menggunakan notasi standar, yang diikuti oleh sebuah sufiks e atau E yang menetapkan derajat kepangkatan 10. Sebagai contoh, 2.23E23, 32323E-05, dan 2e+199.

Literal titik-mengambang pada Java secara default memiliki kepresisian ganda, dengan tipe data double. Untuk menetapkan literal float, Anda perlu mengakhiri konstanta dengan f atau F. Anda juga dapat secara eksplisit menetapkan literal double dengan mengakhiri konstanta dengan D atau d. Tipe data double secara default menghabiskan 64 bit memori penyimpanan, sedangkan tipe data float menempati 32 bit memori penyimpanan.

Literal titik-mengambang heksadesimal juga didukung Java, meskipun jarang digunakan. Literal ini harus dalam bentuk notasi saintifik, dengan P atau p, bukan E atau e, yang digunakan. Sebagai contoh, 0x12.2P2 merupakan sebuah contoh literal titik-mengambang heksadesimal yang valid. Nilai yang ada setelah P, yang dinamakan dengan eksponen biner, mengindikasikan derajat kepangkatan 2. Oleh karena itu, 0x12.2P2 merepresentasikan 72.5.

Mulai dari JDK 7, Anda dapat menanamkan satu atau lebih karakter garis-bawah pada sebuah literal titik-mengambang. Fitur ini bekerja sama seperti pada literal integer, yang telah dijelaskan sebelumnya. Tujuannya adalah untuk mempermudah membaca literal titik-mengembang yang besar. Ketika literal dikompilasi, garis-bawah akan diabaikan. Sebagai contoh,

double angka = 9_423_497_682.0;

akan menugaskan nilai 9,423,497,682,0 kepada angka. Karakter garis-bawah akan diabaikan. Seperti pada kasus literal integer, garis-bawah hanya dipakai untuk memisahkan dijit-dijit, yang tidak bisa ditempatkan di awal atau di akhir literal. Anda juga diijinkan menggunakan lebih dari satu karakter garis-bawah. Anda juga dimungkinkan untuk menggunakan garis-bawah pada komponen fraksional. Sebagai contoh,

double angka = 9__423__675.1__3__7;

merupakan literal titik-mengambang yang valid. Pada kasus ini, bagian fraksionalnya adalah .137.


Literal Boolean
Literal Boolan cukup sederhana. Hanya ada dua nilai yang dapat dimiliki variabel boolean, true dan false. Nilai true dan false tidak dapat dikonversi menjadi representasi numeris. Literal true dalam Java tidak sama dengan 1, begitu juga literal false tidak sama dengan 0. Dalam Java, literal Boolean hanya dapat ditugaskan kepada variabel yang dideklarasikan sebagai boolean atau pada ekspresi dengan operator-operator Boolean.


Literal Karakter
Karakter dalam Java merupakan indeks untuk himpunan karakter Unicode. Karakter merupakan sebuah nilai 16-bit yang dapat dikonversi menjadi integer dan dimanipulasi menggunakan operator-operator integer, seperti operator penjumlahan dan pengurangan. Sebuah literal karakter direpresentasikan menggunakan sepasang tanda kutip tunggal. Semua karakter ASCII yang terlihat  (visibel) dapat secara langsung ditempatkan ke dalam tanda kutip tersebut, seperti ‘a’, ‘x’, dan ‘@’. Untuk karakter yang tidak mungkin ditempatkan secara langsung, diberikan runtun escape sehingga Anda dimungkinkan memasukkan karakter yang dibutuhkan, seperti ‘\’’ untuk karakter kutip dan ‘\n’ untuk karakter baris-baru. Ada pula sebuah mekanisme untuk secara langsung memasukkan nilai karakter dalam oktal atau heksadesimal. Untuk notasi oktal, Anda bisa menggunakan simbol garis-miring terbalik (backslash) yang diikuti oleh bilangan tiga-dijit. Sebagai contoh, ‘\141’ adalah huruf ‘a’. Untuk heksadesimal, Anda memasukkan simbol garis-miring terbalik (backslash) yang diikuti oleh huruf u, kemudian menempatkan empat dijit heksadesimal. Sebagai contoh, ‘\u0061’ adalah huruf ‘a’ ISO-Latin-1. ‘\ua432’ merupakan sebuah karakter Katakana pada huruf Jepang. Tabel 2.1 menunjukkan runtun karakter escape.

Tabel 2.1 Runtun escape
Runtun Escape
Penjelasan
\ddd
Karakter oktal (ddd)
\uxxxx
Karakter Unicode heksadesimal (xxxx)
\’
Kutip tunggal
\”
Kutip ganda
\\
Garis-miring terbalik (backslash)
\r
Carriage-return
\n
Baris baru (line feed)
\t
Tab
\b
Backspace


Literal String
Literal string dalam Java ditetapkan sama seperti pada banyak bahasa pemrograman dengan mengapit runtun karakter dengan kutip ganda. Beberapa contoh literal string diberikan berikut:

Namaku Dian
dua\nbaris
“\”Ini ada di dalam kutip\””


Selanjutnya  >>>





No comments: