Masukkan Password
68 Practice Exercise Chapter 6 | Object Oriented Programming Practice Exercise | Learn Dart | Learn OOP
Teks tersebut membahas latihan Chapter 6 pemrograman Dart, terutama tentang class, object, constructor, enum, inheritance, getter/setter, interface, dan factory constructor.
Saya akan menjelaskan satu per satu dengan bahasa sederhana, sekaligus memberi contoh kode Dart agar lebih mudah dipahami.
Gambaran Besar Materinya
Ada 6 latihan:
- Class Laptop + membuat 3 object
- Class House + Constructor + List
- Enum Gender
- Inheritance: Animal → Cat
- Private property + Getter & Setter pada Camera
- Interface + Implement + Factory Constructor pada AppleLaptop
Sebelum masuk ke soal, pahami dulu beberapa istilah dasar.
1. Class
Class adalah cetakan/template untuk membuat object.
Misalnya:
class Laptop {
int id;
String name;
int ram;
}
Laptop adalah class.
Bayangkan class sebagai desain sebuah laptop.
2. Object
Object adalah benda nyata yang dibuat berdasarkan class.
Laptop laptop1 = Laptop();
Jadi:
Class = cetakan Object = hasil yang dibuat dari cetakan
Kita bisa membuat banyak object dari satu class.
Soal 1 — Class Laptop
Soal
Create a class Laptop with properties ID, name, RAM. Create three objects of it and print all details.
Artinya:
Buat class bernama Laptop yang mempunyai:
idnameram
Kemudian buat 3 object Laptop dan tampilkan semua informasinya.
Langkah 1: Buat class
class Laptop {
int id;
String name;
int ram;
}
Class tersebut memiliki 3 property.
Contohnya:
id = 1
name = "Asus"
ram = 8
Langkah 2: Buat object
Kita bisa membuat 3 object:
var laptop1 = Laptop();
var laptop2 = Laptop();
var laptop3 = Laptop();
Kemudian mengisi datanya:
laptop1.id = 1;
laptop1.name = "Asus";
laptop1.ram = 8;
laptop2.id = 2;
laptop2.name = "Acer";
laptop2.ram = 16;
laptop3.id = 3;
laptop3.name = "Lenovo";
laptop3.ram = 4;
Langkah 3: Print
print(laptop1.id);
print(laptop1.name);
print(laptop1.ram);
Atau lebih rapi:
print("ID: ${laptop1.id}");
print("Name: ${laptop1.name}");
print("RAM: ${laptop1.ram} GB");
Versi lengkap
class Laptop {
int id;
String name;
int ram;
}
void main() {
var laptop1 = Laptop();
laptop1.id = 1;
laptop1.name = "Asus";
laptop1.ram = 8;
var laptop2 = Laptop();
laptop2.id = 2;
laptop2.name = "Acer";
laptop2.ram = 16;
var laptop3 = Laptop();
laptop3.id = 3;
laptop3.name = "Lenovo";
laptop3.ram = 4;
print("Laptop 1");
print("ID: ${laptop1.id}");
print("Name: ${laptop1.name}");
print("RAM: ${laptop1.ram} GB");
print("\nLaptop 2");
print("ID: ${laptop2.id}");
print("Name: ${laptop2.name}");
print("RAM: ${laptop2.ram} GB");
print("\nLaptop 3");
print("ID: ${laptop3.id}");
print("Name: ${laptop3.name}");
print("RAM: ${laptop3.ram} GB");
}
Intinya
Soal pertama hanya ingin kamu memahami:
Class → Object → Property → Isi data → Print
Soal 2 — Class House + Constructor + List
Soal:
Create a class House with properties ID, name and price. Create a constructor of it. Create three objects, add them to a list and print all details.
Di soal ini ada 3 konsep baru:
- Constructor
- Object
- List
Apa itu Constructor?
Constructor adalah function khusus yang dipanggil ketika kita membuat object.
Misalnya:
House house1 = House(1, "House A", 500000);
Angka dan teks tersebut bisa langsung diberikan kepada constructor.
Daripada melakukan:
var house1 = House();
house1.id = 1;
house1.name = "House A";
house1.price = 500000;
kita bisa langsung:
var house1 = House(1, "House A", 500000);
Lebih praktis.
Membuat class
class House {
int id;
String name;
double price;
House(this.id, this.name, this.price);
}
Bagian:
House(this.id, this.name, this.price);
adalah constructor.
Artinya ketika kita membuat:
House(1, "House A", 500000);
maka:
id → 1
name → House A
price → 500000
Membuat 3 object
var house1 = House(1, "House A", 500000);
var house2 = House(2, "House B", 750000);
var house3 = House(3, "House C", 1000000);
Memasukkan object ke List
List digunakan untuk menyimpan banyak data.
List<House> houses = [];
Kemudian:
houses.add(house1);
houses.add(house2);
houses.add(house3);
Sekarang houses berisi:
house1
house2
house3
Kita bisa menggunakan loop:
for (var house in houses) {
print(house.name);
}
Program lengkap
class House {
int id;
String name;
double price;
House(this.id, this.name, this.price);
}
void main() {
var house1 = House(1, "House A", 500000);
var house2 = House(2, "House B", 750000);
var house3 = House(3, "House C", 1000000);
List<House> houses = [];
houses.add(house1);
houses.add(house2);
houses.add(house3);
for (var house in houses) {
print("ID: ${house.id}");
print("Name: ${house.name}");
print("Price: ${house.price}");
print("----------------");
}
}
Konsep yang harus dipahami
House(1, "House A", 500000)
→ membuat object.
List<House>
→ List yang hanya berisi object House.
houses.add(house1)
→ memasukkan object ke List.
for (var house in houses)
→ mengambil object satu per satu dari List.
Soal 3 — Enum Gender
Soal:
Create an enum class for gender: male, female and others, and print all values.
Di sini kita belajar enum.
Apa itu Enum?
Enum digunakan ketika kita memiliki sekumpulan pilihan yang sudah ditentukan.
Contohnya gender:
Male
Female
Others
Kita tidak ingin seseorang memasukkan sembarang nilai seperti:
banana
computer
abc
Maka kita bisa menggunakan enum.
enum Gender {
male,
female,
others
}
Sekarang Gender hanya memiliki tiga pilihan tersebut.
Print semua nilai
Kita bisa menggunakan:
for (var gender in Gender.values) {
print(gender);
}
Output:
Gender.male
Gender.female
Gender.others
Kalau ingin hanya mendapatkan nama:
for (var gender in Gender.values) {
print(gender.name);
}
Output:
male
female
others
Program lengkap
enum Gender {
male,
female,
others
}
void main() {
for (var gender in Gender.values) {
print(gender.name);
}
}
Yang perlu diingat
Gender.values
artinya:
Ambil semua nilai yang ada di enum Gender.
Soal 4 — Inheritance Animal → Cat
Ini bagian yang penting karena mulai masuk ke Inheritance (pewarisan).
Soal:
Create a class Animal with properties ID, name and color. Create another class Cat and extend it from Animal. Add a new property sound. Create an object of Cat and print all details.
Strukturnya:
Animal
├── id
├── name
└── color
↑
│ diwarisi
│
Cat
└── sound
Cat adalah turunan dari Animal.
Apa itu Inheritance?
Inheritance berarti sebuah class dapat mewarisi property dan method dari class lain.
Misalnya:
class Animal {
int id;
String name;
String color;
}
Kemudian:
class Cat extends Animal {
String sound;
}
Artinya:
Cat mendapatkan property milik Animal.
Jadi object Cat mempunyai:
id
name
color
sound
Walaupun id, name, dan color ditulis di Animal.
Contoh program
class Animal {
int id;
String name;
String color;
Animal(this.id, this.name, this.color);
}
class Cat extends Animal {
String sound;
Cat(int id, String name, String color, this.sound)
: super(id, name, color);
}
Perhatikan bagian:
extends Animal
Artinya Cat mewarisi Animal.
Kemudian:
super(id, name, color)
digunakan untuk memanggil constructor dari parent class, yaitu Animal.
Membuat object Cat
var cat = Cat(
1,
"Kitty",
"White",
"Meow"
);
Object cat sekarang mempunyai:
id = 1
name = Kitty
color = White
sound = Meow
Kita bisa print:
print("ID: ${cat.id}");
print("Name: ${cat.name}");
print("Color: ${cat.color}");
print("Sound: ${cat.sound}");
Program lengkap
class Animal {
int id;
String name;
String color;
Animal(this.id, this.name, this.color);
}
class Cat extends Animal {
String sound;
Cat(int id, String name, String color, this.sound)
: super(id, name, color);
}
void main() {
var cat = Cat(
1,
"Kitty",
"White",
"Meow",
);
print("ID: ${cat.id}");
print("Name: ${cat.name}");
print("Color: ${cat.color}");
print("Sound: ${cat.sound}");
}
Konsep penting
class Cat extends Animal
= Cat adalah anak/turunan Animal.
super(...)
= memanggil constructor parent.
Soal 5 — Private Property + Getter & Setter
Soal:
Create a class Camera with private properties ID, brand, color and price. Create getter and setter to get and set values. Create three objects and print all details.
Ini membahas encapsulation.
Apa itu Private Property?
Di Dart, property yang diawali underscore _ bersifat private terhadap library/class tertentu.
Contohnya:
class Camera {
int _id;
String _brand;
String _color;
double _price;
}
Perhatikan:
_id
_brand
_color
_price
Ada _.
Kenapa menggunakan private?
Misalnya harga kamera:
camera._price = -500;
Kita tentu tidak ingin harga menjadi negatif.
Dengan getter dan setter, kita bisa mengontrol bagaimana data dibaca dan diubah.
Getter
Getter digunakan untuk mengambil/membaca nilai.
Contoh:
int get id {
return _id;
}
Artinya ketika kita melakukan:
camera.id
Dart akan mengambil nilai dari:
_id
Setter
Setter digunakan untuk mengubah nilai.
set id(int id) {
_id = id;
}
Jadi:
camera.id = 10;
akan mengubah:
_id
menjadi 10.
Contoh class Camera
class Camera {
int _id;
String _brand;
String _color;
double _price;
int get id => _id;
set id(int value) {
_id = value;
}
String get brand => _brand;
set brand(String value) {
_brand = value;
}
String get color => _color;
set color(String value) {
_color = value;
}
double get price => _price;
set price(double value) {
_price = value;
}
}
Kemudian kita bisa membuat object:
var camera1 = Camera();
camera1.id = 1;
camera1.brand = "Canon";
camera1.color = "Black";
camera1.price = 1000;
Dan membaca:
print(camera1.id);
print(camera1.brand);
print(camera1.color);
print(camera1.price);
Kenapa tidak langsung menggunakan _price?
Karena _price adalah data internal.
Kita menyediakan pintu untuk mengaksesnya:
Camera
┌───────────────┐
│ _price │
│ │
│ getter → baca │
│ setter → ubah │
└───────────────┘
Ini adalah salah satu konsep penting dalam OOP (Object-Oriented Programming), yaitu encapsulation.
Soal 6 — Interface + Factory Constructor
Ini soal yang paling kompleks.
Soalnya meminta:
- Buat interface
Laptop - Tambahkan method
turnOn - Buat
AppleLaptop - Implement
Laptop - Override
turnOn - Buat factory constructor
- Return object
AppleLaptop - Buat object menggunakan factory
- Panggil
turnOn
Bagian 1 — Membuat interface
Dalam Dart modern, sebuah class secara otomatis dapat digunakan sebagai interface.
Kita dapat membuat:
abstract class Laptop {
void turnOn();
}
abstract berarti class tersebut menjadi class abstrak dan kita tidak membuat object langsung dari class tersebut.
Kita hanya menentukan:
Laptop harus mempunyai method
turnOn().
Bagian 2 — Membuat AppleLaptop
class AppleLaptop implements Laptop {
@override
void turnOn() {
print("Apple laptop is turned on");
}
}
Perhatikan:
implements Laptop
Artinya:
AppleLaptop berjanji untuk mengikuti interface Laptop.
Karena Laptop mempunyai:
void turnOn();
maka AppleLaptop wajib menyediakan implementasinya.
Apa itu @override?
@override
void turnOn() {
...
}
@override berarti kita sedang mengimplementasikan/menggantikan method yang berasal dari parent/interface.
Bagian 3 — Factory Constructor
Sekarang kita tambahkan:
factory AppleLaptop() {
return AppleLaptop._internal();
}
Tetapi agar tidak terjadi pemanggilan factory yang berulang, biasanya dibuat private constructor.
Contoh:
class AppleLaptop implements Laptop {
AppleLaptop._internal();
factory AppleLaptop() {
return AppleLaptop._internal();
}
@override
void turnOn() {
print("Apple laptop is turned on");
}
}
Di sini ada dua constructor:
Private constructor
AppleLaptop._internal();
Factory constructor
factory AppleLaptop() {
return AppleLaptop._internal();
}
Apa sebenarnya Factory Constructor?
Factory constructor memungkinkan kita mengontrol object yang dikembalikan ketika constructor dipanggil.
Contohnya:
factory AppleLaptop() {
return AppleLaptop._internal();
}
Ketika kita menulis:
var laptop = AppleLaptop();
yang dikembalikan sebenarnya adalah object dari:
AppleLaptop._internal();
Untuk latihan dasar, pahami sederhananya:
Factory constructor adalah constructor yang dapat menentukan object apa yang akan dikembalikan.
Factory sering berguna ketika proses pembuatan object membutuhkan logika tertentu, caching, singleton, atau memilih implementasi tertentu.
Bagian 4 — Memanggil turnOn
Setelah object dibuat:
var laptop = AppleLaptop();
kita panggil:
laptop.turnOn();
Output:
Apple laptop is turned on
Program Lengkap Soal 6
abstract class Laptop {
void turnOn();
}
class AppleLaptop implements Laptop {
AppleLaptop._internal();
factory AppleLaptop() {
return AppleLaptop._internal();
}
@override
void turnOn() {
print("Apple laptop is turned on");
}
}
void main() {
var laptop = AppleLaptop();
laptop.turnOn();
}
Hubungan Semua Konsep
Kalau dirangkum, Chapter 6 ini sebenarnya sedang mengajarkan dasar-dasar OOP di Dart.
Urutannya kira-kira seperti ini:
CLASS
↓
OBJECT
↓
CONSTRUCTOR
↓
LIST OF OBJECTS
↓
ENUM
↓
INHERITANCE
↓
ENCAPSULATION
↓
GETTER & SETTER
↓
ABSTRACT CLASS / INTERFACE
↓
IMPLEMENT
↓
OVERRIDE
↓
FACTORY CONSTRUCTOR
Perbedaan Konsep yang Sering Membingungkan
Class vs Object
class Laptop {}
Laptop = class/cetakan.
var laptop = Laptop();
laptop = object.
Constructor vs Method
Constructor:
House(this.id, this.name);
Digunakan ketika object dibuat.
Method:
void turnOn() {
print("Laptop is on");
}
Digunakan untuk melakukan suatu tindakan.
Getter vs Setter
Getter → membaca
print(camera.price);
Setter → mengubah
camera.price = 500;
extends vs implements
extends
class Cat extends Animal {}
Artinya:
Cat mewarisi Animal.
Cat mendapatkan property/method dari Animal.
implements
class AppleLaptop implements Laptop {}
Artinya:
AppleLaptop mengikuti kontrak/interface Laptop.
AppleLaptop harus menyediakan method yang diwajibkan oleh Laptop.
Cara Mudah Mengingat Soal-Soalnya
| Soal | Konsep utama |
|---|---|
| Laptop | Class & Object |
| House | Constructor & List |
| Gender | Enum |
| Animal → Cat | Inheritance |
| Camera | Private property, Getter & Setter |
| AppleLaptop | Interface, Implement, Override, Factory |
Jadi kalau kamu sedang belajar untuk ujian/praktik, jangan hanya menghafal kode. Pahami hubungan konsepnya:
Class digunakan sebagai cetakan → kita membuat Object → Constructor membantu mengisi data saat object dibuat → Inheritance memungkinkan class mewarisi class lain → Getter/Setter mengontrol akses data → Interface menentukan aturan yang harus dipenuhi → Factory mengontrol proses pengembalian object.
Itulah inti dari keenam latihan tersebut.