Monday, December 26, 2016

Bab 9. Soal & Penyelesaian Java


9
Paket dan Antarmuka






Bab ini akan mendiskusikan lewat soal dan penyelesaian tentang fitur Java yang paling inovatif: paket dan antarmuka. Paket merupakan kontainer bagi kelas-kelas yang dipakai untuk menjaga ruang nama (name space) tetap tersekat. Sebagai contoh, sebuah paket memampukan Anda untuk menciptakan sebuah kelas Universitas, yang dapat Anda simpan di dalam paket Anda sendiri tanpa perlu khawatir bahwa kelas itu akan berbenturan dengan kelas lain yang bernama Universitas yang disimpan di tempat lain.

Melalu penggunaan katakunci interface, Java memampukan Anda untuk memisahkan abstraksi dari implementasi. Dengan menggunakan interface, Anda dapat menetapkan sehimpunan metode yang dapat diimplementasikan oleh satu atau lebih kelas. Antarmuka itu sendiri tidak mendefinisikan implementasi apapun. Meskipun antarmuka mirip dengan kelas abstrak, antarmuka memiliki kapabilitas yang tidak dimiliki kelas abstrak: Sebuah kelas dapat mengimplementasikan lebih dari satu antarmuka. Sebaliknya, sebuah kelas hanya bisa mewarisi dari satu superkelas saja (baik superkelas abstrak atau konkrit).

Operator-Operator Aritmatik
1.       Tulislah sebuah program sederhana yang mengimplementasikan paket di dalam Java.

Penyelesaian

package paketKu;
class Saldo {
    String nama;
    double sal;

    Saldo(String n, double b) {
        nama = n;
        sal = b;
    }

    void tampil() {
        if(sal<0)
            System.out.print("--> ");
            System.out.println(nama + ": Rp. " + sal);
    }
}

public class SaldoAkun {
    public static void main(String args[]) {
        Saldo sekarang[] = new Saldo[3];

        sekarang[0] = new Saldo("RH. Sianipar", 50000.345);
        sekarang[1] = new Saldo("Vivian Siahaan", 125000.456);
        sekarang[2] = new Saldo("I Ketut Wiryajati", 345739.457);

        for(int i=0; i<3; i++) sekarang[i].tampil();
    }
}

Keluaran Program

RH. Sianipar: Rp. 50000.345
Vivian Siahaan: Rp. 125000.456
I Ketut Wiryajati: Rp. 345739.457

2.       Kelas dan paket keduanya merupakan cara mengenkapsulasi ruang nama dan skop dari variabel dan metode. Paket berperan sebagai kontainer untuk kelas dan paket turunan lain. Kelas berperan sebagai kontainer untuk data dan kode. Kelas merupakan unit abstraksi terkecil pada Java. Dari keterkaitan antara kelas dan paket, Java mengkategorikan visibilitas berikut:
·         Subkelas-subkelas di dalam paket yang sama
·         Selain subkelas di dalam paket yang sama
·         Subkelas-subkelas pada paket-paket berbeda
·         Selain subkelas atau selain kelas yang tidak berada di dalam paket yang sama.

Tabel berikut menyimpulkan interaksi ini.


Private
Tanpa Pemodifikasi
Protected
Public
Kelas yang sama
Ya
Ya
Ya
Ya
Subkelas pada paket yang sama
Tidak
Ya
Ya
Ya
Tak sub-kelas pada paket yang sama
Tidak
Ya
Ya
Ya
Subkelas pada paket berbeda
Tidak
Tidak
Ya
Ya
Tak subkelas pada paket berbeda
Tidak
Tidak
Tidak
Ya

Tulislah sebuah program untuk mengilustrasikan situasi seperti ini.

Penyelesaian

Ini adalah file Proteksi.java

package p1;

public class Proteksi {
    int n = 1;
    private int n_pri = 2;
    protected int n_pro = 3;
    public int n_pub = 4;

    public Proteksi() {
        System.out.println("konstruktor basis");
        System.out.println("n = " + n);
        System.out.println("n_pri = " + n_pri);
        System.out.println("n_pro = " + n_pro);
        System.out.println("n_pub = " + n_pub);
    }
}

Ini adalah file Terderivasi.java

package p1;

public class Terderivasi extends Proteksi {
    Terderivasi() {
        System.out.println("konstruktor terderivasi");
        System.out.println("n = " + n);

        // hanya untuk superkelas
        // System.out.println("n_pri = "4 + n_pri);
       
        System.out.println("n_pro = " + n_pro);
        System.out.println("n_pub = " + n_pub);
    }
}

Ini adalah file PaketSama.java

package p1;

public class PaketSama {
    PaketSama() {
        Proteksi p = new Proteksi();

        System.out.println("konstruktor paket sama");
        System.out.println("n = " + p.n);

        // hanya untuk superkelas
        // System.out.println("n_pri = " + p.n_pri);

        System.out.println("n_pro = " + p.n_pro);
        System.out.println("n_pub = " + p.n_pub);
    }
}

Ini adalah file Proteksi2.java

package p2;

public class Proteksi2 extends p1.Proteksi{
    Proteksi2() {
        System.out.println("konstruktor terderivasi pada paket lain");

        // hanya untuk superkelas atau paket sama
        // System.out.println("n = " + n);

        // hanya untuk superkelas
        // System.out.println("n_pri = " + n_pri);
       
        System.out.println("n_pro = " + n_pro);
        System.out.println("n_pub = " + n_pub);
    }
}

Ini adalah file PaketLain.java

package p2;

public class PaketLain {
    PaketLain() {
        p1.Proteksi p = new p1.Proteksi();
        System.out.println("konstruktor paket lain");

        // hanya untuk superkelas atau paket sama
        // System.out.println("n = " + p.n);

        // hanya untuk superkelas
        // System.out.println("n_pri = " + p.n_pri);

        // hanya untuk superkelas, subkelas, dan paket yang sama
        // System.out.println("n_pro = " + p.n_pro);

        System.out.println("n_pub = " + p.n_pub);
    }
}

Berikut adalah kode untuk menguji paket p1:

// Demo paket p1.
package p1;

// menginstansiasi pelbagai kelas di dalam paket p1.
public class DemoPaket1 {
    public static void main(String args[]) {
        Proteksi ob1 = new Proteksi();
        Terderivasi ob2 = new Terderivasi();
        PaketSama ob3 = new PaketSama();
    }
}

Keluaran Program

konstruktor basis
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
konstruktor basis
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
konstruktor terderivasi
n = 1
n_pro = 3
n_pub = 4
konstruktor basis
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
konstruktor paket sama
n = 1
n_pro = 3
n_pub = 4

Berikut adalah kode untuk menguji paket p2:

// Demo paket p2.
package p2;

// menginstansiasi pelbagai kelas di dalam paket p2.
public class DemoPaket2 {
    public static void main(String args[]) {
        Proteksi2 ob1 = new Proteksi2();
        PaketLain ob2 = new PaketLain();
    }
}

Keluaran Program

konstruktor basis
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
konstruktor terderivasi pada paket lain
n_pro = 3
n_pub = 4
konstruktor basis
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
konstruktor paket lain
n_pub = 4

3.       Tulislah sebuah program untuk mendemonstrasikan teknik dalam mengimpor paket pada Java.

Penyelesaian

package PaketKu;

/* Sekarang, kelas Saldo, konstruktornya, dan metode tampil() nya
   adalah public. Ini berarti bahwa ketiganya dapat dipakai
   oleh kode tak subkelas di luar paketnya.
*/
public class Saldo {
String nama;
    double sal;

    public Saldo(String n, double b) {
        nama = n;
        sal = b;
    }

    public void tampil() {
        if(sal<0)
            System.out.print("--> ");
            System.out.println(nama + ": Rp. " + sal);
    }
}

import PaketKu.*;

public class UjiSaldo {
    public static void main(String args[]) {
        /* Karena Saldo adalah public, Anda dapat menggunakan kelas Saldo
           dan memanggil konstruktornya. */

        Saldo test = new Saldo("RH. Sianipar", 99000.88);
        test.tampil(); // Anda juga dapat memanggil tampil()
    }
}

Keluaran Program

RH. Sianipar: Rp. 99000.88

4.       Ketika tidak ada penspesifikasi akses dicantumkan, maka akses menjadi default, dan antarmuka hanya tersedia untuk anggota-anggot pada paket yang sama. Ketika dideklarasikan public, antarmuka dapat dipakai oleh sembarang kode. Pada kasus ini, antarmuka merupakan satu-satunya antarmuka public di dalam file, dan file tersebut harus memiliki nama sama dengan antarmuka. Perhatikan bahwa tiap metode dideklarasikan tanpa tubuh di dalam antarmuka. Metode diakhiri oleh titik-koma setelah daftar parameter. Metode ini adalah metode abstrak. Setiap kelas yang mencantumkan antarmuka harus mengimplementasikan semua metode yang ada di dalam antarmuka. Variabel dapat dideklarasikan di dalam deklarasi antarmuka. Variabel tersebut secara implisit final dan static, yang berarti bahwa ia tidak dapat diubah oleh kelas pengimplementasi. Variabel tersebut juga harus diinisialisasi. Semua metode dan variabel di dalam antarmuka secara implisit adalah public.

Tulislah sebuah program yang menggunakan antarmuka.

Penyelesaian

public interface PanggilKembali {
    void panggilkembali(int param);
}

Ini merupakan kelas sederhana yang mengimplementasikan antarmuka PanggilKembali.

public class Klien implements PanggilKembali {
    // mengimplementasikan antarmuka PanggilKembali
    public void panggilkembali(int p) {
        System.out.println("panggilkembali dipanggil dengan " + p);
    }
}

Adalah diijinkan untuk kelas yang mengimplementasikan antarmuka untuk mendefinisikan anggota-anggotanya sendiri. Sebagai contoh, versi Klien berikut mengimplementasikan metode panggilkembali dan menambahkan metode metodeTakAntarmuka:

public class Klien implements PanggilKembali {
    // mengimplementasikan antarmuka PanggilKembali
    public void panggilkembali(int p) {
        System.out.println("panggilkembali dipanggil dengan " + p);
    }
   
    void metodeTakAntarmuka() {
        System.out.println("Kelas yang mengimplementasikan antarmuka " +
            "bisa juga mendefinisikan anggota-anggota lain.");
    }
}

Kode berikut memanggil metode panggilkembali melalui variabel referensi antarmuka:

public class UjiAntarmuka {
    public static void main(String args[]) {
        PanggilKembali c = new Klien();
        c.panggilkembali(42);
    }
}

Keluaran Program

panggilkembali dipanggil dengan 42

Kode berikut menciptakan implementasi kedua dari antarmuka PanggilKembali:

// implemantasi lain dari antarmuka PanggilKembali.
class KlienLain implements PanggilKembali {
    // mengimplementasikan antarmuka PanggilKembali
    public void panggilkembali(int p) {
        System.out.println("Versi lain dari panggilkembali");
        System.out.println("p dikuadrat adalah " + (p*p));
    }
}


public class UjiAntarmuka2 {
    public static void main(String args[]) {
        PanggilKembali c = new Klien();
        KlienLain ob = new KlienLain();

        c.panggilkembali(42);
        c = ob; // c sekarang menunjuk ke objek KlienLain
        c.panggilkembali(42);
    }
}

Keluaran Program

panggilkembali dipanggil dengan 42
Versi lain dari panggilkembali
p dikuadrat adalah 1764



5.       Tulislah sebuah program untuk mengilustrasikan antarmukan bersarang.

Penyelesaian

// Contoh antarmuka bersarang.
// Kelas ini memuat sebuah antarmuka anggota.
class A {
    // ini merupakan antarmuka bersarang
    public interface AntarmukaBersarang {
        boolean apaTidakNegatif(int x);
    }
}

// B mengimplementasikan antarmuka bersarang.
class B implements A.AntarmukaBersarang {
    public boolean apaTidakNegatif(int x) {
        return x < 0 ? false : true;
    }
}

class DemoAntarmukaBersarang {
    public static void main(String args[]) {
        // menggunakan referensi antarmuka bersarang
        A.AntarmukaBersarang nif = new B();

        if(nif.apaTidakNegatif(10))
            System.out.println("10 tidak negatif");

        if(nif.apaTidakNegatif(-12))
            System.out.println("ini tidak akan ditampilkan");
    }
}

Keluaran Program

10 tidak negatif

6.       Tulislah sebuah program aplikatif untuk mengimplementasikan tumpukan ukuran tetap menggunakan antarmuka.

Penyelesaian

// Sebuah implementasi dari AntarmukaTumpukan dengan penyimpanan tetap.
class TumpukanTetap implements AntarmukaTumpukan {
    private int tmpkan[];
    private int tos;

    // mengalokasikan dan menginisialisasi tumpukan
    TumpukanTetap(int ukuran) {
        tmpkan = new int[ukuran];
        tos = -1;
    }

    // Menempatkan sebuah item ke atas tumpukan
    public void push(int item) {
        if(tos==tmpkan.length-1) // menggunakan anggota length
            System.out.println("Tumpukan penuh.");
        else
            tmpkan[++tos] = item;
    }

    // Menghapus sebuah item dari tumpukan
    public int pop() {
        if(tos < 0) {
            System.out.println("Tumpukan kosong.");
            return 0;
        }
        else
            return tmpkan[tos--];
    }
}

public class UjiTumpukanTetap {
    public static void main(String args[]) {
        TumpukanTetap tumpukanKu1 = new TumpukanTetap(5);
        TumpukanTetap tumpukanKu2 = new TumpukanTetap(8);

        // menempatkan beberapa angka ke atas tumpukan
        for(int i=0; i<5; i++) tumpukanKu1.push(i);
        for(int i=0; i<8; i++) tumpukanKu2.push(i);

        // menghapus beberapa angka dari tumpukan
        System.out.println("Tumpukan pada tumpukanKu1:");
        for(int i=0; i<5; i++)
            System.out.println(tumpukanKu1.pop());
       
        System.out.println("Tumpukan pada tumpukanKu2:");
        for(int i=0; i<8; i++)
            System.out.println(tumpukanKu2.pop());
    }
}

Keluaran Program

Tumpukan pada tumpukanKu1:
4
3
2
1
0
Tumpukan pada tumpukanKu2:
7
6
5
4
3
2
1
0

7.       Tulislah sebuah program aplikatif untuk mengimplementasikan tumpukan ukuran dinamis menggunakan antarmuka.

Penyelesaian

// Sebuah implementasi dari AntarmukaTumpukan dengan penyimpanan dinamis.
class TumpukanDinamis implements AntarmukaTumpukan {
    private int tmpkan[];
    private int tos;

    // mengalokasikan dan menginisialisasi tumpukan
    TumpukanDinamis(int ukuran) {
        tmpkan = new int[ukuran];
        tos = -1;
    }

    // Menempatkan sebuah item ke atas tumpukan
    public void push(int item) {
        // jika tumpukan penuh, mengalokasikan tumpukan yang lebih besar
        if(tos==tmpkan.length-1) {
            int temp[] = new int[tmpkan.length * 2]; // menggandakan ukuran
            for(int i=0; i<tmpkan.length; i++) temp[i] = tmpkan[i];
                tmpkan = temp;
                tmpkan[++tos] = item;
        }
        else
            tmpkan[++tos] = item;
    }

    // Menghapus sebuah item dari tumpukan
    public int pop() {
        if(tos < 0) {
            System.out.println("Tumpukan kosong.");
            return 0;
        }
        else
            return tmpkan[tos--];
    }
}

public class UjiTumpukanDinamis {
    public static void main(String args[]) {
        TumpukanDinamis tumpukanKu1 = new TumpukanDinamis(5);
        TumpukanDinamis tumpukanKu2 = new TumpukanDinamis(8);

        // menempatkan beberapa angka ke atas tumpukan
        for(int i=0; i<12; i++) tumpukanKu1.push(i);
        for(int i=0; i<20; i++) tumpukanKu2.push(i);

        // menghapus beberapa angka dari tumpukan
        System.out.println("Tumpukan pada tumpukanKu1:");
        for(int i=0; i<12; i++)
            System.out.println(tumpukanKu1.pop());
       
        System.out.println("Tumpukan pada tumpukanKu2:");
        for(int i=0; i<20; i++)
            System.out.println(tumpukanKu2.pop());
    }
}

Keluaran Program

Tumpukan pada tumpukanKu1:
11
10
9
8
7
6
5
4
3
2
1
0
Tumpukan pada tumpukanKu2:
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0

8.       Tulislah sebuah program aplikatif untuk mengimplementasikan TumpukanTetap dan TumpukanDinamis melalui referensi antarmuka.

Penyelesaian

/* Menciptakan sebuah variabel antarmuka dan
   mengakses tumpukan melalui variabel itu.
*/
class UjiTumpukanKeduanya {
    public static void main(String args[]) {
        AntarmukaTumpukan tumpukanKu; // menciptakan variabel referensi antarmuka
        TumpukanDinamis ds = new TumpukanDinamis(5);
        TumpukanTetap fs = new TumpukanTetap(8);

        tumpukanKu = ds; // tumpukan dinamis
        // menempatkan beberapa angka ke atas tumpukan
        for(int i=0; i<12; i++) tumpukanKu.push(i);
       
        tumpukanKu = fs; // tumpukan tetap
        for(int i=0; i<8; i++) tumpukanKu.push(i);
       
        tumpukanKu = ds;
        System.out.println("Nilai-nilai pada tumpukan dinamis:");
        for(int i=0; i<12; i++)
            System.out.println(tumpukanKu.pop());

        tumpukanKu = fs;
        System.out.println("Nilai-nilai pada tumpukan tetap:");
        for(int i=0; i<8; i++)
            System.out.println(tumpukanKu.pop());
    }
}

Keluaran Program

Nilai-nilai pada tumpukan dinamis:
11
10
9
8
7
6
5
4
3
2
1
0
Nilai-nilai pada tumpukan tetap:
7
6
5
4
3
2
1
0

9.       Anda dapat menggunakan antarmuka untuk mengimpor konstanta-konstanta pada banyak kelas dengan mendeklarasikan sebuah antarmuka yang memuat variabel-variabel yang telah diinisialisasi dengan nilai-nilai yang diinginkan. Ketika Anda mencantumkan antarmuka tersebut di dalam sebuah kelas, maka semua nama variabel tersebut akan menjadi konstanta. (Ingat bahwa variabel yang dideklarasikan di dalam antarmuka secara implisit static dan final).

Penyelesaian

import java.util.Random;

interface KonstantaBersama {
    int TIDAK = 0;
    int YA = 1;
    int MUNGKIN = 2;
    int TIDAKTAHU = 3;
    int NANTI = 4;
    int TIDAKMAU = 5;
}

class Pertanyaan implements KonstantaBersama {
    Random rand = new Random();
    int bertanya() {
        int prob = (int) (100 * rand.nextDouble());
        if (prob < 30)
            return TIDAK; // 30%
        else if (prob < 60)
            return YA; // 30%
        else if (prob < 75)
            return TIDAKTAHU; // 15%
        else if (prob < 98)
            return NANTI; // 13%
        else
            return TIDAKMAU; // 2%
    }
}

class TanyaSaya implements KonstantaBersama {
    static void jawab(int hasil) {
        switch(hasil) {
            case TIDAK:
                System.out.println("Tidak");
                break;
            case YA:
                System.out.println("Ya");
                break;
            case MUNGKIN:
                System.out.println("Mungkin");
                break;
            case TIDAKTAHU:
                System.out.println("Tidak Tahu");
                break;
            case NANTI:
                System.out.println("Nanti");
                break;
            case TIDAKMAU:
                System.out.println("Tidak Mau");
                break;
        }
    }

    public static void main(String args[]) {
        Pertanyaan q = new Pertanyaan();

        jawab(q.bertanya());
        jawab(q.bertanya());
        jawab(q.bertanya());
        jawab(q.bertanya());
    }
}

Keluaran Program

Tidak
Ya
Ya
Tidak

10.    Suatu antarmuka dapat mewarisi dari antarmuka lain menggunakan katakunci extends. Tulislah suatu program untuk mengilustrasikan situasi ini.

Penyelesaian

// Satu antarmuka dapat mewariskan ke antarmuka lain.
interface A {
    void metode1();
    void metode2();
}

// B sekarang mencakup metode1() and metode2() -- dan menambahkan metode3().
interface B extends A {
    void metode3();
}

// kelas ini harus mengimplementasikan antarmuka A dan B
class KelasKu implements B {
    public void metode1() {
        System.out.println("Mengimplementasikan metode1().");
    }

    public void metode2() {
        System.out.println("Mengimplementasikan metode2().");
    }

    public void metode3() {
        System.out.println("Mengimplementasikan metode3().");
    }
}

class DemoPewarisanAntarmuka {
    public static void main(String arg[]) {
        KelasKu ob = new KelasKu();

        ob.metode1();
        ob.metode2();
        ob.metode3();
    }
}

Keluaran Program

Mengimplementasikan metode1().
Mengimplementasikan metode2().
Mengimplementasikan metode3().



















No comments:

Post a Comment