• Home
  • /
  • Java
  • /
  • Konsep Interface dan Implementasinya di Java

Konsep Interface dan Implementasinya di Java

 

Dalam Pemrograman Berorientasi Obyek (PBO), memungkinkan kita dapat membuat method yang sifatnya abstrak, atau belum terdefinisikan detilnya, di mana tujuannya adalah untuk menyederhanakan ide solusi dari permasalahan. Melalui konsep ini, kita bisa memikirkan secara global terlebih dahulu struktur dan karakteristik dari obyek, barulah kemudian dipikirkan detilnya.

Keberadaan method abstrak bisa terdapat dalam dua tempat, yaitu bisa terdapat dalam sebuah class, yang selanjutnya class tersebut disebut dengan class abstrak, dan juga bisa terdapat dalam sebuah interface.

Dari kedua hal di atas, apa perbedaan keduanya? Perbedaan dari keduanya adalah pada implementasinya. Pada class abstrak implementasinya hanya bisa di dalam pewarisan (inheritance), artinya semua method-method yang masih abstrak milik class abstrak hanya bisa diimplementasikan di subclass nya. Adapun pada interface, tidak. Method abstrak di dalam interface bisa diimplementasikan pada sembarang class.

Artikel ini akan membahas lebih detil tentang interface, karakteristiknya, dan bagaimana contoh penerapannya di Java.

Apa itu Interface?

Pengertian umum Interface dalam konsep PBO adalah sebuah modul yang berisi kumpulan deskripsi method-method. Dalam hal ini, method-method tersebut bersifat abstrak atau tidak memiliki body.

Keberadaan interface dalam sebuah kode program sebenarnya sifatnya hanyalah opsional saja. Namun, meskipun demikian interface ini memiliki kegunaan yaitu bisa berfungsi sebagai semacam validator keberadaan method yang dimiliki oleh sebuah class. Oleh karena itu, apabila sebuah class mengimplementasikan sebuah interface, maka akan terjadi semacam kontrak bahwa class tersebut harus mengoverriding dan menjabarkan detil semua method yang ada di dalam interface tersebut. Apabila tidak, maka class tersebut belum sempurna (error) atau dijadikan class abstrak.

Karakteristik Interface

Secara struktur, bentuk interface mirip dengan class, yaitu bisa memiliki atribut dan method. Namun perbedaannya adalah bahwa atribut yang ada di interface haruslah bersifat sebagai konstanta (sudah diassign dengan sebuah nilai), tidak boleh dalam bentuk deklarasi atribut saja. Selain itu, perbedaan lainnya adalah bahwa method yang ada dalam interface haruslah semuanya bersifat abstrak.

Berikut ini adalah contoh sebuah interface di Java.

public interface MyInterface {

    // konstanta
    public int MYCONST = 3;
    
    // method abstrak
    public void myMethod1();
    public void myMethod2();
}

Interface MyInterface di atas terdiri dari sebuah konstanta yaitu MYCONST yang nilainya sudah ditentukan, serta beberapa method yang bersifat abstrak yaitu myMethod1() dan myMethod2().

Setelah sebuah interface terdefinisikan seperti di atas, nantinya setiap class yang mengimplementasikan interface tersebut WAJIB untuk mengoverriding dan menjabarkan detil setiap method yang masih abstrak milik interface. Berikut ini adalah contohnya:

public class MyClass implements MyInterface {

    @Override
    public void myMethod1() {
        System.out.println("Hello");
    }

    @Override
    public void myMethod2() {
        System.out.println("Hello Juga");
    }
    
}

Class MyClass di atas mengimplementasikan interface MyInterface, oleh karenanya di dalam method tersebut harus ada method yang mengoverriding dan menjabarkan apa yang harus dilakukan di kedua method yang masih abstrak milik interface.

Apakah sebuah class bisa mengimplementasikan lebih dari satu interface? Ya.. Bisa.. Sebuah class bisa mengimplementasikan lebih dari satu interface. Apabila sebuah class mengimplementasikan lebih dari satu interface, maka class tersebut WAJIB untuk mengoverriding dan menjabarkan detil tiap method milik semua interface yang dia implementasikan tersebut. Berikut ini cara menyatakan sebuah class yang mengimplementasikan lebih dari satu interface.

public class MyClass implements MyInterface1, MyInterface2 {

     .
     .
     .
     .
}

Apakah kita bisa membuat sebuah obyek atau melakukan instansiasi dari sebuah interface? Tidak Bisa. Kita tidak bisa melakukan instansiasi dari sebuah interface. Hal ini disebabkan interface ini belumlah sempurna strukturnya, karena di dalamnya masih ada method abstrak. Demikian pula class abstrak, yang juga tidak bisa dilakukan instansiasi terhadapnya.

Studi Kasus Penerapan Interface

Setelah dipaparkan tentang apa itu interface, perbedaannya dengan class abstrak, dan karakteristiknya, pada bagian ini akan dibahas tentang studi kasus penerapannya.

Studi kasus yang diberikan adalah sebagai berikut:

Misalkan Anda diminta untuk membuat program Java tentang bangun datar. Terdapat 3 buah bangun datar, yaitu: persegi panjang, lingkaran, dan segitiga. Pada ketiga bangun datar tersebut, Anda diminta untuk menghitung luasnya. Selain itu, juga akan dihitung kelilingnya namun hanya pada persegi panjang dan lingkaran saja. Selain itu akan ditentukan juga simetri putar dan lipatnya, namun perhitungan simetri ini hanya pada persegi panjang dan lingkaran saja.

Berdasarkan studi kasus di atas, kita akan mencoba mencari ide penyelesaiannya dengan pendekatan interface dan class abstrak sekaligus, untuk melihat perbedaannya.

Dari kasus tersebut, kita coba buat ide penyelesaiannya dengan merancang UML struktur classnya sebagai berikut

Desain UML Struktur Class dan Interface

Dikarenakan topik projectnya tentang bangun datar, maka kita coba buat class BangunDatar terlebih dahulu. Sesuai kasusnya, pada setiap bangun datar kita diminta untuk menghitung luasnya. Oleh karenanya di dalam class BangunDatar kita buat method hitungLuas(). Namun karena formula perhitungan luas tiap bangun datar berbeda-beda, method ini kita jadikan abstrak saja. Di dalam class BangunDatar juga ada method tampilHasil() yang nanti akan digunakan untuk menampilkan output. Method ini juga dibuat abstrak karena nanti bentuk tampilan output dari tiap jenis bangun datar akan dibuat beda.

Selanjutnya dari kasus yang diberikan, terdapat 3 buah bangun datar yaitu: Lingkaran, Persegi Panjang, dan Segitiga. Oleh karena itu kita membuat 3 buah class untuk masing-masing bangun datar. Dalam tiap class kita buat atributnya masing-masing, seperti jejari dalam class Lingkaran, panjang dan lebar dalam class PersegiPanjang, serta alas dan tinggi pada class Segitiga. Dalam hal ini, ketiga class tersebut kita buat sebagai subclass dari BangunDatar, akibatnya di dalam tiap class tersebut WAJIB untuk mengoverriding dan menjabarkan formula hitung luas dari method hitungLuas() dari class BangunDatar.

Terkait dengan keliling, serta simetri putar dan lipatnya, oleh karena disebabkan tidak semua bangun datar ada perhitungan untuk hal itu, bisa kita jadikan sebagai interface. Dalam rancangan di atas, kita buat dua buah interface yaitu: Keliling, dan Simetri. Di setiap interface, kita buat method abstraknya seperti yang ada di UML. Nantinya kedua interface ini akan diimplementasikan ke dalam class PersegiPanjang dan Lingkaran saja. Sehingga kedua class ini WAJIB mengoverriding dan menjabarkan setiap method dari masing-masing interface.

Berdasarkan rancangan UML di atas, kita coba buat kode program Javanya.

// class 'Bangun Datar' 

public abstract class BangunDatar {
    public abstract double hitungLuas();
    public abstract void tampilHasil();
}
// interface 'Keliling'

public interface Keliling {
    public abstract double hitungKeliling();
}

// interface 'Simetri'

public interface Simetri {
    public abstract double hitungSimPutar();
    public abstract double hitungSimLipat();
}
// class 'PersegiPanjang'

public class PersegiPanjang extends BangunDatar implements Keliling, Simetri {

    // atribut
    public int panjang;
    public int lebar;

    // methods
    
    @Override
    public double hitungLuas(){
        return this.panjang * this.lebar;
    }

    @Override
    public double hitungKeliling(){
        return 2 * (this.lebar + this.panjang);
    }
    
    @Override
    public double hitungSimPutar(){
        return 2.0;
    }
    
    @Override
    public double hitungSimLipat(){
        return 2.0;
    }
    
    @Override
    public void tampilHasil(){
        System.out.println("Persegi Panjang");
        System.out.println("------------");
        System.out.println("Luasnya: " + this.hitungLuas());
        System.out.println("Kelilingnya: " + this.hitungKeliling());
        System.out.println("Sim. Lipat: " + this.hitungSimLipat());
        System.out.println("Sim. Putar: " + this.hitungSimPutar());
    }
    
}
// class 'Lingkaran'

public class Lingkaran extends BangunDatar implements Keliling, Simetri {

    // atribut
    public int jejari;
    
    // methods

    @Override
    public double hitungLuas(){
        return Math.PI * this.jejari * this.jejari;
    }
    
    @Override
    public double hitungKeliling(){
        return 2 * Math.PI * this.jejari;
    }
    
    @Override
    public double hitungSimPutar(){
        return Double.POSITIVE_INFINITY;
    }
    
    @Override
    public double hitungSimLipat(){
        return Double.POSITIVE_INFINITY;
    }
    
    @Override
    public void tampilHasil(){
        System.out.println("Lingkaran");
        System.out.println("------------");
        System.out.println("Luasnya: " + this.hitungLuas());
        System.out.println("Kelilingnya: " + this.hitungKeliling());
        System.out.println("Sim. Lipat: " + this.hitungSimLipat());
        System.out.println("Sim. Putar: " + this.hitungSimPutar());
    }
        
}
// class 'Segitiga'

public class Segitiga extends BangunDatar {

    // atribut
    public int alas;
    public int tinggi;
    
    // methods

    @Override
    public double hitungLuas(){
        return this.alas * this.tinggi / 2.0;
    }
    
    @Override
    public void tampilHasil(){
        System.out.println("Segitiga");
        System.out.println("------------");
        System.out.println("Luasnya: " + this.hitungLuas());
    }
}

Setelah kita berhasil membuat class-class di atas, dan juga interfacenya. Sekarang kita akan coba memanfaatkannya untuk diterapkan dalam perhitungan. Berikut ini contoh penerapannya di Main Class untuk beberapa bangun datar.

// Main Class

public class MainClass {
    public static void main(String[] args) {

        // hitung luas, keliling, dan simetri dari suatu lingkaran A dg r=19 satuan
        Lingkaran A = new Lingkaran();
        A.jejari = 19;
        A.tampilHasil();

        // hitung luas, keliling, dan simetri dari suatu persegi panjang B dg panjang=10 & lebar=5 satuan
        PersegiPanjang B = new PersegiPanjang();
        B.panjang = 10;
        B.lebar = 5;
        B.tampilHasil();

        // hitung luas dari segitiga C dg alas=12 & tinggi=8 satuan
        Segitiga C = new Segitiga();
        C.alas = 12;
        C.tinggi = 8;
        C.tampilHasil();
    }
}

Mudah bukan konsep interfacenya? Anda bisa mempelajari kembali konsep interface ini dalam bentuk video tutorial di bawah ini

Video Tutorial Konsep Interface di Java

atau jika ingin mempelajari studi kasus lainnya, masih seputar penerapan interface ini, bisa dilihat di Github.

Selamat belajar.. dan Happy Coding !! 😀


Assalaamu'alaikum.. aktivitas keseharian saya mengajar di Universitas Sebelas Maret, dengan matakuliah pemrograman dan basis data. Adapun bidang penelitian saya tentang computational thinking dan computer-aided learning.

Leave a Reply