Anda di halaman 1dari 13

LAPORAN PEMROGRAMAN BERORIENTASI OBYEK PERTEMUAN KE 7

Di Susun Oleh : Nama : Mohamad Hanafi Nim : 095410134 Jurusan : Teknik Informatika/Strata-1

LABORATORIUM TERPADU Sekolah Tinggi Manajemen Informatika dan Komputer


AKAKOM

Yogyakarta 2011

PERTEMUAN KE-7 KELAS ABSTRAK DAN INTERFACE

A. LISTING Terlampir B. PEMBAHASAN LISTING Membuat kelas abstract dan interface tentang Ekspresi wajah : Kelas abstract : public abstract class EkspresiWajah { public abstract String Gembira(); public abstract String Sedih(); public abstract String Marah(); } //menciptakan method untuk membuat kelas abstract yang pertama yaitu dalam ekpresi wajah dan mempunyai method Gembira, Sedih, Marah. Pada pengertian kelas abstract sendiri adalah kelas yang diimplementasikan secara parsial dan tujuannya untuk kenyamanan perancangan public class Wajah extends EkspresiWajah { private String bntkmata; private String bntkbibir; private String bntktelinga; private int lbrbibir; private String wrnmuka; public Wajah(){ bntkmata = ""; bntkbibir = ""; bntktelinga = ""; lbrbibir = 0; wrnmuka = ""; } //menciptakan sebuah subkelas (kelas turunan/anak) yang diwarisi pada Ekspresi wajah yang mempunyai atribut bentuk mata, bentuk bibir, bentuk telinga, lebar bibir, warna muka pada kelas wajah inilah method yang dideklarasikan pada kelas EkspresiWajah tersebut akan dibuat pada kelas Wajah ini. public Wajah(String bntkmata, String bntkbibir, String bntktelinga, int lbrbibir, String wrnamuka){ this.bntkmata = bntkmata; this.bntkbibir = bntkbibir; this.bntktelinga = bntktelinga; this.lbrbibir = lbrbibir; this.wrnmuka = wrnamuka; } //mendeklarisikan bisa dinamakan membuat konstruktor yang diinisiasikan untuk membedakan nilai prameter dan nilai atribut yang dipanggil pada program utama public void hasilg(){ System.out.println("Bentuk Mata = "+bntkmata); System.out.println("Bentuk Bibir = "+bntkbibir); System.out.println("Bentuk Telinga = "+bntktelinga); }

//untuk menampilkan pada method Gembira public void hasils(){ System.out.println("Warna Muka = "+wrnmuka); System.out.println("Lebar Bibir = "+lbrbibir); System.out.println("Bentuk Bibir = "+bntkbibir); } //untuk menampilkan pada method Sedih public void hasilm(){ System.out.println("Warna Muka = "+wrnmuka); System.out.println("Lebar Bibir = "+lbrbibir); System.out.println("Bentuk Mata = "+bntkmata); } //untuk menampilkan pada method Marah public String Gembira(){ return bntkmata + bntkbibir + bntktelinga; } //menciptakan method yang diikuti dengan jumlah atribut yang dimilikinya yaitu pada ekspresi wajah yang gembira. public String Sedih(){ return wrnmuka + lbrbibir + bntkbibir; } // menciptakan method yang diikuti dengan jumlah atribut yang dimilikinya yaitu pada ekspresi wajah yang Sedih. public String Marah(){ return wrnmuka + lbrbibir + bntkmata; } // menciptakan method yang diikuti dengan jumlah atribut yang dimilikinya yaitu pada ekspresi wajah yang Marah } //pada kelas wajah seumpama Cuma diisi dengan method Sedih program akan mengalami masalah disebabkan karena dalam kelas abstract terdapat method 3 oleh karena itu program akan kurang Pada kelas abstract Cuma bisa dideklarasikan kelas 3 saja yang berisi tentang kelas yang berisi method, kelas yang berisi atributnya, dan kelas yang berisi output dari programnya. public class outputWajah { public static void main(String[] hanafi){ EkspresiWajah w1 = new Wajah("agak sipit ", "Mengecil ", "Membulat ", 2, "Merah "); System.out.println("Ekspresi Wajah yang Gembira :"); System.out.println(" "+w1.Gembira()); System.out.println("Ekspresi Wajah yang Sedih :"); System.out.println(" "+w1.Sedih()); System.out.println("Ekspresi Wajah yang Marah :"); System.out.println(" "+w1.Marah()); } } //program inilah yang akan menampilkan hasil dari program yang telah dibuat 2 kelas tersebut pada pemanggilannya yaitu nama kelas abstrack yang pertama dan dikuti dengan obyeknya

dilanjutkan pembentukan obyek baru dan diteruskan dengan nama kelas abstract yang ke dua dan dalam kurung tersebut diisi sesuai dengan tipe data atribut yang dimilki programnya. Hasil outputnya :

Untuk Interface : public interface EkspresiWajahInterface { public abstract String Gembira(); public abstract String Sedih(); public abstract String Marah(); } //program ini hampir sama bisa dikatakan juga sama soalnya yang membedakannya adalah interfae dan kelas abstract yaitu menciptakan method untuk membuat kelas interface yang pertama yaitu dalam ekpresi wajah dan mempunyai method Gembira, Sedih, Marah Pada pengertian interface adalah protipe untuk kelas dan berguna ditinjau dari perspektif rancangan logis. public class WajahInterface implements EkspresiWajahInterface { private String bntkmata; private String bntkbibir; private String bntktelinga; private int lbrbibir; private String wrnmuka; public WajahInterface(){ bntkmata = ""; bntkbibir = ""; bntktelinga = ""; lbrbibir = 0; wrnmuka = ""; } //Menciptakan kelas dengan nama WajahInterface yang diwarisi pada EkspresiWajahInterface pada penurunan pewarisan bukan extends melainkan dengan implements karena interface adalah prototype, atau template untuk kelas maka kita harus mengimplementasikan interface agar menjadi kelas yang berguna. Mengimplementasikan interface serupa dengan menuruni dari kelas kecuali kita perlu mengimplementasikan semua metode yang didefinisikan di interface untuk mengimplementasikan interface kita menggunakan kata kunci implements public WajahInterface(String bntkmata, String bntkbibir, String bntktelinga, int lbrbibir, String wrnamuka){ this.bntkmata = bntkmata; this.bntkbibir = bntkbibir; this.bntktelinga = bntktelinga; this.lbrbibir = lbrbibir; this.wrnmuka = wrnamuka; } //mendeklarisikan bisa dinamakan membuat konstruktor yang diinisiasikan untuk membedakan nilai prameter dan nilai atribut yang dipanggil pada program utama

public void hasilg(){ System.out.println("Bentuk Mata = "+bntkmata); System.out.println("Bentuk Bibir = "+bntkbibir); System.out.println("Bentuk Telinga = "+bntktelinga); } //menampilkan output agar user tidak merasa bingung mana pada Ekpresi Wajah berdasarkan atributnya yaitu pada Gembira. public void hasils(){ System.out.println("Warna Muka = "+wrnmuka); System.out.println("Lebar Bibir = "+lbrbibir); System.out.println("Bentuk Bibir = "+bntkbibir); } //menampilkan output agar user tidak merasa bingung mana pada Ekpresi Wajah berdasarkan atributnya yaitu pada Sedih. public void hasilm(){ System.out.println("Warna Muka = "+wrnmuka); System.out.println("Lebar Bibir = "+lbrbibir); System.out.println("Bentuk Mata = "+bntkmata); } //menampilkan output agar user tidak merasa bingung mana pada Ekpresi Wajah berdasarkan atributnya yaitu pada Marah. public String Gembira(){ return bntkmata + bntkbibir + bntktelinga; } public String Sedih(){ return wrnmuka + lbrbibir + bntkbibir; } public String Marah(){ return wrnmuka + lbrbibir + bntkmata; } //program inilah yang akan dipanggil di program utamannya berdasarkan nama method yang dideklarasikan } public class outputWInter { public static void main(String[] hanafi){ EkspresiWajah w1 = new Wajah(" agak sipit ", " Mengecil ", " Membulat ", 2, " Merah "); System.out.println("Ekspresi Wajah yang Gembira :"); System.out.println(" "+w1.Gembira()); System.out.println("Ekspresi Wajah yang Sedih :"); System.out.println(" "+w1.Sedih()); System.out.println("Ekspresi Wajah yang Marah :"); System.out.println(" "+w1.Marah()); } } //program inilah yang akan menampilkan hasil dari program yang telah dibuat 2 kelas tersebut pada pemanggilannya yaitu nama Interface yang pertama dan dikuti dengan obyeknya dilanjutkan pembentukan obyek baru dan diteruskan dengan nama interface yang ke dua dan dalam kurung tersebut diisi sesuai dengan tipe data atribut yang dimilki programnya.

Yang membedakan kelas abstract dan Interface adalah deskripsi yang ada pada kelas abtract hampir serupa dengan interface serupa namun tidak sama. Kelas abstract adalah kelas yang diimplementasikan secara parsial Sedangkan interface adalah kebalikannya kelas abstract yang sepenuhnya tidak diimplementasikan Hasil outputnya :

C. TUGAS Pertemuan ke-8 yang membahas tentang THREAD Praktikum : Praktikum ke-1 : class PrintNameThread extends Thread { PrintNameThread(String name){ super(name); start(); } public void run(){ String name = getName(); for(int i=0; i<10; i++){ System.out.print(name); } } } public class Prak1 { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here PrintNameThread pnt1 = new PrintNameThread("A, "); PrintNameThread pnt2 = new PrintNameThread("B, "); PrintNameThread pnt3 = new PrintNameThread("C, "); PrintNameThread pnt4 = new PrintNameThread("D, "); } } Hasil outputnya :

Praktikum ke-2 : class PrintNameThread implements Runnable { Thread thread;

PrintNameThread(String name){ thread = new Thread(this, name); thread.start(); } public void run(){ String name = thread.getName(); for (int i=0; i<10; i++){ System.out.println(name); } } } public class Prak2 { public static void main (String[] hanafi){ new PrintNameThread("A"); new PrintNameThread("B"); new PrintNameThread("C"); new PrintNameThread("D"); } } hasil outputnya :

Praktikum ke-3 : class TwoStrings { synchronized static void print(String str1, String str2){ System.out.println(str1); try{ Thread.sleep(500); } catch (InterruptedException ie){ } System.out.println(str2); } } class PrintStringsThread implements Runnable { Thread thread; String str1, str2; public PrintStringsThread( String str1, String str2) { this.str1 = str1; this.str2 = str2; thread = new Thread(this); thread.start(); } public void run(){ TwoStrings.print(str1, str2); } }

public class Prak3 { public static void main (String[] hanafi){ new PrintStringsThread("Hello ", "there."); new PrintStringsThread("How are ", "you?"); new PrintStringsThread("Thank you ", "very much!"); } } Hasil outputnya :

Latihan : Mengubah program thread : class TwoStrings { synchronized static void print(String str1, String str2){ System.out.println(str1); try{ Thread.sleep(500); } catch (InterruptedException ie){ } System.out.println(str2); } } class PrintStringsThread implements Runnable { Thread thread; String str1, str2; public PrintStringsThread( String str1, String str2) { this.str1 = str1; this.str2 = str2; thread = new Thread(this); thread.start(); } public void run(){ TwoStrings.print(str1, str2); } } class PrintNameThread extends Thread { PrintNameThread(String name){ super(name); start(); } } public class Latihan1 { public static void main (String[] hanafi){ new PrintStringsThread("Hello ", "there."); new PrintStringsThread("How are ", "you?"); new PrintStringsThread("Thank you ", "very much!"); }

} Hasil outputnya :

Program dengan pengambilan uang di mesin ATM : public class Latihan2 { public Latihan2() { } public static void main (String[] hanafi){ Callme target = new Callme(); System.out.println("INI ADALAH SKENARIO PENGAMBILAN UANG DI MESIN ATM"); Panggil ob1 = new Panggil(target, "Masukkan Kartu"); Panggil ob2 = new Panggil(target, "Memilih Bahasa"); Panggil ob3 = new Panggil(target, "Masukkan NO. PIN"); Panggil ob4 = new Panggil(target, "Memilih menu Transaksi Lain"); Panggil ob5 = new Panggil(target, "Masukkan Nominal Angka yang akan di ambil"); try { ob1.t.join(); ob2.t.join(); ob3.t.join(); } catch (InterruptedException e){ System.out.println("Interrupted."); } } } class Callme{ void call (String msg){ System.out.println(msg); try{ Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Interrupted."); } } } class Panggil implements Runnable{ String msg; Callme target; Thread t; public Panggil(Callme newTarget, String s){ target = newTarget; msg = s; t = new Thread(this); t.start();

} public void run(){ synchronized(target){ target.call(msg); } } } Hasil outputnya :

Tugas : 1. Penjelasan tantang komunikasi antar Thread Methods untuk komunikasi Interthread public final void wait()Menyebabkan thread ini menunggu sampai thread yang lain memanggil notify ataunotifyAll method dari object ini. Hal ini dapat InterruptedException. public final void notify()Membangunkan thread yang telah memanggil method wait dari object yang sama. public final void notifyAll()Membangunkan semua thread yang telah memanggil method wait dari object yangsama. Programnya adalah sebagai berikut : public class Tugas { public Tugas() { } public static void main (String[] hanafi){ Callme target = new Callme(); Caller ob1 = new Caller(target, "Hello"); Caller ob2 = new Caller(target, "Belajar Thread"); Caller ob3 = new Caller(target, "Memang agak susah bener"); try { ob1.t.join(); ob2.t.join(); ob3.t.join(); } catch (InterruptedException e){ System.out.println("Interrupted."); } } } class Callme{ void call (String msg){ System.out.println(msg); try{ Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Interrupted."); } System.out.println("");

} } class Caller implements Runnable{ String msg; Callme target; Thread t; public Caller(Callme newTarget, String s){ target = newTarget; msg = s; t = new Thread(this); t.start(); } public void run(){ synchronized(target){ target.call(msg); } } } Hasil outputnya :

2. Perbedaan sinkronasi method dan objek Pada method : Sampai sejauh ini, Anda telah melihat contoh-contoh dari thread yang berjalan bersamasama tetapi tidak bergantung satu dengan yang lainnya. Thread tersebut adalah thread yang berjalan sendiri tanpa memperhatikan status dan aktifitas dari thread lain yang sedang berjalan. Pada contoh tersebut, setiap thread tidak membutuhkan resource atau method dari luar sehingga ia tidak membutuhkan komunikasi dengan thread lain. Pada objek : banyak thread dapat mengakses objek atau metode yang sama karena Thread bukan proses-proses independen yang memiliki ruang memori sendiri yang berisi kopian objek-objek data sendiri-sendiri. tidak ada jaminan Thread yang akan mengakses objek pada satu waktu tidak bertabrakan dengan Thread lain. D. PEMBAHASAN TUGAS Sebelum membahas tugasnya terlabih dahulu kita ketahui tentang apa yang dimaksud dengan Thread, Thread merupakan cara di java untuk menjalankan banyak bagian secara konkuren. Thread merupakan lightweight process yang tidak menghabiskan banyak overhead seperti proses normal. Thread thread tidak membuat kopian-kopian baru yang lengkap seperti intruksi fork() di UNIX sehingga memungkinkan aktiitas berlangsung lebih cepat. Threadthread dapat saling mengakses data. Pengaksesan memori bersama mempermudah komunikasi antar thread namun menibulkan permasalahan sinkronisasi pengaksesan data.banyak thread mungkin momodivikasi variabel yang sama yang seharusnya diantisipasi pemrogram. Kita dapat mengendalikan situasi ini dengan kata kunci synchrnized yang dapat dugunakan pada obyek atau metode serta menjamin hanya satu thread yang dapat mengeksekusi blok kode pada satu waktu. Program untuk tugasnya : public class Tugas {

public Tugas() { } public static void main (String[] hanafi){ Callme target = new Callme(); Caller ob1 = new Caller(target, "Hello"); Caller ob2 = new Caller(target, "Belajar Thread"); Caller ob3 = new Caller(target, "Memang agak susah bener"); //pembentukan sebuah kelas dan program utama yang menggunakan pemanggilan kelas pada method dan diikuti dengan obyeknya. try { ob1.t.join(); ob2.t.join(); ob3.t.join(); } // pada dalam exception try ada sebuah pemanggilan obyek pada program utama disini berfungsi manangkap thread yang nantinya akan dibolak-balikkan kalimat yang telah dituliskan pada programnya. Untuk metode join sendiri yaitu mempunyai arti misalkan kita mempunyai aplikasi yang melakukan komputasi berat dan melakukan suatu kerja lain sebelum komputasi. Kita dapat memecah komputasi menjadi Thread tersendiri, tapi kapankah kita mengetahui Thread telah selesai??? Itulah arti kita menggunakan metode join(). catch (InterruptedException e){ System.out.println("Interrupted."); } } } //Untuk exception InterruptedException yaitu menangap satu thread telah diinterupsi oleh thread lain. class Callme{ void call (String msg){ System.out.println(msg); try{ Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Interrupted."); } System.out.println(""); } } //metode yang menggunakan sleep yaitu menunggu selama suatu perode waktu sebelum berlanjut dan program memanggil Interrupe() di therad, interrupt flag di thread terpasang dan bergantung state Thread maka InterruptedException dilempar. Jika thread sedang sleeping dan metode interrupe() dipanggil di thread, metode sleep() akan melempar InterruptedException. Dalam kasus ini Thread keluar dari sleeping dan transaksi ke ready sehingga dapat di-dispatch dan mengolah Exception. class Caller implements Runnable{ String msg; Callme target; Thread t; public Caller(Callme newTarget, String s){ target = newTarget;

msg = s; t = new Thread(this); t.start(); } //program bertujuan yang hanya untuk memunculkan dan mempermainkan pada program utamannya sehingga inputan yang dimasukkan oleh seorang programmer akan dijalankan pada program ini dan diletakkan pada program utama. public void run(){ synchronized(target){ target.call(msg); } } } //kata kunci synchronized untuk mengunci objek saat mengeksekusi suat blok kode. Tidak ada Thread lain yang dapat mengubah obyek yang dispesifikasikan selama blok kode dieksekusi.