interface Peminjaman {
    int LAMA_PINJAM_HARI = 14;

    void pinjam();

    // Default method: implementasi bawaan yang diwarisi implementor lama.
    default int perpanjang() {
        return hitungTambahan(LAMA_PINJAM_HARI, 7);
    }

    // Static method: helper yang melekat pada interface, bukan pada objek.
    static int dendaPerHari() {
        return 1000;
    }

    // Private method (Java 9+): helper bersama untuk method default.
    private int hitungTambahan(int dasar, int tambahan) {
        return dasar + tambahan;
    }
}

// Implementor lama: hanya mengimplementasikan pinjam().
// Default method perpanjang() diwarisi apa adanya tanpa mengubah class ini.
class BukuLama implements Peminjaman {
    private final String judul;

    public BukuLama(String judul) {
        this.judul = judul;
    }

    @Override
    public void pinjam() {
        System.out.println(judul + " dipinjam");
    }
}

// Implementor baru: mengganti default dengan aturan miliknya sendiri.
class Majalah implements Peminjaman {
    private final String judul;

    public Majalah(String judul) {
        this.judul = judul;
    }

    @Override
    public void pinjam() {
        System.out.println(judul + " dipinjam");
    }

    @Override
    public int perpanjang() {
        return LAMA_PINJAM_HARI;
    }
}

public class EvolusiPeminjaman {
    public static void main(String[] args) {
        BukuLama buku = new BukuLama("Java Dasar");
        buku.pinjam();
        System.out.println("Perpanjangan buku: " + buku.perpanjang() + " hari");

        Majalah majalah = new Majalah("Majalah Teknologi");
        majalah.pinjam();
        System.out.println("Perpanjangan majalah: " + majalah.perpanjang() + " hari");

        // Static method dipanggil lewat nama interface, tanpa objek.
        System.out.println("Denda per hari: Rp" + Peminjaman.dendaPerHari());
    }
}
