Kelompok 2 : Eka Satryawati Mohamad Sahlani Embun Fajar Wati Andrie Abrianto Dwi Wiratmoko (14000277) (14000341) (14000345) (14000348) (14000349) Pembahasan Konsep OOP Konsep UML Implementasi OOP at Java Materi : • • • • Paradigma berbasis obyek (objectoriented/OO) Mengapa OO ? Pemrograman OO Konsep-konsep dalam OOP Kelas dan obyek Mekanisme OO: encapsulation, inheritance, dan polymorphism OO Sebagai Paradigma Pemrograman • Paradigma pemrograman: pandangan mendasar terkait tentang formulasi sebuah solusi dalam bahasa pemrograman • Paradigma pemrograman menjelaskan tentang perspektif/pandangan pemrogram tentang program yang akan dibuatnya • Pemrograman berbasis obyek (OOP) mendasarkan pada konsep object dan interaksinya Konsep Object • Dalam paradigma berbasis object, “object” adalah representasi sebuah entitas yang memiliki makna tertentu yang menjadi perhatian si pemandang object memiliki abstraksi tertentu bagi si pemandang Contoh: dalam sistem akademik di kampus, beberapa kandidat object adalah: mahasiswa, dosen, kelas, mata kuliah, kurikulum, praktikum, laboratorium, perpustakaan, KRS, KHS, … • • Object dapat menerima pesan (message), mengolah data, dan mengirimkan pesan ke object lain membentuk interaksi antar object Object bersifat independen: tiap object dapat dipandang sebagai sebuah entitas mandiri yang memiliki peran atau tanggung jawab tertentu Object dan Interaksinya pembeli kasir pelayan pesan & bayar siapkan burger siapkan kentang siapkan minum sajikan Skenario: restoran cepat-saji Object dan Representasi Lingkup Permasalahan Object dan interaksinya dapat digunakan untuk merepresentasikan lingkup permasalahan Object merepresentasikan entitas-entitas yang dianggap penting dalam skenario permasalahan Interaksi antar object menggambarkan bentuk-bentuk relasi antar entitas di dalam skenario permasalahan OO sebagai tool untuk memodelkan sistem di dunia nyata setiap sistem selalu dapat digambarkan melalui object-object penyusunnya dan bagaimana objectobject tersebut saling berinteraksi Dalam software engineering: OO analysis OO design OO programming Kelebihan OO Sebagai Model Representasi Natural: mengikuti cara berpikir manusia (manusia memandang dunianya sebagai kumpulan object yang berinteraksi) Abstraksi: menjelaskan makna sebuah entitas secara cepat dan mudah Enkapsulasi: dapat menyembunyikan detil yang tidak perlu Modular: object adalah entitas yang independen Pemrograman dan Bahasa Pemrograman Berbasis OO Merealisasikan entitas-entitas object dalam desain software (OOD) dalam bahasa pemrograman Bahasa pemrograman berbasis object menyediakan mekanisme untuk bekerja dengan: kelas dan object methods inheritance polymorphism reusability Pemrograman dan Bahasa Pemrograman Berbasis OO Ragam bahasa pemrograman berbasis OO Bahasa OO “murni” semua diperlakukan secara konsisten mengikuti teori OO dan “memaksa” pemrogram mengikutinya. Contoh: Smalltalk, Eiffel, Ruby Bahasa yang dirancang untuk OOP, tetapi dengan beberapa elemen prosedural. Contoh: Java (program utama/entry point) Bahasa yang aslinya prosedural, tetapi kemudian ditambah fitur-fitur OO. Contoh: C++, Perl, PHP Konsep-Konsep dalam OOP: Kelas (Class) Mendefinisikan karakteristik abstrak dari sebuah entitas Property (statis) – fields, atribut Behaviour (dinamika) – fitur, methods Contoh: abstraksi “sepeda” memiliki property “punya roda”, “punya rantai”, dsb., dan behaviour “bisa berjalan”, “bisa berbelok”, dsb. Sebagai abstraksi dari sebuah entitas, definisi kelas harus mencerminkan karakteristik sebenarnya dari entitas tsb. Kelas Kelas merupakan “cetakan” (template) untuk instance (wujud nyata) entitas-entitas yang direpresentasikannya Sebuah kelas dapat melahirkan lebih dari satu instance satu template banyak instance (wujud nyata) Object Sebuah instance (perwujudan nyata) dari suatu kelas tertentu public class SegiEmpat { int panjang; int lebar; string warna; public SegiEmpat(string w, int p, int l) { panjang = p; lebar = l; warna = w; } } public setWarna (string w) { warna = w; } SegiEmpat sPink = new SegiEmpat(“pink”, 20,10); SegiEmpat sPutih = new SegiEmpat(“putih”, 15,10); SegiEmpat sOrange = new SegiEmpat(“orange”, 30,15); Definisi Kelas dan Object public class SegiEmpat { int panjang; int lebar; string warna; field, menunjukkan atribut/property public SegiEmpat(string w, int p, int l) { panjang = p; lebar = l; warna = w; } } public setWarna (string w) { warna = w; } constructor, untuk menciptakan object (instance) baru dengan property tertentu methods atau member functions, mendeskripsikan behaviour atau aktivitas yang bisa dijalankan SegiEmpat sPink = new SegiEmpat(“pink”, 20,10); memanggil constructor untuk membentuk object baru Enkapsulasi Enkapsulasi: lokalisasi fitur-fitur sebuah object (fields dan methods) dalam definisi object tersebut Enkapsulasi menyembunyikan property dan behaviour object dari pihak luar (object yang lain) object lain melihat object ini sebagai “black box” saja Enkapsulasi memisahkan antara bagian publik (yang bisa dilihat oleh pihak luar (object lain) dan bagian privat (internal object itu sendiri) dengan tegas fitur ini memberi keleluasaan/independensi untuk bekerja dengan aspek internal tanpa harus bergantung pada aspek publik/eksternal berguna untuk menangani berbagai persoalan interoperabilitas Enkapsulasi public class SegiEmpat { int panjang; int lebar; string warna; public SegiEmpat(string w, int p, int l) { panjang = p; lebar = l; warna = w; } } Pihak luar (object lain) melihat sPink sebagai sebuah “kotak hitam” yang tidak terlihat isinya, kecuali fields dan methods yang memang dideklarasikan secara publik public setWarna (string w) { warna = w; } SegiEmpat sPink = new SegiEmpat(“pink”, 20,10); sPink setWarna(string w) Object lain tidak bisa melihat apa yang dilakukan sPink secara internal Inheritance (Pewarisan Sifat) Dalam dunia OO, beberapa object memiliki sifat/ciri yang mirip dengan yang lain sebuah kelas object dapat didefinisikan dari kelas yang lain Kemiripan ini membentuk hubungan sifat yang bersifat hirarkis “pesawat penyergap adalah sebuah pesawat terbang yang dilengkapi dengan persenjataan dan dapat terbang melebihi kecepatan suara” ○ “pesawat penyergap” memiliki ciri yang sama dengan “pesawat terbang” “pesawat penyergap” mewarisi sifat “pesawat terbang” ○ “pesawat penyergap” memiliki ciri yang lebih khusus dibandingkan “pesawat terbang” “pesawat penyergap” adalah subclass dari “pesawat terbang” Dalam OOP, hubungan inheritance (pewarisan sifat) ini diimplementasikan melalui definisi kelas: sebuah kelas dapat didefinisikan dari kelas yang lain Inheritance “bentuk” poligon ellips persegi panjang lingkaran segitiga bujur sangkar Inheritance Dalam pohon hirarki inheritance, sebuah subclass mewujudkan abstraksi yang lebih spesifik dari superclassnya: subclass = superclass + (fitur-fitur baru) Subclass dapat menambahkan fields dan methods baru Subclass dapat mengambil alih (override) method milik superclass dan mengubah implementasi method tersebut Manfaat inheritance: Pemanfaatan kembali (reuse) kelas Menyediakan model yang bersifat generik (abstract class); implementasi spesifiknya bisa dilakukan kemudian (mungkin oleh pemrogram yang berbeda) Polymorphism Poly: banyak; morphism: bentuk sebuah fitur (generik) bisa diimplementasikan dengan berbagai cara Polymorphism diimplementasikan dengan mekanisme inheritance dan overriding hewan “bersuara” anjing “menggonggong” kucing “mengeong” kuda “meringkik” Sejarah Unified Modeling Language (UML) Tahun 1994, Grady Boch dan James Rumbaugh bergabung untuk menggunakan metode berorientasi objek. Ivan Jacobson bergabung pada tahun 1995, dan mereka bertiga fokus membuat suatu bahasa pemodelan objek standar sebagai ganti dari pendekatan atau metode objek standar. Berdasarkan kerja mereka dan hasil kerja lainnya pada industri, Unified Modeling Language (UML) versi 1.0 dirilis pada tahun 1997. Unified Modeling Language (UML) tidak menentukan metode untuk sistem-sistem pengembangan, tetapi sudah diterima luas sebagai standar untuk pemodelan objek. Object Management Gorup/OMG, badan standar industri, mengadopsi UML pada bulan November 1997 dan terus bekerja sama untuk meningkatkannya berdasarkan kebutuhan industri. Pada saat ini, salah satu industri telah merilis sebuah sofware yang mendukung UML yaitu Visual Paradigm 6.4 Interprise edition. Berbagai industri juga bermunculan dan mendukung penggunaan UML dengan berbagai produk, diantaranya Rational Rose, SmartDraw, dan lain-lain. Definisi Unified Modeling Language (UML) Unified Modeling Language (UML) merupakan satu kumpulan konvensi pemodelan yang digunakan untuk menentukan atau menggambarkan sebuah sistem software yang terkait dengan objek (Whitten L. Jeffery et al, 2004). Sementara menurut Henderi (2007: 4) Unified Modeling Language (UML) adalah sebuah bahasa pemodelan yang telah menjadi standar dalam industri software untuk visualisasi, merancang, dan mendokumentasikan sistem perangkat lunak. Bahasa Pemodelan UML lebih cocok untuk pembuatan perangkat lunak dalam bahasa pemrograman berorientasi objek (C+ , Java, VB.NET), namun demikiantetap dapat digunakan pada bahasa pemrograman prosedural (Ziga Turck, 2007) UML dan Implementasinya. Unified Modeling Language (UML) biasa digunakan untuk 1. Menggambarkan batasan sistem dan fungsi-fungsi sistem secara umum, dibuat dengan use case dan actor 2. Menggambarkan kegiatan atau proses bisnis yang dilaksanakan secara umum, dibuat dengan interaction diagrams 3. Menggambarkan representasi struktur statik sebuah sistem dalam bentuk class diagrams 4. Membuat model behavior ”yang menggambarkan kebiasaan atau sifat sebuah sistem” dengan state transition diagrams 5. Menyatakan arsitektur implementasi fisik menggunakan component and development diagrams 6. Menyampaikan atau memperluas fungsionality dengan stereotypes (Ziga Turck, 2007) UML dan Diagram-diagram use case diagram class diagram statechart diagram activity diagram sequence diagram collaboration diagram component diagram deployment diagram Use Case diagram Use case diagram menggambarkan fungsionalitas yang diharapkan dari sebuah sistem. Yangditekankan adalah “apa” yang diperbuat sistem, dan bukan “bagaimana”. Sebuah use case merepresentasikan sebuah interaksi antara aktor dengan sistem. Contoh : Use Case Diagram Class Diagram Class adalah sebuah spesifikasi yang jika diinstansiasi akan menghasilkan sebuah objek dan merupakan inti dari pengembangan dan desain berorientasi objek. Class menggambarkan keadaan (atribut/properti) suatu sistem, sekaligus menawarkan layanan untuk memanipulasi keadaan tersebut metoda/fungsi). Class diagram menggambarkan struktur dan deskripsi class, package dan objek beserta hubungan satu sama lain seperti containment, pewarisan, asosiasi, dan lain-lain. Class memiliki tiga area pokok : 1. Nama (dan stereotype) 2. Atribut 3. Metoda Nama Kelas Attribute Metoda Sifat dari Attribut dan Metoda Private, tidak dapat dipanggil dari luar class yang bersangkutan Protected, hanya dapat dipanggil oleh class yang bersangkutan dan anak-anak yang mewarisinya Public, dapat dipanggil oleh siapa saja Class dapat merupakan implementasi dari sebuah interface, yaitu class abstrak yang hanya memiliki metoda. Interface tidak dapat langsung iinstansiasikan, tetapi harus diimplementasikan dahulu menjadi sebuah class. Dengan demikian interface mendukung resolusi metoda pada saat run-time. Hubungan Antar Class 1. Asosiasi, yaitu hubungan statis antar class. Umumnya menggambarkan class yang memiliki atribut berupa class lain, atau class yang harus mengetahui eksistensi class lain. Panah navigability menunjukkan arah query antar class. 2. Agregasi, yaitu hubungan yang menyatakan bagian (“terdiri atas..”). 3. Pewarisan, yaitu hubungan hirarkis antar class. Class dapat diturunkan dari class lain dan mewarisi semua atribut dan metoda class asalnya dan menambahkan fungsionalitas baru, sehingga ia disebut anak dari class yang diwarisinya. Kebalikan dari pewarisan adalah generalisasi. 4. Hubungan dinamis, yaitu rangkaian pesan (message) yang dipassing dari satu class kepada class lain. Hubungan dinamis dapat digambarkan dengan menggunakan sequence diagram. Statechart Diagram Statechart diagram menggambarkan transisi dan perubahan keadaan (dari satu state ke state lainnya) suatu objek pada sistem sebagai akibat dari stimuli yang diterima. Pada umumnya statechart diagram menggambarkan class tertentu (satu class dapat memiliki lebih dari satu statechart diagram). Activity Diagram Activity diagrams menggambarkan berbagai alir aktivitas dalam sistem yang sedang dirancang, bagaimana masing-masing alir berawal, decision yang mungkin terjadi, dan bagaimana mereka berakhir. Activity diagram juga dapat menggambarkan proses paralel yang mungkin terjadi pada beberapa eksekusi. Activity diagram merupakan state diagram khusus, di mana sebagian besar state adalah action dan sebagian besar transisi di-trigger oleh selesainya state sebelumnya (internal processing). Oleh karena itu activity diagram tidak menggambarkan behaviour internal sebuah sistem (dan interaksi antar subsistem) secara eksak, tetapi lebih menggambarkan proses-proses dan jalur-jalur aktivitas dari level atas secara umum. Sequence Diagram Sequence diagram menggambarkan interaksi antar objek di dalam dan di sekitar sistem (termasuk pengguna, display, dan sebagainya) berupa message yang digambarkan terhadap waktu. Sequence diagram terdiri atar dimensi vertikal (waktu) dan dimensi horizontal (objek-objek yang terkait). Sequence diagram biasa digunakan untuk menggambarkan skenario atau rangkaian langkah-langkah yang dilakukan sebagai respons dari sebuah event untuk menghasilkan output tertentu. Diawali dari apa yang men-trigger aktivitas tersebut, proses dan perubahan apa saja yang Masing-masing objek, termasuk aktor, memiliki lifeline vertikal. Message digambarkan sebagai garis berpanah dari satu objek ke objek lainnya. Pada fase desain berikutnya, message akan dipetakan menjadi operasi/metoda dari class. Activation bar menunjukkan lamanya eksekusi sebuah proses, biasanya diawali dengan diterimanya sebuah message. Untuk objek-objek yang memiliki sifat khusus, standar UML mendefinisikan icon khusus untuk objek boundary, controller dan persistent entity. Langkah-Langkah Penggunaan UML Berikut ini adalah tips pengembangan piranti lunak dengan menggunakan UML: 1. Buatlah daftar business process dari level tertinggi untuk mendefinisikan aktivitas dan proses yang mungkin muncul. 2. Petakan use case untuk tiap business process untuk mendefinisikan dengan tepat fungsionalitas yang harus disediakan oleh sistem. Kemudian perhalus use case diagram dan lengkapi dengan requirement, constraints dan catatan-catatan lain. 3. Buatlah deployment diagram secara kasar untuk mendefinisikan arsitektur fisik sistem. 4. Definisikan requirement lain (non-fungsional, security dan sebagainya) yang juga harus disediakan oleh sistem. 5. Berdasarkan use case diagram, mulailah membuat 6. Definisikan objek-objek level atas (package atau domain) dan buatlah sequence dan/atau collaboration diagram untuk tiap alir pekerjaan. Jika sebuah use case memiliki kemungkinan alir normal dan error, buatlah satu diagram untuk masing-masing alir. 7. Buarlah rancangan user interface model yang menyediakan antarmuka bagi pengguna untuk menjalankan skenario use case. 8. Berdasarkan model-model yang sudah ada, buatlah class diagram. Setiap package atau domain dipecah menjadi hirarki class lengkap dengan atribut dan metodanya. Akan lebih baik jika untuk setiap class dibuat unit test untuk menguji fungsionalitas class dan interaksi dengan class lain. 9. Setelah class diagram dibuat, kita dapat melihat kemungkinan pengelompokan class menjadi komponen-komponen. Karena itu buatlah component diagram pada tahap ini. Juga, definisikan tes integrasi untuk setiap komponen meyakinkan ia berinteraksi dengan baik. 10. Perhalus deployment diagram yang sudah dibuat. Detilkan kemampuan danrequirement piranti lunak, sistem operasi, jaringan, dan sebagainya. Petakan komponen ke dalam node. 11. Mulailah membangun sistem. Ada dua pendekatan yang dapat digunakan : • Pendekatan use case, dengan meng-assign setiap use case kepada tim pengembang tertentu untuk mengembangkan unit code yang lengkap dengan tes. • Pendekatan komponen, yaitu meng-assign setiap komponen kepada tim pengembang tertentu. 12. Lakukan uji modul dan uji integrasi serta perbaiki model berserta codenya. Model harus selalu sesuai dengan code yang aktual. 13. Piranti lunak siap dirilis. Tool Yang Mendukung UML Saat ini banyak sekali tool pendesainan yang mendukung UML, baik itu tool komersial maupun opensource. Beberapa diantaranya adalah: • Rational Rose (www.rational.com) • Together (www.togethersoft.com) • Object Domain (www.objectdomain.com) • Jvision (www.object-insight.com) • Objecteering (www.objecteering.com) • MagicDraw (www.nomagic.com/magicdrawuml) • Visual Object Modeller (www.visualobject.com) Data seluruh tool yang mendukung UML, lengkap beserta harganya (dalam US dolar) bisa anda pelajari di situs http://www.objectsbydesign.com/tools/umltools_byCompan y.html . Disamping itu, daftar tool UML berikut fungsi dan perbangingan kemampuannya juga dapat dilihat di http://www.jeckle.de/umltools.htm. Pengenalan Java Java menurut definisi dari Sun Microsystem adalah nama untuk sekumpulan teknologi yang membuat perangkat lunak dan menjalankan perangkat lunak pada komputer standalone ataupun pada lingkungan jaringan. Java2 adalah generasi kedua dari Java platform. Java berdiri di atas sebuah mesin intepreter yang diberi nama Java Virtual Machine (JVM). JVM inilah yang akan membaca bytecode dalam file .class dari suatu program sebagai representasi langsung program yang berisi bahasa mesin. Oleh karena itu bahasa Java disebut sebagai bahasa pemrograman yang portable, karena dapat dijalankan pada berbagai sistem operasi, asalkan pada sistem operasi tersebut Platform Java Platform Java terdiri dari sekumpulan library, compiler, debugger dan alat lain yang dipaket dalam Java Development Kit (JDK). Java 2 adalah generasi yang sekarang sedang berkembang dari platform Java. Agar sebuah program Java dapat dijalankan, maka file dengan ekstensi .java harus dikompilasi menjadi file bytecode. Untuk menjalankan file byte-code tersebut dibutuhkan JRE (Java Runtime Environment) yang memungkinkan pemakai untuk menjalankan program Java, hanya menjalankan tidak membuat kode baru lagi. JRE terdiri dari JVM dan library Java yang digunakan. 3 Buah Edisi Java : J2EE (Java 2 Enterprise Edition) J2SE (Java 2 Second Edition) J2ME (Java 2 Micro Edition) J2EE (JAVA 2 ENTERPRISE EDITION) J2EE adalah kelompok dari beberapa API (Application Programming Interface) dari Java dan teknologi selain Java. J2EE dirancang untuk membuat aplikasi yang rumit. J2EE sering dianggap sebagai middle-ware atau teknologi yang berjalan di server, namun sebenarnya J2EE tidak hanya terbatas untuk itu. Faktanya J2EE juga mencakup teknologi yang dapat digunakan di semua lapisan dari sebuah sistem informasi. Implementasi J2EE menyediakan kelas dasar dan API dari Java yang mendukung pengembangan dan rutin standard untuk aplikasi client maupun server, termasuk aplikasi yang berjalan di web browser. J2SE (JAVA 2 SECOND EDITION) J2SE adalah inti/ dasar dari bahasa pemrograman Java. JDK (Java Development Kit) adalah salah satu tool dari J2SE untuk mengkompilasi dan menjalankan program Java. Tool J2SE yang salah satunya adalah JDK 1.5 dapat diunduh pada http://java.sun.com/j2se/, dimana JDK merupakan tool open source dari Sun. J2ME (JAVA 2 MICRO EDITION) J2ME adalah lingkungan pengembangan yang dirancang untuk meletakan perangkat lunak Java pada barang elektronik beserta perangkat pendukungnya. Pada J2ME, jika perangkat lunak berfungsi baik pada sebuah perangkat, maka belum tentu juga berfungsi baik pada perangkat yang lainnya. J2ME membawa Java ke dunia informasi, komunikasi, dan perangkat komputasi selain perangkat komputer desktop yang biasanya lebih kecil dibandingkan perangkat komputer desktop. J2ME biasa digunakan pada telepon selular, pager, personal digital assistants (PDA) dan sejenisnya. J2ME adalah bagian dari J2SE, karena itu tidak semua librabry yang ada pada J2SE dapat digunakan pada J2ME. Tetapi J2ME mempunyai beberapa library khusus yang tidak dimiliki J2SE. Arsitektur J2ME dapat dilihat seperti pada gambar berikut ini Teknologi J2ME juga memiliki beberapa keterbatasan, terutama jika diaplikasikan pada ponsel. J2ME sangat tergantung pada perangkat (device) yang digunakan, bisa dari segi merek ponsel dan dukungan terhadap teknologi J2ME. Misalnya, jika sebuah ponsel tidak memiliki kamera, maka jelas J2ME pada ponsel tersebut tidak dapat mengakses kamera. Keterbatasan lainnya adalah pada ukuran aplikasi, karena memori pada ponsel sangat terbatas. Sebagian ponsel tidak mengijin-kan aplikasi J2ME menulis pada file, karena alasan keamanan. Configuration merupakan Java Library minimum dan kemampuan yang dimiliki oleh para pengembang J2ME, maksudnya adalah sebuah moblile device dengan kemampuan Java akan dioptimalkan agar sesuai. Configuration hanyalah mengatur hal-hal tentang kesamaan sehingga dapat dijadikan ukuran kesesuaian antar device. Misalnya sebuah lampu sepeda dapat digunakan oleh berjenis-jenis sepeda. Dalam J2ME telah didefinisikan dua buah konfigurasi yaitu : CLDC (Connected Limited Device Configuration) Untuk perangkat kecil. CDC (Connected Device Configuration) Untuk perangkat yang lebih besar. Profile berbeda dengan configuration, profile membahas sesuatu yang spesifik untuk sebuah perangkat. Sebagai contoh misalnya, sebuah sepeda dengan merek tertentu tentu mempunyai ciri spesifik dari sepeda lainnya. Dalam J2ME terdapat dua buah profile yaitu MIDP (Mobile Information Device Profile) dan Foundation Profile. Keterhubungan antara configuration dan profile yang ada pada J2ME beserta jenis mesin virtualnya dapat dilihat pada gambar dibawah ini. CLDC (Connected Limited Device Configuration) adalah perangkat dasar dari J2ME berupa library dan API yang diimplementasikan pada J2ME, seperti yang digunakan pada telepon selular, pager dan PDA. Perangkat tersebut sangat terbatas pada memori, sumber daya dan kemampuan memproses. Spesifikasi CLDC pada J2ME adalah spesifikasi minimal dari package, kelas, dan sebagian fungsi JVM yang dikurangi agar dapat diimplemen-tasikan dengan keterbatasan sumber daya pada alat-alat tersebut. JVM yang digunakan disebut KVM (Kilobyte Virtual Machine). CDC (Connected Device Configuration) merupakan komunitas proses pada Java yang memiliki standardisasi. CDC terdiri dari virtual machine dan library dasar untuk dipergunakan pada profile industri. Implementasi CDC pada J2ME adalah source code yang menyediakan sambungan dengan macam-macam platform. Perbandingan antara CLDC dengan CDC sebagai berikut : MIDP (Mobile Information Device Profile) adakal spesifikasi untuk sebuah profil J2ME. MIDP memiliki lapisan di atas CLDC, API tambahan untuk daur hidup aplikasi, antarmuka, jaringan, dan penyimpan-an persisten. Pada saat ini terdapat MIDP 1.0 dan MIDP 2.0, fitur tambahan pada MIDP 2.0 adalah terdapat API untuk multimedia, terdapat dukungan memainkan tone, tone sequence, dan file WAV walaupun tanpa adanya Mobile Media API (MMAPI). KVM (Kilobyte Virtual Machine) adalah paket JVM yang dirancang untuk perangkat yang kecil. KVM mendukung sebagian dari fiturfitur JVM, tidak mendukung operasi floatingpoint dan finalisasi objek. KVM diimplementasikan dengan menggunakan C, sehingga sangat mudah beradaptasi pada tipe platform yang berbeda CVM (C-Virtual Machine) adalah paket JVM yang digunakan pada CDC. CVM mempunyai seluruh fitur-fitur dari virtual machine yang dirancang untuk perangkat yang memerlukan fitur-fitur Java 2 Virtual Machine. MIDlet adalah aplikasi yang ditulis untuk MIDP. Aplikasi MIDlet adalah bagian dari kelas javax.microedition.midlet. MIDlet yang didefinisikan pada MIDP. MIDlet berupa sebuah kelas abstrak yang merupakan sub kelas dari bentuk dasar aplikasi sehingga antaramuka antara aplikasi J2ME dan aplikasi manajemen pada perangkat dapat terbentuk. JAD (Java Application Descriptor) digunakan untuk mendeskripsikan isi aplikasi untuk keperluan pemetaan. File JAD bersisi deskripsi file JAR (Java Archive) dan pemetaan atribut MIDlet, sedangkan file JAR berisi kumpulan kelas dan resource. OTA (Over The Air) mengacu pada beberapa teknologi jaringan tanpa kabel. Dengan menggunakan OTA, provider MIDlet dapat menginstal MIDlet pada web server dan menyediakan link untuk mengunduh via WAP atau internet microbrowser. J2ME WTK (J2ME Wireless Tool Kit) adalah alat yang menyediakan lingkungan emulator, dokumentasi, beserta contoh-contoh aplikasi Java untuk perangkat kecil (small device). J2ME WTK berbasiskan pada CLDC dan MIDP. J2ME WTK adalah program yang meniru kerja ponsel yang mendukung MIDP atau yang biasa disebut emulator. Oleh karena itu, belum tentu MIDlet yang berjalan di emulator juga berjalan pada ponsel yang sebenarnya, karena juga tergantung pada kemampuan dan kapasitas ponsel yang digunakan. Untuk memulai Implementasi OOP di Java apakah yang harus di persiapkan…???? Pastikan sebuah Platform Java seperti Java Development Kit (JDK). Dan Edisi-edisi yang sudah di sediakan oleh Java itu sendiri, seperti : J2EE (Java 2 Enterprise Edition) J2SE (Java 2 Second Edition) J2ME (Java 2 Micro Edition) NetBeans 6.7.1 Modul UML (Free Download Plugin UML) Sudah terinstall dengan baik. Design UML Langkah-langkah pembuatan : Pilih New Project pada Menu Bar pilih UML pada Choose Project Categories Pada Project pilih Java Platform Model Berikan nama pada Project Name tentukan Project Location dimana project ini akan disimpan pada Folder yang sudah kita tentukan sebelumnya untuk memudahkan kita dalam pencarian, contoh : D:\LatJava Kemudian, akan tampil gambar berikut : Pilih Class Diagram pada Diagram Type karena memang pada latihan ini kita menggunakan sebuah kelas diagram untuk mengimplementasikan sedangkan untuk pemahaman UML sendiri kita bisa mempelajari pada buku yang membahas UML Berikan nama pada Diagram Name contoh : BangunRuangClassDiagram klik Finish untuk menyelesaikan pembuatan Class Diagram Pilih sebuah Class Interface pada Menu Palette Drag pada Class Interface Drop pada lingkungan kerja kita atur pada properties atau double klik pada objek class name pada Class Interface untuk memberikan nama pada Class tersebut seperti yang terlihat pada gambar dibawah ini Klik kanan pada Class Interface pilih Create Operation Interface ini kita beri nama BangunRuang2Dimensi yang terdiri dari objek Segitiga, Segiempat, dan Lingkaran Membuat Class Diagram Segitiga : klik pada Menu Palette pilih Class Diagram lakukan Drag & Drop pada objek tersebut Beri nama pada objek tersebut Segitiga klik kanan pada objek pilih Create Attribute (berupa Alas dan Tinggi) hilangkan kata int unnamed ganti dengan double Alas dan Tinggi Klik pada objek SegiTiga sehingga tampil menu disamping objek yang kita pilih pilih implementation pada saat meng-klik tahan dan tarik objek tersebut sampai menyentuh sebuah objek Bangun Ruang 2Dimensi Selanjutnya buat sebuah objek baru yaitu Prisma Pada Class Prisma kita hanya membutuhkan attribute Tinggi Prisma (Polymorfisme) Untuk Alas dan Tinggi kita bisa ambil attribute tersebut pada kelas Segitiga dengan cara : klik pada objek Prisma akan muncul menu di samping kanan objek pilih Generalization Klik button OK Drag & Drop Package pada Menu Palette berikan nama pada Package dengan BangunRuangUAS klik pada objek Package Package adalah sebuah kontainer atau kemasan yang dapat digunakan untuk mengelompokkan kelas- kelas (dan juga interface-interface) yang terkait (karena jenisnya/fungsinya/alasan lain), sehingga memungkinkan beberapa kelas yang bernama sama disimpan dalam package yang berbeda. Klik pada Containment lakukan koneksi dari masing-masing objek dengan cara mengklik Containment hubungkan dengan semua objek yang ada Membangun Aplikasi Java Console Aplikasi yang dijalankan dengan Command Line Interface Langkah-langkah pembuatan : Klik pada Menu Bar klik File pilih New Project pilih Java pada menu Choose Project pilih Java Application pada Project tekan tombol Next Buatlah nama project sesuai dengan nama UML Bangun Ruang, contoh : BangunRuang klik Finish Lakukan proses Generate Code dengan cara klik kanan pada Mouse arahkan pada Bangun Ruang Package pada UML klik tombol OK Ubahlah listing program yang sudah di generate seperti operations / method pada gambar PrismaSegitiga.java Segitiga.java attribute Super : fungsi ini menunjukan bahwa setiap Class yang mengacu pada Class yang lain dan dianggap bahwa Class tersebut adalah sebagai Class yang menurunkan sifat Super.getLuas() : fungsi ini mengambil perhitungan luas dari segitiga karena generalization. Operations/method adalah instruksi pemrosesan yang menjadi bagian dari objek. Attribute adalah sesuatu yang dimiliki oleh objek. Source Code pada Class Main package bangunruang; public class Main { public static void main(String[] args) { Constructor Instance / object Segitiga segi3 = new Segitiga(); //pemanggilan class segi3.setAlas(10); //pemanggilan method segi3.setTinggi(20); System.out.println("===========Segitiga================"); System.out.println("Lebar : " + segi3.getAlas)); System.out.println("Panjang : " + segi3.getTinggi()); System.out.println("Luas : " + segi3.getLuas()); System.out.println("Keliling : " + segi3.getKeliling()); System.out.println("===========End Segitiga============="); PrismaSegitiga prisma = new PrismaSegitiga(); prisma.setAlas(40); prisma.setTinggi(50); prisma.setTinggiPrisma(20); System.out.println("=========Prisma Segitiga============"); System.out.println("Lebar Balok : "+ prisma.getAlas()); System.out.println("Panjang Balok : "+ prisma.getTinggi()); System.out.println("Tinggi Balok : "+ prisma.getTinggiPrisma()); System.out.println("Valume Balok : "+ prisma.getVolume()); System.out.println("========End Prisma Segitiga========="); //Constructor : nama sama dengan kelas tetapi tidak mengembalikan nilai //Instance Prisma Segitiga Ke Segitiga Metode Pholymorphisme //Maka nilai Tinggi and Method getVolume akan hilang //Dari bawah ke atas bisa Class Segitiga segi3_2 = new PrismaSegitiga(); segi3_2.setAlas(60); segi3_2.setTinggi(70); System.out.println("=========Segitiga dari Prisma Baru==========="); System.out.println(“Alas : " + segi3_2.getAlas()); System.out.println(“Tinggi : " + segi3_2.getTinggi()); System.out.println("Luas : " + segi3_2.getLuas()); System.out.println("Keliling : " + segi3_2.getKeliling()); System.out.println("=======End Segitiga dari Prisma Baru ========="); //atau instance prisma segitiga di samakan dengan instance segitiga //dari segitiga dan prisma segitiga //segi3_2 =blk; //cara pemaksaan //casting menyerupakan, pemaksaan tapi lebih sopan segi3_2 = (Segitiga)prisma; System.out.println("=========Segitiga Instance dari Prisma========="); System.out.println(“Alas = " + segi3_2.getAlas()); System.out.println(“Tinggi = " + segi3_2.getTinggi()); System.out.println("Luas = " + segi3_2.getKeliling()); System.out.println("Keliling = " + ssegi3_2.getLuas()); System.out.println("=====End Segitiga Instance dari Prisma========="); //Polimorphisme dengan menggunakan Implement //dari Segitiga ke 2D BangunRuang2DInt bangun2DInt = new Segitiga(); BangunRuang2DInt bangun2DInt2 = segi3; BangunRuang2DInt bangun2DInt3 = new PrismaSegitiga(); BangunRuang2DInt bangun2DInt4 = prisma; System.out.println("=========Interface 2D dari Segitiga========"); System.out.println("Luas : " + bangun2DInt2.getLuas()); System.out.println("Keliling : " + bangun2DInt2.getKeliling()); System.out.println("=======End Interface 2D dari Segitiga ======"); //dari Balok ke 3D BangunRuang3DInt bangun3DInt = new PrismaSegitiga(); BangunRuang3DInt bangun3DInt2 = prisma; //casting BangunRuang3DInt bangun3Dint2a = (BangunRuang3DInt)prisma; System.out.println("=========Interface Balok ke 3D==========="); System.out.println("Volume Balok : " + bangun3DInt2.getVolume()); System.out.println("=======End Interface Balok ke 3D ========="); /*Tidak bisa * BangunRuang3DInt bangun3Dint2 = segi3; * PrismaSegitiga prisma = new Segitiga(); */ } } Membangun Aplikasi Java Desktop Aplikasi yang dijalankan dalam bentuk GUI (Graphical User Interface) Langkah-langkah pembuatan : Lakukan Build pada Bangun Ruang Console untuk membuat suatu File Library yang berekstensi JAR (Java Archive). File ini adalah sebuah pengelompokan dari banyak File Java atau bisa disebut juga dengan sebuah Package dari sebuah File dengan tujuan agar bisa menjamin bahwa nama yang digunakan tetap unik juga untuk mengontrol visibility class atau interface yang ada didalam. o Klik kanan pada Bangun Ruang Dekstop yang sudah kita buat pilih properties o Pada list menu di samping kiri pilih Libraries klik tombol AddJAR/Folder di sebelah kanan form Cara membuat sebuah Form dengan menggunakan JFrameMain (Frame Utama) : klik kanan pada Packages pilih New pilih JFrame Form Buatlah tampilan menu dengan drag & drop MenuBar. Menu dengan JMenu dan submenu dengan JMenuItem yang terdapat di Palette. JFrmMain.java • Swing Menus Variable Name Text JMenu jMnuBangunRuang2D Bangun Ruang 2D JMenuItem jMniSegitiga Segitiga JMenu jMnuBangunRuang3D Bangun Ruang 3D JMenuItem jMniPrismaSegitiga Prisma Segitiga JMenu jMnuFile File JMenuItem jMniKeluar Keluar Setelah membuat menu, kemudian membuat desain JFrame berikut dengan cara drag & drop JLabel, JTextField, dan JButton pada Palette. Untuk mengubah nama variabel dan text yang ditampilkan dengan cara mengubah di Propertiesnya. Berikut desain JFrame yang harus dibuat : JTextField JButton JLabel Keterangan JFrame : FrmSegitiga.java FrmPrismaSegitiga.java Swing Controls Variable Name Text Swing Controls Variable Name Text JLabel Segitiga Segitiga JLabel Prisma Segitiga Prisma Segitiga JLabel Alas Alas JLabel Alas Alas Segitiga JTextField jTxtAlas 0 JTextField jTxtAlasSegitiga 0 JLabel Tinggi Tinggi JLabel Tinggi Tinggi Segitiga JTextField jTxtTinggi 0 JTextField jTxtTinggiSegitiga 0 Jbutton jBtnHitung Hitung Jbutton jBtnHitung Hitung JLabel Luas Luas JLabel TinggiPrisma Tinggi Prisma JTextField jTxtLuas 0 JTextField jTxtTinggiPrisma 0 JLabel Keliling Keliling JLabel Volume Volume Prisma JTextField jTxtKeliling 0 JTextField jTxtVolume 0 JTextField digunakan untuk menginput nilai JLabel digunakan hanya untuk tampilan dan tidak bisa menginput nilai JButton digunakan untuk menjalankan perhitungan atau proses Masing-masing mempunyai event yang bisa dibuat dengan cara klik kanan pada Button / Label / Text Field pilih Events … (terdapat banyak event sesuai kebutuhan) Events, yaitu objek untuk mewakili peristiwa klik atau tombol ditekan Source Code (diubah pada event) JFrmMain.java private void jmniSegiTigaActionPerformed(java.awt.event.ActionEvent evt) { if (frmsegitiga == null) { frmsegitiga = new FrmSegiTiga(); } showForm(frmsegitiga); } Events private void jmniPrismaSegitigaActionPerformed(java.awt.event.ActionEvent evt) { if (frmprismasegitiga == null) { frmprismasegitiga = new FrmPrismaSegitiga(); } showForm(frmprismasegitiga); } private void jmniKeluarActionPerformed(java.awt.event.ActionEvent evt) { System.exit(0); } private void showForm(Object obj) { JInternalFrame jf = null; if (obj instanceof JInternalFrame) { jf = (JInternalFrame) obj; if (!jf.isVisible()) { jDesktopPane1.add(jf); } jf.setVisible(true); try { jf.setMaximum(true); jf.setSelected(true); } catch (java.beans.PropertyVetoException e) { e.printStackTrace(); } } } FrmSegitiga.java private void jbtnHitungActionPerformed(java.awt.event.ActionEvent evt) { Segitiga segi3=new Segitiga(); segi3.setAlas(Double.parseDouble(jtxtAlas.getText())); segi3.setTinggi(Double.parseDouble(jtxtTinggi.getText())); jtxtLuas.setText(segi3.getLuas() + ""); jtxtKeliling.setText(segi3.getKeliling() + ""); } FrmPrismaSegitiga.java private void jbtnHitungActionPerformed(java.awt.event.ActionEvent evt) { PrismaSegitiga pr=new PrismaSegitiga(); pr.setAlas(Double.parseDouble(jtxtAlas.getText())); pr.setTinggi(Double.parseDouble(jtxtTinggi.getText())); pr.setTinggiPrisma(Double.parseDouble(jtxtTinggiPrisma.getText())); jtxtVolume.setText(pr.getVolume() + ""); } Double.parseDouble : untuk mengkonversi nilai dari tipe string ke double getText() : untuk mendapatkan nilai yang diinput setText() : untuk menampilkan nilai Membangun Aplikasi Web Di Java Aplikasi yang dijalankan di browser yang berbentuk web Langkah-langkah pembuatan : Klik file → new project lalu pilih web → web application. Kemudian pilih tombol next Beri nama pada Project Name : BangunRuangWeb → klik tombol Next Pilih server GlassFish V2 → klik tombol Next → klik Finish. Setelah itu akan muncul file index.jsp Kopikan gambar-gambar yang dibutuhkan ke dalam folder BangunRuangWeb/Web yang ada di NetBeansProjects. Berikut ini adalah gambar-gambar yang sudah dikopikan ke dalam folder : Buatlah file jar yang berasal dari BangunRuang dengan cara : klik kanan pada BangunRuangWeb → pilih Properties → pilih Libraries → klik tombol Add JAR/Folder. Buatlah file jar yang berasal dari BangunRuang dengan cara : klik kanan pada BangunRuangWeb → pilih Properties → pilih Libraries → klik tombol Add JAR/Folder Pilih di folder NetBeansProjects/BangunRuang/dist/BangunRuang.jar → klik tombol OK → klik tombol OK lagi. Buatlah file-file JSP dengan cara : klik kanan di BangunRuangWeb → Web Pages → Pilih New → JSP Berilah nama JSP File Name : Balok → setelah itu pilih tombol Finish Source code yang harus diubah : Source code Java ditandai dengan <% %> Segitiga.jsp <%@page import="bangunruang.*"%> <% String tinggi= request.getParameter("tinggi") == null ? "0":request.getParameter("tinggi"); String alas = request.getParameter("alas") == null ? "0":request.getParameter("alas"); Pembuatan tabel Segitiga st = new Segitiga(); st.setAlas(Double.parseDouble(alas)); Pemanggilan halaman index.jsp st.setTinggi(Double.parseDouble(tinggi)); %> <a href="index.jsp">Home</a> <br> <table align="center" border="2" bgcolor="#fabc5a" cellpadding="5" cellspacing="0"> <caption align="top"><H1>SEGI TIGA<H1></caption> <tr><th> <img width="160" height="160" src="122px-Triangle.Equilateral.svg.png" align="left"> Menyisipkan gambar Segitiga adalah nama suatu bentuk yang dibuat dari tiga sisi yang berupa garis lurus dan tiga sudut. Matematikawan Euclid yang hidup sekitar tahun 300 SM menemukan bahwa jumlah ketiga sudut di suatu segi tiga adalah 180 derajat. Hal ini memungkinkan kita menghitung besarnya salah satu sudut bila dua sudut lainnya sudah diketahui. </th></tr> <tr><td><Form> Nama variabel harus sama <img width='200' height='150' src='S3.png' align="left"> Membuat text untuk menginput <pre>Tinggi : </pre><input type=text name=tinggi value=<%=tinggi%>> <pre>Alas : </pre><input type=text name=alas value=<%=alas%>> <br><input type=submit Value=Hitung> </Form></td></tr> <tr><td> <pre> Luas : <%=st.getLuas() %></pre> <pre> Keliling : <%=st.getKeliling() %></pre> Membuat button hitung </td></tr></table> Membuat label Pemanggilan method di Java PrismaSegitiga.jsp <%@page import="bangunruang.*"%> <% String tinggi= request.getParameter("tinggi") == null ? "0":request.getParameter("tinggi"); String alas = request.getParameter("alas") == null ? "0":request.getParameter("alas"); String tinggiP = request.getParameter("tinggiP") == null ? "0":request.getParameter("tinggiP"); PrismaSegitiga pri = new PrismaSegitiga(); pri.setAlas(Double.parseDouble(alas)); pri.setTinggi(Double.parseDouble(tinggi)); pri.setTinggiPrisma(Double.parseDouble(tinggiP)); %> <a href="index.jsp">Home</a> <br> <table align="center" border="2" bgcolor="#fabc5a" cellpadding="5" cellspacing="0" > <caption align="top"><H1>PRISMA SEGITIGA<H1></caption> <tr><th> <img width="160" height="160" src="220px-Prisma.JPG" align="left"> Dalam geometri, prisma adalah bangun ruang tiga dimensi yang dibatasi oleh alas dan tutup identik berbentuk segi-n dan sisi-sisi tegak berbentuk segiempat. Dengan kata lain prisma adalah bangun ruang yang mempunyai penampang melintang yang selalu sama dalam bentuk dan ukuran. </th></tr> <tr><td><Form > <img width="200" height="150" src="prisma.jpg" align="left"> <pre>Alas : <input type=text name=alas value=<%=alas%>></pre> <pre>Tinggi : <input type=text name=tinggi value=<%=tinggi%>> </pre> <pre>Tinggi Prisma : <input type=text name=tinggiP value=<%=tinggiP%>></pre> <input type=submit Value=Hitung> </Form></td></tr> <tr><td> <pre>Volume : <%=pri.getVolume()%> </pre> </td></tr> </table> Membangun Aplikasi Mobile Aplikasi yang dijalankan di mobile / handphone Langkah-langkah pembuatan : Pilih File → New Project → pilih Mobility → MIDP Application → klik tombol Next Berilah nama pada Project Name : BangunRuangMobile → klik tombol Next Pilih MIDP 2.0 → klik tombol Next → klik tombol Finish. Copy semua file dari .java dari NetBeansProjects/BangunRuang ke dalam folder bangunruangmobile Bukalah BangunRuang.java yang bersimbol penggaris dan pensil di dalam BangunRuangMobile → pilih tab Flow Berilah nama JSP File Name : PrismaSegitiga → setelah itu pilih tombol Finish Splash screen : tampilan yang kita lihat pertama kali waktu kita menjalankan sebuah aplikasi. Splash screen ini biasanya ditampilkan untuk mengurangi kejenuhan user sewaktu program masih dalam tahap inisialisasi. Cara membuat splash screen : Pilih di dalam Pallete → Splash Screen, buat di dalam flow → tariklah garis dari started ke Splash Screen. Untuk mengganti Text di Splash Screen → ubah di Properties → Text → Ketik Wait until background task is complete ... Untuk membuat image di Splash Screen : ubah di properties → klik kotak kecil yang ada di image → pilih image1 → lalu pilih file gambar yang sudah ada. Untuk membuat garis pada flow, dengan cara menarik garis dari screen command atau exit command atau splash screen ke form yang dituju Cara membuat frmWelcome : Pilih di dalam Pallete → Form. Buatlah di dalam flow → ubah properties → instance name (nama form) menjadi frmWelcome dan Title (judul yang akan ditampilkan di mobile) menjadi Welcome. Klik kanan pada frmWelcome yang sudah ada di dalam layar Flow → pilih New/Add → pilih Screen Command → ganti instance name menjadi scrBangunRuang2D Buatlah satu Screen Command lagi dan ubah instance name menjadi scrBangunRuang3D. Screen Command : tampilan di layar handphone untuk menuju ke form yang diinginkan Untuk membuat Exit Command : klik kanan pada form pilih New/Add → pilih Exit Command Exit Command : tampilan di layar untuk instruksi keluar dari form Untuk membuat List : pilih di Pallette → List. Untuk membuat List Element di dalam List : klik kanan pada list → pilih List Element. Untuk membuat Back Command : klik kanan pada form/list → pilih New/Add → pilih Back Command Back Command : tampilan di layar untuk kembali ke form yang dituju Buatlah tampilan menjadi seperti berikut : Keterangan Flow : (frm:Form, scr:Screen Command, list:List) Screen untuk masing-masing list, form welcome dan splash screen : List Element DateField Screen untuk masing-masing form : TextField StringItem TextField : untuk menginput nilai Cara membuat TextField : klik kanan pada device screen seperti gambar diatas New/Add Text Field StringItem : untuk menampilkan hasil perhitungan Cara membuat StringItem : klik kanan pada device screen seperti gambar diatas New/Add String Item DateField : untuk menampilkan tanggal dan waktu ListElement : bagian dari List Cara membuat DateField dan ListElement hampir sama dengan TextField dan String Item, hanya saja pilihan terakhir yang berbeda ListBangunRuang2D ListBangunRuang3D Type Properties Value Type Properties Value List Element String Segitiga List Element String Prisma Segitiga frmWelcome Type Instance Name Properties Value DateField Tanggal Input Mode Date DateField Waktu Input Mode Time frmSegitiga SplashScreen Sudah dibahas sebelumnya frmPrismaSegitiga Type Instance Name Properties Value Type Instance Name Properties Value TextField txtAlasSG Label Alas TextField txtAlasPS Label Alas TextField txtTinggiSG Label Tinggi TextField txtTinggiPS Label Tinggi StringItem strLuasSG Label Luas TextField txtTinggiprismaPS Label Tinggi Prisma StringItem strKelilingSG Label Keliling StringItem strVolumePS Label Volume Source Code yang perlu diubah di dalam commandAction() : Segitiga else if (command == scrHitungSegitiga) { Untuk Mengambil nilai yang diinput Segitiga sg = new Segitiga(); sg.setAlas(Double.parseDouble(txtAlasSG.getString())); sg.setTinggi(Double.parseDouble(txtTinggiSG.getString())); strLuasSG.setText(sg.getLuas() +""); strKelilingSG.setText(sg.getKeliling()+""); } PrismaSegitiga else if (command == scrHitungPrismaSegitiga) { PrismaSegitiga ps = new PrismaSegitiga(); ps.setAlas(Double.parseDouble(txtAlasPS.getString())); ps.setTinggi(Double.parseDouble(txtTinggiPS.getString())); ps.setTinggiPrisma(Double.parseDouble(txtTinggiprismaPS.getString())); strVolumePS.setText(ps.getVolume() +""); } -- SEKIAN DAN TERIMA KASIH --