Bekerjasama Dengan Operator, Session 8: Logical Operators

Hallo para pembaca yang masih belum bosen sama saya, ketemu lagi dengan saya sang programmer yang katanya berbakat (hahaha). Masih melanjutkan curhatan sebelumnya mengenai Operator, sebelumnya saya ngecurhat soal Equality Operator, kali ini saya mau mengeluarkan uneg-uneg tentang Logical Operators.


~ Weih, suka nih sama yang logic-logic
* Yoi mas bro
Logical operators terdiri dari logical AND (&), logical complement (!), logical exclusive OR (^), dan
logical inclusive OR (|).
~ Loh loh loh, bentar deh, kok kayak pernah liat kata-kata itu ya.
* Iya bro, ga asing ya?
Dari anggotanya logical operators ini mirip dengan bitwise operators, hanya saja untuk complement dalam logical menggunakan tanda seru (!) sedangkan dalam bitwise menggunakan tanda indefinite (~). Antara bitwise dan logical operators yang beda hanya penggunaan simbol tadi sebagai operatornya, dan juga operannya. Dalam bitwise operators yang digunakan sebagai operan adalah integer/character sedangkan dalam logical operators yang digunakan sebagai operan adalah boolean (true atau false), sedangkan fungsinya sama saja.

Sebelum masuk ke contoh ingat saja jika dalam bitwise operator nilai 0 sama dengan nilai false dalam logical operator, sehingga nilai 1 sama dengan true.

1. Logical Complement (!)

Logical complement berfungsi untuk membalik nilai dari operan. Jika dalam bitwise operators ~0 = 1, maka dalam logical operators !false = true. Contoh penggunaan,
class Main{
    boolean bisaTerbang = true;
    
    public static void main (String[] args){
        System.out.print("Ayam bisa terbang " + !bisaTerbang); 
        // output Ayam bisa terbang false
    }
}
Jika method ayamBisaTerbang dipanggil maka nilai yang didapat adalah false.

2. Logical AND (&)

Logical AND digunakan untuk membandingkan dua buah operan. Dalam bitwise operators jika kedua operan bernilai 1 maka hasilnya adalah 1, selain itu hasilnya adalah 0. Serupa dengan itu, dalam logical operators jika kedua operan bernilai true maka hasilnya adalah true, selain itu hasilnya adalah false. Silakan coba code berikut,
class Main{
    public static void main (String[] args){
        System.out.println(true & true); // output true
        System.out.println(true & false); // output false
        System.out.println(false & true); // output false
        System.out.println(false & false); // output false
    }
}

3. Logical exclusive OR (^)

Logical exclusive OR digunakan untuk membandingkan dua buah operan. Dalam bitwise operators jika kedua operan bernilai sama maka hasilnya adalah 0, jika berbeda bernilai 1. Serupa dengan itu, dalam logical operators jika kedua operan bernilai sama maka hasilnya adalah false, jika berbeda hasilnya adalah true. Silakan coba code berikut,
class Main{
    public static void main (String[] args){
        System.out.println(true ^ true); // output false
        System.out.println(true ^ false); // output true
        System.out.println(false ^ true); // output true
        System.out.println(false ^ false); // output false
    }
}

4. Logical inclisive OR (|)

Logical inclusive OR digunakan untuk membandingkan dua buah operan. Dalam bitwise operators jika salah satu operan bernilai 1 maka hasilnya 1, jika kedua operan bernilai 0 maka hasilnya 0. Serupa dengan itu, dalam logical operators jika salah satu operan bernilai true maka hasilnya adalah true, jika kedua operan bernilai false maka hasilnya adalah false. Silakan coba code berikut,
class Main{
    public static void main (String[] args){
        System.out.println(true | true); // output true
        System.out.println(true | false); // output true
        System.out.println(false | true); // output true
        System.out.println(false | false); // output false
    }
}

Cukup simple kan? Udah mulai pegel nih ngetik, saya sudahi aja ya sesi curhat ini. Istirahat dulu, besok lagi kita lanjut. Sampai jumpa di curhatan berikutnya.

Bekerjasama Dengan Operator, Session 7: Equality Operators

Hallo para pembaca yang baik hatinya, ketemu lagi dengan saya sang programmer pemula. Masih melanjutkan curhatan sebelumnya mengenai Operator, sebelumnya saya ngecurhat soal Conditional Operator, kali ini saya mau mengeluarkan uneg-uneg tentang Equality Operators.


~Equality? Mau ngomongin soal persamaan hak nih?
* Ya enggak lah vroh, yang bener ajah
Equality kalo diterjemahkan ke dalam bahasa Indonesia artinya persamaan. Ya, pembahasan kali ini adalah masalah persamaan dan tidak persamaan. Untuk mengetes apakah dua nilai sama digunakan operator (==), hasil pengetesan adalah benar (true) jika kedua operan nilainya sama. Sedangkan untuk mengetes apakah dua nilai tidak sama digunakan operator (!=), hasil pengetesan adalah benar (true) jika kedua operan memiliki nilai yang berbeda.

Equality operators ini hanya bekerja untuk operan berupa angka bulat (byte, short, int, long), jika equality operators digunakan untuk operan berupa angka desimal (float, double) dan juga data berupa objek (termasuk juga tipe data String) maka ceritanya akan lain. Contoh penggunaan equality operators,
int a = 4;
int b = 4;
int c = 8;
boolean sama = a == b; // akan bernilai true
boolean beda = a != c; // akan bernilai true
Nah, ceritanya akan berbeda jika kita mencoba membandingkan dua buah variable bertipe float atau double. Tipe data float atau double memang kurang menyenangkan bagi kita-kita yang math-holic karena dalam dunia Java 1/10 bukan berarti 0.1 dan 0.1 + 0.2 bukan berarti 0.3. Lihat lagi soal tipe data di sini. Silakan coba kode berikut jika tidak percaya,
class Main{
    public static void main (String[] args){
        System.out.println(0.6 == 0.2 + 0.2 + 0.2); //output berupa false
        System.out.println(0.6 == 0.2 * 3); //output berupa false
    }
}
Console akan mengeluarkan output false untuk kedua baris kode tersebut karena 0.2 + 0.2 + 0.2 = 0.6000000000000001, begitu juga dengan 0.2 * 3 = 0.6000000000000001.

Sedangkan ketika kita membandingkan dua variable berupa objek (termasuk String) dengan menggunakan equality operators (== atau !=) yang akan dibandingkan bukan content/isi/nilainya tapi yang akan dibandingkan adalah reference dari objek tersebut.

*Note: Ingat baik-baik bahwa tipe data String bukan lah primitive tapi adalah objek.

Oke deh, saya sudahi saja sesi curhatan ini karena udah ga ada lagi yang mau diomongin. hehehe. Sampai jumpa lagi ya di curhatan berikutnya.

Bekerjasama Dengan Operator, Session 6: Conditional Operators

Hallo para pembaca yang budiman, ketemu lagi dengan saya sang programmer dadakan. Nyambung lagi lanjutkan curhatan sebelumnya mengenai Operator, sebelumnya saya ngecurhat soal Cast Operators yang digunakan ketika kita ingin merubah tipe data sebuah variabel. Nah sekarang saya mau ngelanjutin curhatan saya, kali ini tentang Conditional Operators.


Conditional operators, kalo diterjemahkan ke dalam bahasa Indonesia jadi operator persyaratan. Yah, operator ini digunakan untuk menentukan syarat-syarat tertentu, untuk menguji sebuah nilai apakah sesuai dengan kondisi/persyaratan yang kita ajukan. Conditional operators terdiri dari AND (&&), OR (||), dan tanda tanya (?:). Conditional AND dan OR membutuhkan 2 nilai, sedangkan (?:) hanya 1. Nilai-nilai yang ada dalam conditional AND dan OR akan diuji dari kiri ke kanan.

1. Conditional AND (&&)

Conditional AND (&&) akan menguji dua buah nilai apakah kedua benar atau tidak, jika keduanya benar (true) maka conditional tersebut akan memberikan hasil benar (true), jika salah satu saja salah (false) maka conditonal ini akan memberikan hasil salah (false).
int umur = 10;
boolean lakiLaki = true;

umur > 7 && lakiLaki; //akan menghasilkan true
umur < 7 && lakiLaki; //akan menghasilkan false
Karena conditional AND mensyaratkan keduanya harus benar dan pengujian nilai dilakukan dari kiri, maka ketika nilai yang ada di sebelah kiri bernilai salah (false) maka nilai yang ke dua atau yang di sebelah kanan akan diabaikan.

2. Conditional OR (||)

Conditional OR (||) akan menguji dua buah nilai apakah salah satu dari mereka benar atau keduanya salah, jika salah satu bernilai benar (true) maka conditional tersebut akan menghasilkan nilai benar (true), jika keduanya salah (false) maka conditional tersebut akan menghasilkan nilai salah (false).
int umur = 10;
boolean lakiLaki = false;

umur > 7 || lakiLaki; //akan menghasilkan true
umur < 7 || lakiLaki; //akan menghasilkan false
Karena conditional OR mensyaratkan hanya salah satu saja yang benar dan pengujian nilai dilakukan dari kiri, maka ketika nilai yang ada di sebelah kiri bernilai benar (true) maka nilai yang ke dua atau yang di sebelah kanan akan diabaikan.

3. Conditional tanda tanya (?:)

Conditional ini sebenernya bentuk ringkas dari conditional statement (if ... else ...). Conditional statement digunakan ketika kode yang kita tulis cukup pangjang dan rumit, misalnya.
int umur = 10;

if (umur > 7){
    si anak bisa sekolah;
    si anak mulai belajar bahasa inggris;
    bla bla bla....;
    bla bla bla....;
}
sedangkan (?:) digunakan untuk sesuatu yang singkat-singkat saja, misalnya
int faktorAngka = ganjil ? 1:2;
Kode di atas mendeklarasikan variable faktorAngka, dan diterjemahkan ke dalam manusia menjadi seperti
"Hei Java, tolong berikan variable faktorAngka ini sebuah nilai, jika variable ganjil bernilai true maka tolong berikan variable faktorAngka nilai 1 jika false berikan nilai 2"
Seperti itu aja sih permasalahan Conditional Operators ini, cukup simple kan? Ya sudah kalo gitu udahan dulu curhatan kali ini. Sampai ketemu lagi di celotehan berikutnya.

Bekerjasama Dengan Operator, Session 5: Cast Operators

Hallo para pembaca yang budiman, ketemu lagi dengan saya setelah beberapa lama istirahat nyurhat karena banyak kesibukan kemaren. Okelah kita lanjutkan curhatan sebelumnya mengenai Operator, terakhir kemaren saya ngecurhat soal Bitwise Operators yang isinya mengenai operator-operator yang digunakan untuk memanipulasi tiap-tiap bit kode binary yang merepresentasikan variable character atau integer. Nah sekarang saya mau ngelanjutin curhatan saya, kali ini tentang Cast Operators.


Cast Operators digunakan untuk mengkonversi suatu tipe data menjadi tipe data yang lainnya dengan menggunakan operator "(tipe baru)". Cast operators diperlukan karena Java compiler tidak mengijinkan kita (secara tidak sengaja) mengkonversi data dari satu tipe data ke tipe data lainnya akibat dari kita melakukan operasi aritmatik dimana hasil dari operasi tersebut Java akan secara otomatis melakukan konversi tipe data dan ada informasi yang terbuang dari data tersebut.
int a = 2.65 + 3;
Operasi di atas akan menghasilkan error karena kita mencoba menjumlahkan data bertipe double floating point (2.65) dan integer/int (3) dan Java secara otomatis akan mengkonversi hasilnya menjadi bertipe double floating point, sedangkan kita mengharapkan hasilnya bertipe integer.
~ Kenapa begitu? Kan sama-sama angka juga.
* Ya itu kan dalam dunia manusia, kalo dalam dunia komputer, terutama Java, ga ngeliat itu angka atau huruf, tapi tipe datanya, apakah byte, short, integer, dll.
Java tidak mengijinkan operasi ini karena akan terdapat informasi yang hilang karena Java memberikan data bertipe double floating point (dengan koma) sedangkan kita menginginkan data bertipe integer (tanpa koma). Atau dapat diilustrasikan teman kita memberikan kita minuman sebanyak 1,5 liter sedangkan botol-botol yang kita miliki hanya berukuran 1 liter, maka akan ada minuman sebanyak 0,5 liter yang terbuang.
int a = 2.65 + 3;
Pada saat kita melakukan operasi di atas Java akan berteriak,
"Hai kamu, kami peringatkan kami tidak bisa mengkonversi data tersebut karena akan ada informasi yang hilang (angka di belakang koma)."
Maka peranan Cast Operators ini adalah untuk menjawab bentakan si Java,
"Hai Java, tidak apa-apa kalo ada sebagian informasi yang hilang, jadi konversi aja ga usah protes."
Dan Java pun akan menjawab,
"Oke, ya sudah kalo maunya gitu" 
Jadi untuk membungkam Java ketika melakukan operasi aritmatik di atas kita melakukannya seperti berikut.
int a = (int) 2.65 + 3;// Hasilnya 5, bukan 5.65
int b = (int) (1.5 + 3.2);//Hasilnya 4, bukan 4.7
Jadi pada intinya Cast Operators ini berfungsi untuk memberitahu Java bahwa kita memiliki intensi/maksud untuk merubah tipe data sesuai kebutuhan kita.

Untuk konversi tipe data primitive, selain karena perbedaan jenis data karena keberadaan koma java juga akan berteriak jika kita berusaha mengkonversi data yang walopun sama-sama tidak memiliki koma tapi di luar jangkauan, sehingga akan ada informasi yang hilang. Misalnya,
byte a = 100 + 50;
Kode di atas akan menghasilkan error karena kita berusaha menjumlahkan dua data integer dan mengharapkan hasil berupa byte. Data byte hanya memiliki jangkauan dari -128 sampai 127, sedangkan hasil dari penjumlahan tersebut sebesar 150. Untuk membungkam Java biar ga teriak tinggal ditambahkan cast (byte).
byte a = (byte) (100 + 50);
/*
Walopun Java diem tapi hasil dari penjumlahan ini bukan 150 tapi -106, silakan dicoba
*/
Cast Operators juga digunakan untuk merubah data berupa objek dari superclass objek ke subclass objek agar kita bisa mengakses member dari objek subclass. Contoh,
class Kendaraan{
    int jumlahPintu;
    int jumlahRoda;
    String merek;

    public int getJumlahPintu(){
        return jumlahPintu;
    }

    public int getJumlahRoda(){
        return jumlahRoda;
    }

    public String getMerek(){
        return merek;
    }
}

class Mobil extends Kendaraan{
    double diameterRoda;

    public double getDiameterRoda(){
        return diameterRoda;
    }
}

class Motor {
    String jenisVelg;

    public String getJenisVelg(){
        return jenisVelg;
    }
}


class Application {
    public static void main (String[] args){
        Kendaraan kendaraan= new Kendaraan();
        kendaraan.getDiameterRoda();
        /*
         Baris di atas akan menghasilkan error karena objek kendaraan tidak memiliki akses terhadap method getDiameterRoda(). Untuk mendapatkan akses terhadap method tersebut kita perlu mengkonversi objek tersebut menjadi objek yang memiliki method tersebut, yaitu Mobil.
        */

        Mobil mobil = (Mobil) kendaraan;
        mobil.getDiameterRoda();

        Motor motor = (Motor) kendaraan;
        /*
         Konversi di atas tidak bisa dilakukan (error) karena class Motor bukan subclass dari (tidak meng-extends) class Kendaraan.
        */
    }
}

Sepertinya udah ya curhat saya soal  Cast Operators ini, semoga kalian ga neg sama uneg-uneg saya. hehehe

Terima kasih udah mau mampir baca uneg-uneg saya. Sampai ketemu lagi di curhatan berikutnya.

Bekerjasama Dengan Operator, Session 4: Bitwise Operators

Hallo semuanya, ketemu lagi dengan saya. Ga bosen ya? Saya aja udah bosen nih ngetik banyak bener, capek cui. Oke lah dilanjut deh, sekarang saya mau nyurhat masalah Bitwise Operator.


~Apaan tuh bitwise? Bit yang bijak?
*Mbuhlah saya juga ga ngerti maksudnya apa, yang jelas....
Operator bitwise terdiri dari bitwise AND (&), bitwise complement (~), bitwise exclusive OR (^), dan bitwise inclusive OR (|). Operator ini memanipulasi tiap-tiap bit kode binary yang merepresentasikan variable character atau integer. Mungkin itu kenapa operator ini dinamakan bitwise.
public class BitwiseOperators{
    byte a = 20;
    byte b = 4;
    byte c = 11;
 
    public static void main(String[] args) {
        System.out.println(~a); //Menghasilkan -21
        System.out.println(b & c); //Menghasilkan 0
        System.out.println(b ^ c); //Menghasilkan 15
        System.out.println(b | c); //Menghasilkan 15
    }
}
Variabel a merupakan data bertipe byte sehingga menggunakan memori sebesar 8 bit (lihat mengenai alokasi memori di sini), sehingga
(1). Variabel a yang memiliki nilai 20 memiliki representasi kode binary 00010100

00010100
0 x 27 0 x 26 0 x 25 1 x 24 0 x 23 1 x 22 0 x 21 0 x 20

0 + 0 + 0 + 16 + 0 + 4 + 0 + 0 = 20

(2). Variabel b yang memiliki nilai 4 memiliki representasi kode binary 00000100

00000100
0 x 27 0 x 26 0 x 25 0 x 24 0 x 23 1 x 22 0 x 21 0 x 20 

0 + 0 + 0 + 0 + 0 + 4 + 0 + 0 = 4

(3). Variabel c yang memiliki nilai 11 memiliki representasi kode binary 00001011

0 0 0 0 1 0 1 1
0 x 27 0 x 26 0 x 25 0 x 24 1 x 23 0 x 22 1 x 21 1 x 20

0 + 0 + 0 + 0 + 8 + 0 + 2 + 1 = 11

1. Bitwise Complement (~)

Baris kode pertama dalam method main di atas mencetak nilai complement dari a (~a) yang menghasilkan -21.
~Weh weh weh, kenapa bisa demikian?
*Bisa dong
Kode binary yang merepresentasikan ~a adalah kebalikan dari a, artinya 0 diganti dengan 1 dan 1 diganti dengan 0, sehingga kode binary yang merepresentasikan ~20 adalah 11101011, kebalikan dari 20 (00010100)

1 1 1 0 1 0 1 1
- (1 x 27) 1 x 26 1 x 25 0 x 24 1 x 23 0 x 22 1 x 21 1 x 20

-128 + 64 + 32 + 0 + 8 + 0 + 2 + 1 = -21

2. Bitwise AND (&)

Baris selanjutnya kita ingin mencetak bitwise AND (&) antara b dan c. Bitwise AND akan bekerja dengan mencocokan masing-masing bit data jika keduanya bernilai 1 maka akan menghasilkan 1 sedangkan jika selain itu akan menghasilkan nilai 0.

b = 00000100
c = 00001011
    ____________ &
      00000000

Maka nilai dari b & c atau 4 & 11 adalah 0.

3. Bitwise Exclusive OR (^)

Baris selanjutnya kita ingin mencetak bitwise exclusive OR (^) antara b dan c. Bitwise exclusive OR bekerja dengan mencocokan masing-masing bit data jika keduanya bernilai sama maka akan menghasilkan 0 sedangkan jika berbeda maka akan menghasilkan nilai 1.

b = 00000100
c = 00001011
    ____________ ^
      00001111

Maka nilai dari b ^ c atau 4 ^ 11 adalah 15.

4. Bitwise Inclusive OR (|)

Baris terakhir kita ingin mencetak bitwise inclusive OR (|) antara b dan c. Bitwise inclusive OR bekerja dengan mencocokan masing-masing bit data jika keduanya bernilai 0 maka akan menghasilkan 0 sedangkan jika selain itu akan menghasilkan nilai 1.

b = 00000100
c = 00001011
    ____________ |
      00001111

Maka nilai dari b | c atau 4 | 11 adalah 15.

Akhirnya kelar. Pusing ya? Saya yang nulis juga pusing nih. Ya sudah saya sudahi sesi curhat hari ini, sampai ketemu lagi di sesi berikutnya.

Bekerjasama Dengan Operator, Session 3: Assignment Operator

Hallo pembaca semuanya yang masih belum mual denger curhatan saya, berjumpa lagi dengan saya si programmer pemula yang masih berjuang pelan-pelan menjadi developer. Setelah kemaren ngecurhat sedikit tentang operator dan sudah masuk ke operator Additive Operator dan Array Index Operator sekarang saya mau membahas masalah Assignment Operator.


Assignment operator adalah operator sama dengan (=) yang berfungsi untuk meng-assign sebuah variabel dengan sebuah nilai. Misalnya int x = 4. Selain assignment sederhana seperti itu Java juga memiliki compound assignment untuk memudahkan operasi.

Jika kemaren sudah berkenalan dengan ++ dan -- yang hanya menjumlahkan variable dengan nilai 1. Maka compound assignment ini sebagai penolong jika kita tidak hanya ingin menjumlahkan variable dengan nilai 1, melainkan banyak. Compound assignment ditulis dengan += atau -=. Jika x++ adalah bentuk sederhana dari x = x + 1, maka x += y adalah bentuk sederhana dari x = x + y.

Woke kelar, cepet kan? Sampai jumpa lagi di curhatan berikutnya.

Bekerjasama Dengan Operator, Session 2: Array Index Operator

Hallo pembaca semuanya yang katanya budiman, berjumpa lagi dengan saya si programmer pemula yang ga lolos beasiswa buat kuliah (belum rejeki, hehehe). Setelah kemaren ngecurhat sedikit tentang operator dan sudah masuk ke operator pertama, yaitu Additive Operator, sekarang masuk ke operator yang ke-2, yaitu Array Index Operator.


~Mmmmmm
*Arep komen ngawur opo meneh?
~Ga jadi, hehehe
Array index operator berupa sepasang tanda kurung siku ([]), operator ini digunakan untuk memanggil element di dalam sebuah array.
public class ArrayIndexOperator{
    char[] huruf = {'A','B','C','D','E','F','G','H'};

    char c = huruf[2];//char c akan bernilai 'C'
}
Ingat bahwa index array dimulai dari 0. Sehingga huruf[2] akan memanggil nilai dari element array huruf nomor 3 yaitu C. Jika kita memanggil element yang diluar jangkauan element array akan menghasilkan ArrayIndexOutOfBoundsException. Contohnya array huruf di atas terdiri dari 8 huruf atau 8 element dimana elemetnya dari 0-7, maka jika kita memanggil huruf[8] akan menghasilkan ArrayIndexOutOfBoundsException. Exception akan dibahas nanti pada pembahasan khusus exception.

Sepertinya curhatan saya cukup sekian ya.
~Weh kok dikit kali?
*La wong ga ada yang mau dicurhatin lagi kok.
~Yoweslah
Oke sampai ketemu lagi di curhatan masalah kerjasama saya dengan operator jilid 3 mengenai Assignment Operators.