Praktik Mandiri 2: Konsep OOP dalam Java

1. Encapsulation (Enkapsulasi)

Konsep:

  • Membungkus data (atribut) dan metode dalam satu unit (class).
  • Menggunakan access modifier (privatepublicprotected) untuk mengontrol akses data.
  • Menggunakan getter dan setter untuk mengakses/memodifikasi data.

Contoh:

public class Student {
    // Atribut private (terenkapsulasi)
    private String name;
    private int age;

    // Constructor
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter untuk name
    public String getName() {
        return name;
    }

    // Setter untuk age (dengan validasi)
    public void setAge(int age) {
        if (age > 0) {
            this.age = age;
        } else {
            System.out.println("Umur tidak valid!");
        }
    }

    // Method untuk menampilkan info
    public void displayInfo() {
        System.out.println("Nama: " + name + ", Umur: " + age);
    }
}

// Penggunaan
public class Main {
    public static void main(String[] args) {
        Student student1 = new Student("Alice", 20);
        student1.setAge(21); // Mengubah umur
        student1.displayInfo(); // Output: Nama: Alice, Umur: 21
    }
}

Latihan:

  1. Buat class BankAccount dengan atribut private:
    • accountNumber (String)
    • balance (double)
      Tambahkan method deposit()withdraw(), dan getBalance().

2. Inheritance (Pewarisan)

Konsep:

  • Class anak (subclass) mewarisi atribut dan metode dari class induk (superclass).
  • Menggunakan keyword extends.

Contoh:

// Superclass
class Vehicle {
    protected String brand;

    public Vehicle(String brand) {
        this.brand = brand;
    }

    public void startEngine() {
        System.out.println("Mesin " + brand + " menyala.");
    }
}

// Subclass
class Car extends Vehicle {
    private int numOfDoors;

    public Car(String brand, int numOfDoors) {
        super(brand); // Memanggil constructor superclass
        this.numOfDoors = numOfDoors;
    }

    // Method tambahan di subclass
    public void honk() {
        System.out.println("Tin! Tin!");
    }
}

// Penggunaan
public class Main {
    public static void main(String[] args) {
        Car myCar = new Car("Toyota", 4);
        myCar.startEngine(); // Output: Mesin Toyota menyala.
        myCar.honk();
    }
}

Latihan:

  1. Buat superclass Animal dengan metode eat() dan sleep().
    Buat subclass Cat yang menambahkan metode meow().

3. Polymorphism (Polimorfisme)

Konsep:

  • Kemampuan objek untuk memiliki banyak bentuk.
  • Overriding: Subclass mengubah implementasi metode dari superclass.
  • Overloading: Membuat metode dengan nama sama tetapi parameter berbeda.

Contoh (Overriding):

class Animal {
    public void sound() {
        System.out.println("Hewan mengeluarkan suara.");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Guk! Guk!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        myDog.sound(); // Output: Guk! Guk!
    }
}

Contoh (Overloading):

class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }
}

Latihan:

  1. Buat class MathUtils dengan metode multiply() yang bisa menerima 2 atau 3 parameter integer.
  2. Override metode toString() di class Student untuk menampilkan informasi spesifik.

4. Abstraction (Abstraksi)

Konsep:

  • Menyembunyikan detail kompleks dan menampilkan fungsionalitas esensial.
  • Menggunakan abstract class atau interface.

Contoh (Abstract Class):

abstract class Shape {
    abstract double calculateArea(); // Metode abstrak

    public void display() {
        System.out.println("Ini adalah bentuk geometri.");
    }
}

class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double calculateArea() {
        return Math.PI * radius * radius;
    }
}

Contoh (Interface):

interface Playable {
    void play(); // Metode interface (otomatis public abstract)
}

class Guitar implements Playable {
    @Override
    public void play() {
        System.out.println("Memainkan gitar...");
    }
}

Latihan:

  1. Buat interface Drawable dengan metode draw().
    Implementasikan di class Rectangle dan Triangle.

Proyek Akhir: Sistem Manajemen Perpustakaan

Gabungkan semua konsep OOP untuk membuat sistem sederhana:

  1. Class Book dengan atribut titleauthor, dan isBorrowed.
  2. Class Library yang menyimpan daftar buku dan memiliki metode:
    • addBook()
    • borrowBook()
    • returnBook()
  3. Gunakan encapsulation untuk mengontrol akses data buku.
  4. Buat subclass EBook yang mewarisi Book dan menambahkan atribut fileSize.

Contoh Output:

Buku "Java Programming" berhasil dipinjam.
Daftar Buku Tersedia:
1. Clean Code - Penulis: Robert Martin

Tips Belajar:

  1. Pahami perbedaan antara classobject, dan instance.
  2. Latihan dengan membuat relasi antar class (misal: Mahasiswa memiliki Dosen).
  3. Pelajari lebih lanjut tentang composition dan dependency injection.

Semangat belajar! 🚀