Materi Mata Kuliah Pemrograman Mobile | Teknik Informatika UNISNU Jepara | Akhmad Khanif Zyen
Cara menggunakan modul ini:
Login ke akun github anda.
Star ke repository ini.
Fork repository ini sehingga masuk ke repository di akun github masing-masing.
Clone project dari repository github masing-masing.
git clone https://github.com/namauser/dart-oop.gitBuat branch baru
dev
dan gunakan sebagai branch yang aktif.git checkout -b devMulai praktek, selesai praktek lakukan commit dengan label sesuai materi yang dikerjakan.
git add . git commit -m "contoh 1 inheritance"Lakukan push ke repository github masing-masing
git push -u origin devJika sudah selesai semua, kembali ke repository ini, kemudian masuk ke menu
issue
, tulis identitas diri (NIM, Nama) dan link repo github hasil dari fork project ini.Penilaian berdasarkan commit di branch
dev
pada repo akun github masing-masing.
OOP (Object-oriented programming) adalah metode pemrograman yang menggunakan Object dan interaksinya untuk merancang dan membuat aplikasi. OOP digunakan pada banyak bahasa pemrograman, seperti Dart, Java, C++, Python, dan lain-lain.
Keuntungan dari OOP antara lain mudah dimengerti dan digunakan, meningkatkan daya guna ulang dan mengurangi kompleksitas, meningkatkan produktivitas programmer, membuat kode lebih mudah dipelihara, dimodifikasi, dan didebug, serta mendorong kerjasama dan kolaborasi.
Fitur-fitur OOP antara lain:
OOP bertujuan untuk memecahkan masalah yang kompleks menjadi Object yang lebih kecil.
OOP dapat membuat kode menjadi lebih modular,fleksibel, dan mudah diperluas. OOP dapat membantu Anda memahami dan menyelesaikan masalah dengan lebih baik.
Sintaks dasar class dalam Dart dimulai dengan kata kunci "class" diikuti dengan nama class. Struktur class dalam Dart terdiri dari bagian header, body, dan constructor. Header class berisi nama class dan deklarasi pewarisan (inheritance), sedangkan body class berisi properti dan method yang didefinisikan untuk class tersebut. Constructor adalah method khusus yang digunakan untuk membuat Object class tersebut.
Pembuatan Object dalam Dart dilakukan dengan menggunakan operator "=" diikuti dengan nama class dan parameter Constructor. Constructor memiliki dua jenis, yaitu Default Constructor dan Constructor dengan parameter. Default Constructor merupakan Constructor yang otomatis dibuat jika tidak didefinisikan, sedangkan Constructor dengan parameter digunakan untuk memasukkan nilai ke dalam Object.
Setiap Object yang dibuat dari class memiliki properti yang unik. Properti class dibagi menjadi dua jenis, yaitu variabel instance dan variabel statis. Variabel instance adalah variabel yang nilainya berbeda untuk setiap Object, sedangkan variabel statis nilainya sama untuk semua Object.
Method adalah fungsi khusus yang dapat digunakan untuk melakukan operasi pada Object. method juga dibagi menjadi dua jenis, yaitu method instance dan method statis. method instance dipanggil pada Object yang spesifik, sedangkan method statis dipanggil pada class itu sendiri.
Dalam pewarisan(Inheritance), class dapat mewarisi properti dan method dari class lain. Dalam Dart, konsep pewarisan ini dapat diimplementasikan dengan menggunakan kata kunci "extends". Dalam implementasinya, class turunan dapat mengakses properti dan method dari class induknya.
Untuk mendefinisikan class dalam Dart, kita menggunakan sintaks berikut:
class ClassName {
//variable
//method
}
Contoh sederhana class dalam Dart:
class Mobil {
String? merk;
String? model;
int? tahun;
void klakson(){
print("Beep! Beep!");
}
}
Dalam contoh di atas, kita mendefinisikan class Mobil dengan tiga variabel (merk, model, dan tahun) dan satu method (klakson).
Materi Mata Kuliah Pemrograman Mobile | Teknik Informatika UNISNU Jepara | Akhmad Khanif Zyen
Untuk membuat Object dari class, kita menggunakan sintaks berikut:
ClassName objek = ClassName();
Contoh membuat Object dari class Mobil:
void main(){
Mobil mobil1 = Mobil();
}
Setelah Object dibuat, kita dapat mengakses variabel dan method dalam Object dengan menggunakan tanda titik (.):
void main(){
Mobil mobil1 = Mobil();
mobil1.merk = "Toyota";
mobil1.model = "Corolla";
mobil1.tahun = 2020;
print(mobil1.merk); //Output: Toyota
print(mobil1.model); //Output: Corolla
print(mobil1.tahun); //Output: 2020
mobil1.klakson(); //Output: Beep! Beep!
}
Dalam Dart, kita bisa menggunakan Constructor untuk membuat Object dengan nilai yang telah ditentukan. Constructor adalah method khusus yang dipanggil saat membuat Object. Berikut adalah sintaks untuk membuat Constructor dalam class:
ClassName(parameter){
// kode konstruktor
}
Contoh penggunaan Constructor dalam class Mobil:
class Mobil {
String? merk;
String? model;
int? tahun;
Mobil(String merk, String model, int tahun){
this.merk = merk;
this.model = model;
this.tahun = tahun;
}
void klakson(){
print("Beep! Bepp!");
}
}
void main(){
Mobil mobil2 = Mobil("Honda","Civic",2019);
print(mobil2.merk); //Output: Honda
print(mobil2.model); //Output: Civic
print(mobil2.tahun); //Output: 2019
}
Class adalah elemen dasar dalam pemrograman berorientasi Object yang membantu kita mengorganisir kode dengan lebih baik. Dalam pemrograman Dart, kita dapat mendefinisikan class, membuat Object dari class, dan mengakses variabel serta method dalam Object.
Object adalah instansi dari class yang digunakan untuk mengakses variabel dan method dalam class. Dengan memahami cara kerja Object, kita dapat lebih mudah mengorganisir kode dan mengembangkan aplikasi secara efisien.
Materi Mata Kuliah Pemrograman Mobile | Teknik Informatika UNISNU Jepara | Akhmad Khanif Zyen
class Hewan {
String? nama;
int? jumlahKaki;
int? umur;
void display(){
print("Nama Hewan: $nama");
print("Jumlah Kaki: $jumlahKaki");
print("Umur: $umur");
}
}
void main(){
Hewan hewan = Hewan();
hewan.nama = "Singa";
hewan.jumlahKaki = 4;
hewan.umur = 10;
hewan.display();
}
Dalam contoh diatas, terdapat classs Hewan dengan tiga properti: nama, jumlahKaki, dan umur. class ini juga memiliki method display() yang mencetak nilai dari ketiga properti tersebut.
Dalam contoh di bawah ini, terdapat class PersegiPanjang dengan dua properti: panjang dan lebar. class ini juga memiliki method area() yang menghitung luas dari persegi panjang.
class PersegiPanjang {
double? panjang;
double? lebar;
double area(){
return panjang! * lebar!;
}
}
void main(){
PersegiPanjang persegiPanjang = PersegiPanjang();
persegiPanjang.panjang = 10;
persegiPanjang.lebar = 5;
print("Luas Persegi Panjang adalah ${persegiPanjang.area()}.");
}
Catatan: Tanda seru (!) digunakan untuk memberitahu kompiler bahwa variabel tersebut tidak null. Jika Anda tidak menggunakan tanda seru, maka Anda akan mendapatkan error. Anda akan mempelajari lebih lanjut tentang null safety nanti.
Dalam contoh di bawah ini, terdapat class BungaSederhana dengan tiga properti: pokok, sukuBunga, dan waktu. class ini juga memiliki method bunga() yang menghitung bunga sederhana.
class BungaSederhana {
double? pokok;
double? sukuBunga;
double? waktu;
double bunga(){
return (pokok! * sukuBunga! * waktu!) / 100;
}
}
void main(){
BungaSederhana bungaSederhana = BungaSederhana();
bungaSederhana.pokok = 1000;
bungaSederhana.sukuBunga = 10;
bungaSederhana.waktu = 2;
print("Bunga Sederhana adalah ${bungaSederhana.bunga()}.");
}
Materi Mata Kuliah Pemrograman Mobile | Teknik Informatika UNISNU Jepara | Akhmad Khanif Zyen
Buatlah class Rumah dengan properti nama, alamat, jumlahKamar. Buatlah method display() yang mencetak nilai dari ketiga properti tersebut. Buat Object dari class Rumah dan atur nilai-nilai propertinya. Panggil method display() untuk mencetak nilai dari ketiga properti tersebut.
Constructor adalah method khusus yang digunakan untuk menginisialisasi Object. Constructor dipanggil secara otomatis saat Object dibuat dan dapat digunakan untuk mengatur nilai awal properti Object. Sebagai contoh, kode berikut membuat Object class Orang dan mengatur nilai awal untuk properti nama dan umur.
Orang orang = Orang("Budi",30);
Jika Anda tidak mendefinisikan Constructor untuk class, maka Anda perlu mengatur nilai properti secara manual. Sebagai contoh, kode berikut membuat Object class Orang dan mengatur nilai untuk properti nama dan umur.
Orang orang = Orang();
orang.nama = "Budi";
orang.umur = 30;
- Nama Constructor harus sama dengan nama class.
- Constructor tidak memiliki tipe pengembalian.
class ClassName {
// deklarasi konstruktor: sama dengan nama class
ClassName() {
// isi dari konstruktor
}
}
Dalam contoh di bawah ini, terdapat class Siswa dengan tiga properti: nama, umur, dan nomorInduk. class ini memiliki satu Constructor. Constructor digunakan untuk menginisialisasi nilai dari ketiga properti tersebut. Kami juga membuat Object dari class Siswa yang disebut siswa.
class Siswa {
String? nama;
int? umur;
int? nomorInduk;
// konstruktor
Siswa(String nama, int umur, int nomorInduk){
print("Konstruktor dipanggil");
this.nama = nama;
this.umur = umur;
this.nomorInduk = nomorInduk;
}
}
void main(){
Siswa siswa = Siswa("Budi",30,1);
print("Nama: ${siswa.nama}");
print("Umur: ${siswa.umur}");
print("Nomor Induk: ${siswa.nomorInduk}");
}
Catatan: Kata kunci this digunakan untuk merujuk ke instance saat ini dari class. Kata kunci ini digunakan untuk mengakses properti class saat ini. Dalam contoh di atas, nama parameter dan properti class dari Constructor Siswa adalah sama. Oleh karena itu, untuk menghindari kebingungan, kita menggunakan kata kunci this.
Dalam contoh berikut, ada class Guru dengan empat properti: nama, umur, mataPelajaran, dan gaji. class ini memiliki satu Constructor untuk menginisialisasi nilai dari properti. class ini juga memiliki method display() yang digunakan untuk menampilkan nilai properti. Kami juga membuat 2 Object dari class Guru yang disebut guru1 dan guru2.
class Guru {
String? nama;
int? umur;
String? mataPelajaran;
double? gaji;
//Konstruktor
Guru(String nama, int umur, String mataPelajaran, double gaji){
this.nama = nama;
this.umur = umur;
this.mataPelajaran = mataPelajaran;
this.gaji = gaji;
}
//metode
void tampilkan(){
print("Nama: ${this.nama}");
print("Umur: ${this.umur}");
print("Mata Pelajaran: ${this.mataPelajaran}");
print("Gaji: ${this.gaji}\n");// \n digunakan untuk baris baru
}
}
void main(){
Guru guru1 = Guru("Budi",30,"Matematika",50000.0);
guru1.tampilkan();
Guru guru2 = Guru("Cahyo",35,"Sains",60000.0);
guru2.tampilkan();
}
Hasil keluaran:
Nama: Budi
Umur: 30
Mata Pelajaran: Matematika
Gaji: 50000
Nama: Cahyo
Umur: 35
Mata Pelajaran: Sains
Gaji: 60000
Default Constructor adalah Constructor yang dibuat secara otomatis oleh kompiler Dart jika Anda tidak membuat Constructor. Default Constructor tidak memiliki parameter. Default Constructor dideklarasikan dengan menggunakan nama class diikuti dengan tanda kurung ().
Dalam contoh berikut ini,terdapat class Laptop dengan dua properti: merek, dan harga. Mari kita buat Constructor tanpa parameter dan mencetak sesuatu dari Constructor tersebut. Kami juga memiliki Object dari class Laptop yang disebut laptop.
class Laptop {
String? merk;
int? harga;
// konstruktor
Laptop(){
print("Ini adalah konstruktor default");
}
}
void main(){
//disini laptop adalah objek dari kelas Laptop
Laptop laptop = Laptop();
}
Parameterized Constructor digunakan untuk menginisialisasi variabel instan dari class. Parameterized Constructor adalah Constructor yang menggunakan parameter. Constructor ini digunakan untuk mengirimkan nilai ke Constructor pada saat pembuatan Object.
class NamaKelas {
//variabel instan
int? angka;
String? nama;
//konstruktor parameter
NamaKelas(this.angka,this.nama);
}
Dalam contoh di bawah ini, terdapat class Student dengan tiga properti: name, age, dan rollNumber. class ini memiliki satu Constructor. Constructor ini digunakan untuk menginisialisasi nilai dari ketiga properti tersebut. Kami juga memiliki Object dari class Student yang disebut student.
class Student {
String? name;
int? age;
int? rollNumber;
//konstruktor
Student(this.name, this.age, this.rollNumber);
}
void main(){
//disini student adalah object dari class Student
Student student = Student("John", 20, 1);
print("Name: ${student.name}");
print("Age: ${student.age}");
print("Roll Number: ${student.rollNumber}");
}
Hasil keluaran:
Name: John
Age: 20
Roll Number: 1
Dalam contoh di bawah ini, terdapat class Student dengan tiga properti: name, age, dan rollNumber. class ini memiliki satu Constructor. Constructor ini digunakan untuk menginisialisasi nilai dari ketiga properti tersebut. Kami juga memiliki Object dari class Student yang disebut student.
class Student {
String? name;
int? age;
int? rollNumber;
//konstruktor
Student({String? name, int?age, int? rollNumber}){
this.name = name;
this.age = age;
this.rollNumber = rollNumber;
}
}
void main(){
//disini student adalah object dari class Student
Student student = Student(name: "John", age: 20, rollNumber: 1);
print("Name: ${student.name}");
print("Age: ${student.age}");
print("Roll Number: ${student.rollNumber}");
}
Hasil keluaran:
Name: John
Age: 20
Roll Number: 1
Dalam contoh di bawah ini, terdapat class Student dengan dua properti: name, dan age. class ini memiliki Parameterized Constructor dengan nilai default. Constructor ini digunakan untuk menginisialisasi nilai dari kedua properti tersebut. Kami juga memiliki Object dari class Student yang disebut student.
class Student {
String? name;
int? age;
//konstruktor
Student({String? name = "John",int? age = 0}){
this.name = name;
this.age = age;
}
}
void main(){
//disini student adalah object dari class Student
Student student = Student();
print("Name: ${student.name}");
print("Age: ${student.age}");
}
Hasil keluaran:
Name: John
Age: 0
Dalam kebanyakan bahasa pemrograman seperti Java, C++, C#, dll., kita bisa membuat beberapa Constructor dengan nama yang sama. Namun dalam Dart, hal ini tidak mungkin. Tetapi ada cara lain, kita bisa membuat beberapa Constructor dengan nama yang sama menggunakan Named Constructor.
Catatan: Named Constructor meningkatkan keterbacaan kode. Ini berguna ketika Anda ingin membuat beberapa Constructor dengan nama yang sama.
Dalam contoh di bawah ini, ada class Student dengan tiga properti: name, age, dan rollNumber. class ini memiliki dua Constructor. Constructor pertama adalah Default Constructor. Constructor kedua adalah Named Constructor. Named Constructor digunakan untuk menginisialisasi nilai ketiga properti. Kami juga memiliki Object dari class Student yang disebut student.
class Student {
String? name;
int? age;
int? rollNumber;
//default constructor
Student(){
print("This is a default constructor");
}
//named constuctor
Student.namedConstructor(String name, int age, int rollNumber){
this.name = name;
this.age = age;
this.rollNumber = rollNumber;
}
}
void main(){
//disini student adalah object dari class Student
Student student = Student.namedConstructor("John", 20, 1);
print("Name: ${student.name}");
print("Age: ${student.age}");
print("Roll Number: ${student.rollNumber}");
}
Hasil keluaran:
Name: John
Age: 20
Roll Number: 1
Dalam contoh di bawah ini, ada class Mobile dengan tiga properti name, color, dan prize. Class ini memiliki satu method display yang mencetak nilai ketiga properti. Kami juga memiliki Object dari class Mobile yang disebut mobile. Ada juga Constructor Mobile yang mengambil ketiga properti sebagai parameter. Named Constructor Mobile.namedConstructor digunakan untuk membuat Object dari class Mobile dengan name, color dan prize opsional. Nilai default dari prize adalah 0. Jika prize tidak dilewatkan, maka nilai default akan digunakan.
class Mobile {
String? name;
String? color;
int? prize;
Mobile(this.name, this.color, this.prize);
//disini Mobile() adalah named constructor
Mobile.namedConstructor(this.name, this.color, [this.prize=0]);
void displayMobileDetails(){
print("Mobile name: $name.");
print("Mobile color: $color.");
print("Mobile prize: $prize\n");
}
}
void main(){
var mobile1 = Mobile("Samsung", "Black",20000);
mobile1.displayMobileDetails();
var mobile2 = Mobile.namedConstructor("Apple", "White");
mobile2.displayMobileDetails();
}
Hasil keluaran:
Mobile name: Samsung.
Mobile color: Black.
Mobile prize: 20000
Mobile name: Apple.
Mobile color: White.
Mobile prize: 0
Dalam contoh di bawah ini, ada class Animal dengan dua properti name dan age. class ini memiliki tiga Constructor. Constructor pertama adalah Default Constructor. Constructor kedua dan ketiga adalah Named Constructor. Constructor kedua digunakan untuk menginisialisasi nilai name dan age, dan Constructor ketiga digunakan untuk menginisialisasi nilai name saja. Kami juga memiliki Object dari class Animal yang disebut animal.
class Animal {
String? name;
int? age;
//default constructor
Animal(){
print("Ini adalah default constructor");
}
//named constructor
Animal.namedConstructor(String name, int age){
this.name = name;
this.age = age;
}
//named constructor
Animal.namedConstructor2(String name){
this.name = name;
}
}
void main(){
//disini animal adalah object dari class Animal
Animal animal = Animal.namedConstructor("Dog", 5);
print("Name: ${animal.name}");
print("Age: ${animal.age}");
Animal animal2 = Animal.namedConstructor2("Cat");
print("Name: ${animal2.name}");
}
Hasil keluaran:
Name: Dog
Age: 5
Name: Cat
Dalam contoh di bawah ini, ada class Person dengan dua properti name dan age. class ini memiliki tiga Constructor. Constructor pertama adalah Parameterized Constructorisasi yang mengambil dua parameter name dan age. Constructor kedua dan ketiga adalah Named Constructor. Constructor kedua fromJson digunakan untuk membuat Object dari class Person dari JSON. Constructor ketiga fromJsonString digunakan untuk membuat Object dari class Person dari string JSON. Kami juga memiliki Object dari class Person yang disebut person.
import 'dart:convert';
class Person {
String? name;
int? age;
Person(this.name, this.age);
Person.fromJson(Map<String, dynamic> json){
name = json['name'];
age = json['age'];
}
Person.fromJsonString(String jsonString){
Map<String, dynamic> json = jsonDecode(jsonString);
name = json['name'];
age = json['age'];
}
}
void main(){
//disini person adalah object dari class Person
String jsonString1 = '{"name": "Agus", "age": 20}';
String jsonString2 = '{"name": "Budi", "age": 25}';
Person p1 = Person.fromJsonString(jsonString1);
print("Person 1 name: ${p1.name}");
print("Person 1 age: ${p1.age}\n");
Person p2 = Person.fromJsonString(jsonString2);
print("Person 2 name: ${p2.name}");
print("Person 2 age: ${p2.age}");
}
Hasil keluaran:
Person 1 name: Agus
Person 1 age: 20
Person 2 name: Budi
Person 2 age: 25
Constant Constructor adalah Constructor yang menciptakan Object konstan. Object konstan adalah Object yang nilai tidak dapat diubah. Constant Constructor dideklarasikan dengan menggunakan kata kunci const.
Catatan: Constant Constructor digunakan untuk membuat Object yang nilainya tidak dapat diubah. Ini meningkatkan kinerja program.
Aturan untuk Mendeklarasikan Constant Constructor dalam Dart:
- Semua properti class harus final.
- Tidak memiliki badan.
- Hanya class yang mengandung Constructor const diinisialisasi menggunakan kata kunci const.
Dalam contoh di bawah ini, ada class Point dengan dua properti final: x dan y. class ini juga memiliki Constant Constructor yang menginisialisasi dua properti tersebut.
class Point {
final int x;
final int y;
const Point(this.x, this.y);
}
void main(){
//p1 dan p2 memiliki kode hash yang sama
Point p1 = const Point(1, 2);
print("Kode hash p1 adalah: ${p1.hashCode}");
Point p2 = const Point(1, 2);
print("Kode hash p2 adalah: ${p2.hashCode}");
// tanpa menggunakan const
// ini memiliki kode hash yang berbeda
Point p3 = Point(2, 2);
print("Kode hash p3 adalah: ${p3.hashCode}");
Point p4 = Point(2, 2);
print("Kode hash p4 adalah: ${p4.hashCode}");
}
Hasil keluaran:
Kode hash p1 adalah: 248788600
Kode hash p2 adalah: 248788600
Kode hash p3 adalah: 533057249
Kode hash p4 adalah: 683584498
Catatan: Di sini p1 dan p2 memiliki kode hash yang sama. Ini karena p1 dan p2 adalah Object konstan. Kode hash dari Object konstan sama. Ini karena kode hash dari Object konstan dihitung saat waktu kompilasi. Kode hash dari Object non-konstan dihitung saat waktu runtime. Inilah mengapa p3 dan p4 memiliki kode hash yang berbeda.
Dalam contoh di bawah ini, ada class Student dengan tiga properti: name, age, dan rollNumber. class ini memiliki satu Constant Constructor. Constructor ini digunakan untuk menginisialisasi nilai dari ketiga properti tersebut. Kami juga memiliki Object dari class Student yang disebut student.
class Student {
final String? name;
final int? age;
final int? rollNumber;
//Constant Constructor
const Student({this.name, this.age, this.rollNumber});
}
void main(){
//disini student adalah object dari class Student
const Student student = Student(name: "Budi", age: 28, rollNumber: 1);
print("Name: ${student.name}");
print("Age: ${student.age}");
print("Roll Number: ${student.rollNumber}");
}
Hasil keluaran:
Name: Budi
Age: 28
Roll Number: 1
Dalam contoh di bawah ini, ada class Car dengan tiga properti: name, model, dan prize. class ini memiliki satu Constructor. Constructor ini digunakan untuk menginisialisasi nilai dari ketiga properti tersebut. Kami juga memiliki Object dari class Car yang disebut car.
class Car {
final String? name;
final String? model;
final int? prize;
//constant constructor
const Car({this.name, this.model, this.prize});
}
void main(){
//disini car adalah object dari class Car
const Car car = Car(name: "BMW", model: "X5", prize: 50000);
print("Name: ${car.name}");
print("Model: ${car.model}");
print("Prize: ${car.prize}");
}
Hasil keluaran:
Name: BMW
Model: X5
Prize: 50000
Tugas Latihan 1
- Buatlah sebuah class Mobil dalam Dart yang memiliki properti seperti merk, model, dan tahun. Selanjutnya, buat objek dari class tersebut dan inisialisasikan dengan nilai tertentu. Cetak informasi mobil tersebut.
- Buatlah class Mahasiswa dengan properti nama dan nim. Berikan nilai default untuk kedua properti tersebut. Buat objek dari class Mahasiswa tanpa memberikan nilai tambahan, dan cetak informasi mahasiswa tersebut.
- Buat class Buku dengan properti judul dan pengarang. Implementasikan parameterized constructor untuk menginisialisasi properti saat objek dibuat. Buat objek dari class Buku dengan memberikan nilai pada konstruktor, dan cetak informasi buku tersebut.
- Buat class Segitiga dengan properti alas, tinggi, dan jenis (contoh: siku-siku, sama sisi, dsb.). Implementasikan named constructor untuk membuat objek Segitiga berdasarkan jenisnya. Buat objek dari class Segitiga menggunakan named constructor, dan cetak informasi segitiga tersebut.
- Buat class Warna dengan properti red, green, dan blue. Implementasikan constant constructor untuk menginisialisasi warna yang bersifat konstan. Buat beberapa objek dari class Warna menggunakan constant constructor, dan cetak informasi warna-warna tersebut.
Encapsulation adalah salah satu prinsip dasar dalam pemrograman berorientasi objek (OOP) yang menggabungkan data dan metode yang beroperasi pada data ke dalam sebuah unit tunggal, yang disebut class. Dengan menggunakan encapsulation, kita dapat menyembunyikan rincian implementasi internal suatu objek dan hanya mengekspos fungsionalitas yang diperlukan.
Cara mudahnya adalah dengan melakukan hal berikut:
- menjadikan property di dalam class menjadi private dengan menambahkan underscore (_)
- membuat method setter dan getter untuk mengakses dan mengupdate property private tersebut
Pada materi membuat object pada class OOP di dart sebelumnya, anda membuat property secara public, sehingga class / object eksternal lain bisa dengan leluasa langsung mengganti property dari object tersebut. Ini akan menjadi resiko tersendiri.
- Penyembunyian Data: Encapsulation menyembunyikan data dari dunia luar. Ini mencegah data diakses oleh kode di luar class. Ini dikenal sebagai penyembunyian data.
- Mudah di-testing: Encapsulation memungkinkan Anda menguji class secara terisolasi. Ini akan memungkinkan Anda menguji kelas tanpa menguji kode di luar kelas.
- Fleksibilitas: Encapsulation memungkinkan Anda mengubah implementasi class tanpa mempengaruhi kode di luar kelas.
- Keamanan: Encapsulation memungkinkan Anda membatasi akses ke anggota class. Ini akan memungkinkan Anda membatasi akses ke anggota class dari kode di luar library.
class Employee {
// property private
int? _id;
String? _name;
// Method getter untuk mengakses property private _id
int getId() {
return _id!;
}
// Method getter untuk mengakses property private _name
String getName() {
return _name!;
}
// Method setter untuk meng-update property private _id
void setId(int id) {
this._id = id;
}
// Method setter untuk meng-update property private _name
void setName(String name) {
this._name = name;
}
}
void main() {
// Membuat object dari class Employee
Employee employee = new Employee();
// Memberi nilai ke object menggunakan setter
employee.setId(1);
employee.setName("John");
// Menerima nilai dari object menggunakan getter
print("Id: ${employee.getId()}");
print("Name: ${employee.getName()}");
}
Sekarang coba kamu akses property langsung dari object dengan cara seperti berikut:
...
void main() {
var employee = Employee();
employee._name = "John"; // Bisa berfungsi dan tidak eror, tapi kenapa?
print(employee.getName());
}
Alasannya adalah penggunaan underscore (_) sebelum nama variabel atau method membuatnya menjadi private library, bukan private class. Ini berarti bahwa variabel atau method hanya terlihat oleh library tempat itu dideklarasikan. Ini tidak terlihat oleh library lain. Dengan kata lain, library adalah satu file. Jika Anda menulis method utama di file terpisah, ini tidak akan berfungsi.
Solusi: Untuk melihat private property beraksi, Anda harus membuat file terpisah untuk class tersebut dan mengimpornya ke dalam file utama (yang memiliki fungsi main()
).
Selain membuat method buatan sendiri seperti setId()
, getId()
dan seterusnya, anda bisa menggunakan setter dan getter bawaan dart seperti contoh berikut:
class Vehicle {
String _model;
int _year;
// Getter method
String get model => _model;
// Setter method
set model(String model) => _model = model;
// Getter method
int get year => _year;
// Setter method
set year(int year) => _year = year;
}
void main() {
var vehicle = Vehicle();
vehicle.model = "Toyota";
vehicle.year = 2019;
print(vehicle.model);
print(vehicle.year);
}
Inheritance atau pewarisan adalah konsep dalam pemrograman berorientasi objek (OOP) di mana sebuah class dapat mewarisi properti dan metode dari class lain. Class yang mewarisi disebut subclass atau child class, sedangkan class yang memberikan warisan disebut superclass atau parent class. Menggunakan keyword extends
untuk menerima warisan dari parent class.
class ParentClass {
// Parent class code
}
class ChildClass extends ParentClass {
// Child class code
}
Catatan: Setiap kali Anda menggunakan pewarisan, ia selalu membuat hubungan "adalah" antara class induk dan anak, seperti Mahasiswa adalah Orang, Truk adalah Kendaraan, Sapi adalah Hewan, dan sebagainya.
Dart mendukung inheritance tunggal, berarti class anak hanya bisa mewarisi dari satu class induk. Dart tidak mendukung multi inheritance yang berarti class anak tidak dapat mewarisi dari beberapa class induk.
- Penggunaan Kembali Kode (Code Reusability): Menghindari duplikasi kode dengan menggunakan properti dan metode yang sudah ada.
- Struktur Hirarki: Membentuk struktur hierarki antara class.
class Orang {
// Property
String? nama;
int? umur;
// Method
void tampil() {
print("Nama: $nama");
print("Umur: $umur");
}
}
// Disini class Murid akan mewarisi property dan method dari class Orang
class Murid extends Orang {
// property
String? namaSekolah;
String? alamatSekolah;
// Method
void tampilInfoSekolah() {
print("Nama Sekolah: $namaSekolah");
print("Alamat Sekolah: $alamatSekolah");
}
}
void main() {
// Membuat object dari class Murid
var murid = Murid();
murid.nama = "Joko";
murid.umur = 16;
murid.namaSekolah = "SMA N 1";
murid.alamatSekolah = "Jepara";
murid.tampil();
murid.tampilInfoSekolah();
}
- single inheritance: pewarisan dari satu ParentClass ke satu ChildClass
-- Kendaraan // class Kendaraan
|-- Mobil // class Mobil extends Kendaraan
- multilevel inheritance:pewarisan dari satu ParentClass ke satu ChildClass kemudian ke bawah subclassnya lagi.
-- Kendaraan // class Kendaraan
|-- Mobil // class Mobil extends Kendaraan
|-- Tesla // class Tesla extends Mobil
- hierachical inheritance: pewarisan dari satu ParentClass ke dua ChildClass
-- Kendaraan // class Kendaraan
|-- Mobil // class Mobil extends Kendaraan
|-- Motor // class Motor extends Kendaraan
- multiple inheritance: pewarisan dari dua ParentClass atau lebih ke satu ChildClass. Ini tidak didukung oleh dart.
-- Buah // class Buah
-- Sayuran // class Sayuran
|-- Tomat // class Tomat extends Buah, Sayuran
class Mobil {
// Property
String? nama;
double? harga;
}
class Tesla extends Mobil {
// Method untuk menampilkan nilai dari property
void tampil() {
print("Nama: ${nama}");
print("Harga: ${harga}");
}
}
class Model3 extends Tesla {
// Property
String? warna;
// Method untuk menampilkan nilai dari property
void tampil() {
super.tampil();
print("Warna: ${warna}");
}
}
void main() {
// Membuat object dari class Model3
Model3 m = new Model3();
// memberikan nilai ke object
m.nama = "Tesla Model 3";
m.harga = 50000.00;
m.warna = "Merah";
// Menampilkan nilai dari object
m.tampil();
}
class Bangun {
// Properties
double? diameter1;
double? diameter2;
}
class Lingkaran extends Bangun {
// Method untuk menghitung luas lingkaran
double luas() {
return 3.14 * diameter1! * diameter2!;
}
}
class Segitiga extends Bangun {
// Method untuk menghitung luas segitiga
double luas() {
return 0.5 * diameter1! * diameter2!;
}
}
void main() {
// Membuat object dari class Lingkaran
Lingkaran lingkaran = new Lingkaran();
// memberikan nilai diameter ke object
lingkaran.diameter1 = 10.0;
lingkaran.diameter2 = 20.0;
// Tampilkan luas dari lingkaran
print("Luas lingkaran: ${lingkaran.luas()}");
// Membuat object dari class Segitiga
Segitiga segitiga = new Segitiga();
// memberikan nilai ke object
segitiga.diameter1 = 10.0;
segitiga.diameter2 = 20.0;
// Tampilkan luas segigita
print("Luas segitiga: ${segitiga.luas()}");
}
// Parent Class
class Binatang {
String jenis;
Binatang(this.jenis);
void bersuara() {
print('Sebuah binatang dari jenis $jenis bersuara.');
}
}
// Child Class yang mewarisi dari Binatang
class Kucing extends Binatang {
String jenisBulu;
Kucing(String jenis, this.jenisBulu) : super(jenis);
void tidur() {
print('Kucing tidur dengan nyenyak.');
}
}
Keyword super
digunakan untuk merujuk ke superclass (parent class). Dalam contoh di atas, super(jenis)
digunakan untuk memanggil constructor dari superclass saat membuat objek dari subclass.
Poly berarti banyak dan morph berarti bentuk. Polimorfisme adalah kemampuan suatu objek untuk mengambil banyak bentuk. Sebagai manusia, kita memiliki kemampuan untuk mengambil banyak bentuk. Kita bisa menjadi seorang siswa, seorang guru, seorang orang tua, seorang teman, dan sebagainya. Demikian pula, dalam pemrograman berorientasi objek, polimorfisme adalah kemampuan suatu objek untuk mengambil banyak bentuk.
Dalam dunia nyata, polimorfisme adalah memperbarui atau memodifikasi fitur, fungsi, atau implementasi yang sudah ada dalam class induk.
Method overriding adalah teknik di mana Anda dapat membuat sebuah method dalam class anak yang memiliki nama yang sama dengan method dalam class induk. Method dalam class anak menggantikan method dalam class induk.
class ParentClass{
void functionName(){
//isi function di parent
}
}
class ChildClass extends ParentClass{
@override
void functionName(){
//isi function di child yang berbeda dari parent
}
}
- Fleksibilitas: Objek dapat mengambil banyak bentuk sesuai dengan kebutuhan.
- Pemeliharaan Kode: Mempermudah perubahan pada tingkat kelas induk tanpa mempengaruhi kelas anak.
- Keterbacaan Kode: Menyederhanakan kode dan membuatnya lebih mudah dimengerti.
Dalam contoh di bawah ini, terdapat sebuah class bernama Binatang dengan sebuah method bernama makan()
. Method makan()
ini di-overwrite dalam class anak yang bernama Kucing.
class Binatang {
void makan() {
print("Binatang sedang makan");
}
}
class Kucing extends Binatang {
@override
void makan() {
print("Kucing sedang makan");
}
}
void main() {
Binatang binatang = Binatang();
binatang.makan();
Kucing kucing = Kucing();
kucing.makan();
}
Catatan: Jika Anda tidak menulis @override
, program tetap berjalan. Namun, praktek terbaik adalah dengan menuliskan @override
.
class Pegawai{
void gaji(){
print("Gaji pegawai adalah \$1000.");
}
}
class Manager extends Pegawai{
@override
void gaji(){
print("Gaji manager adalah \$2000.");
}
}
class Developer extends Pegawai{
@override
void gaji(){
print("Gaji developer adalah \$3000.");
}
}
void main(){
Manager manager=Manager();
Developer developer=Developer();
manager.gaji();
developer.gaji();
}
Abstract adalah salah satu prinsip dalam Pemrograman Berorientasi Objek (OOP) yang memungkinkan kita untuk menyembunyikan detail implementasi dan hanya mengekspos fungsionalitas penting dari suatu object.
Class abstract adalah class yang tidak dapat diinisialisasi. Biasanya digunakan untuk mendefinisikan perilaku suatu class yang dapat diwariskan ke class lain. Class abstract dideklarasikan menggunakan kata kunci abstract.
Method abstract adalah method yang dideklarasikan dalam class abstrak tanpa memberikan implementasi.Subclass dari class abstract harus mengimplementasikan semua method abstract yang dideklarasikan oleh class induk.
abstract class ClassName {
//Body of abstract class
method1();
method2();
}
- Rancangan Terstruktur: Abstraksi memungkinkan perancangan yang terstruktur dan pemisahan antara antarmuka dan implementasi.
- Fleksibilitas: Memungkinkan penambahan fungsionalitas pada masa mendatang tanpa mempengaruhi kelas-kelas yang sudah ada.
- Pemeliharaan Kode: Mempermudah pemeliharaan dan perubahan dengan mengisolasi detail implementasi.
//membuat class abstract beserta method abstract
abstract class Kendaraan {
void jalankan();
void berhenti();
}
//implementasi class abstract
class Mobil extends Kendaraan {
@override
void jalankan() {
print('Mobil mulai bergerak.');
}
@override
void berhenti() {
print('Mobil berhenti.');
}
}
//menggunakan class abstract
void main() {
// Membuat object dari class nyata Mobil
Kendaraan mobil = Mobil();
// Memanggil method dari kelas abstract
mobil.jalankan();
mobil.berhenti();
}
Tugas Latihan 2
- Buat class induk Hewan dengan properti nama dan metode suara(). Selanjutnya, buat class anak Kucing yang merupakan turunan dari Hewan dan tambahkan properti jenisBulu. Buat objek dari class Kucing dan panggil metode suara().
- Buat class RekeningBank dengan properti saldo dan metode setor dan tarik. Implementasikan encapsulation agar saldo tidak dapat diakses langsung dari luar class. Buat objek dari class RekeningBank dan lakukan beberapa transaksi.
- Buat class BangunDatar dengan metode hitungLuas. Selanjutnya, buat class turunan Persegi dan Segitiga yang override metode hitungLuas. Buat objek dari kedua class tersebut dan panggil metode hitungLuas untuk masing-masing.
- Buat abstract class Bentuk dengan metode abstrak hitungLuas. Selanjutnya, buat class Lingkaran yang merupakan turunan dari Bentuk dan implementasikan metode hitungLuas. Buat objek dari class Lingkaran dan panggil metode hitungLuas.