Menu
CoddyTech

Sistem Perbankan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 85 dari 87.

Tantangan ini memintamu membangun Sistem Perbankan yang memodelkan operasi keuangan dunia nyata menggunakan prinsip OOP.

Sistemmu harus menangani berbagai tipe akun seperti SavingsAccount dan CheckingAccount, yang keduanya mewarisi class dasar Account. Setiap tipe akun memiliki perilaku unik: akun tabungan mungkin memperoleh bunga, sedangkan akun giro mungkin memiliki perlindungan cerukan.

Pikirkan cara memodelkan transaksi. Interface seperti Transactable dapat mendefinisikan method untuk deposit() dan withdraw(). Pertimbangkan untuk menggunakan exception khusus seperti InsufficientFundsException agar operasi yang tidak valid dapat ditangani dengan baik.

class Bank mungkin mengelola beberapa rekening dan pelanggan, yang menunjukkan komposisi. Kamu bisa menerapkan pola Factory untuk membuat berbagai tipe rekening, atau menggunakan pola Observer untuk memberi tahu pelanggan tentang perubahan rekening.

Fokus pada enkapsulasi untuk melindungi data sensitif seperti saldo dan nomor rekening, serta gunakan polimorfisme untuk memproses berbagai tipe rekening secara seragam.

challenge icon

Tantangan

Mudah

Mari buat Sistem Perbankan lengkap yang menunjukkan penguasaanmu terhadap prinsip OOP! Kamu akan membuat sistem dengan berbagai tipe akun, penanganan transaksi, dan pengelolaan exception yang tepat, semuanya diatur dalam beberapa file.

Kamu akan mengatur kodemu dalam tujuh file:

  • Transactable.java: Buat interface yang menetapkan kontrak untuk operasi keuangan. Interface ini harus mendeklarasikan method deposit(double amount) dan withdraw(double amount), yang keduanya mengembalikan boolean untuk menunjukkan keberhasilan.
  • InsufficientFundsException.java: Buat exception khusus yang memperluas Exception. Konstruktor harus menerima jumlah penarikan yang dicoba dan saldo saat ini, lalu membuat pesan dengan format Insufficient funds: attempted [amount], available [balance].
  • Account.java: Buat class dasar abstract yang mewakili akun bank apa pun. Sertakan field private untuk accountNumber (String) dan balance (double), konstruktor yang menginisialisasi keduanya, getter yang sesuai, setter protected untuk saldo (agar subclass dapat mengubahnya), serta method abstract getAccountType() yang mengembalikan String. Implementasikan method getDetails() yang mengembalikan "[accountNumber] ([accountType]): $[balance]" dengan saldo diformat hingga 2 angka desimal.
  • SavingsAccount.java: Buat class yang memperluas Account dan mengimplementasikan Transactable. Tambahkan field private untuk interestRate (double). Konstruktor menerima accountNumber, saldo awal, dan interestRate. Implementasikan getAccountType() agar mengembalikan "Savings". Untuk deposit(), tambahkan jumlahnya ke saldo dan kembalikan true. Untuk withdraw(), jika jumlahnya melebihi saldo, kembalikan false; jika tidak, kurangi saldo dan kembalikan true. Tambahkan method applyInterest() yang menambah saldo sebesar balance * interestRate (suku bunga disimpan sebagai pecahan, jadi 0.05 berarti 5%).
  • CheckingAccount.java: Buat class yang memperluas Account dan mengimplementasikan Transactable. Tambahkan field private untuk overdraftLimit (double). Konstruktor menerima accountNumber, saldo awal, dan overdraftLimit. Implementasikan getAccountType() agar mengembalikan "Checking". Untuk deposit(), tambahkan jumlahnya dan kembalikan true. Untuk withdraw(), izinkan penarikan jika jumlahnya kurang dari atau sama dengan saldo ditambah overdraftLimit; kembalikan false jika jumlahnya melebihi batas ini.
  • Bank.java: Buat class yang mengelola akun menggunakan ArrayList. Sertakan method:
    • addAccount(Account account) - menambahkan akun ke bank
    • findAccount(String accountNumber) - mengembalikan Account atau null jika tidak ditemukan
    • transfer(String fromAccount, String toAccount, double amount) - mentransfer uang antar akun, dengan melempar InsufficientFundsException jika saldo akun sumber tidak mencukupi. Jika berhasil, kembalikan "Transferred $[amount] from [fromAccount] to [toAccount]"
    • getTotalDeposits() - mengembalikan jumlah semua saldo akun
  • Main.java: Buat sistem perbankanmu! Kamu akan menerima string perintah yang dipisahkan koma:
    • SAVINGS:accountNumber:balance:interestRate
    • CHECKING:accountNumber:balance:overdraftLimit
    • DEPOSIT:accountNumber:amount
    • WITHDRAW:accountNumber:amount
    • TRANSFER:fromAccount:toAccount:amount
    • INTEREST:accountNumber

    Proses setiap perintah dan cetak:

    • SAVINGS/CHECKING: Account created: [accountNumber]
    • DEPOSIT: Deposited $[amount] to [accountNumber]
    • WITHDRAW: Withdrew $[amount] from [accountNumber] jika berhasil, atau Withdrawal failed: [accountNumber]
    • TRANSFER: Cetak pesan keberhasilan atau Transfer failed: [exception message]
    • INTEREST: Interest applied to [accountNumber]

    Setelah semua perintah dijalankan, cetak --- Bank Summary ---, lalu detail setiap akun (menggunakan getDetails()), dan terakhir Total deposits: $[total] yang diformat hingga 2 angka desimal.

Kamu akan menerima satu input: string perintah yang dipisahkan koma.

Misalnya, dengan input SAVINGS:SAV001:1000.00:0.05,CHECKING:CHK001:500.00:200.00,DEPOSIT:SAV001:250.00,WITHDRAW:CHK001:600.00,TRANSFER:SAV001:CHK001:100.00,INTEREST:SAV001, outputmu akan menjadi:

Account created: SAV001
Account created: CHK001
Deposited $250.00 to SAV001
Withdrew $600.00 from CHK001
Transferred $100.00 from SAV001 to CHK001
Interest applied to SAV001
--- Bank Summary ---
SAV001 (Savings): $1207.50
CHK001 (Checking): $0.00
Total deposits: $1207.50

Perhatikan bahwa akun checking mengizinkan penarikan $600 meskipun saldonya hanya $500: itulah cara kerja perlindungan overdraft! Akun savings mendapatkan bunga 5% dari saldonya setelah transfer. Tantangan ini menggabungkan pewarisan, interface, polimorfisme, exception khusus, dan enkapsulasi dalam aplikasi perbankan yang realistis!

Coba sendiri

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: Buat instance Bank
        
        // TODO: Pisahkan input dengan koma untuk mendapatkan setiap perintah
        
        // TODO: Proses setiap perintah:
        // - SAVINGS:accountNumber:balance:interestRate -> Buat SavingsAccount, cetak "Account created: [accountNumber]"
        // - CHECKING:accountNumber:balance:overdraftLimit -> Buat CheckingAccount, cetak "Account created: [accountNumber]"
        // - DEPOSIT:accountNumber:amount -> Setor dana dan cetak "Deposited $[amount] to [accountNumber]"
        // - WITHDRAW:accountNumber:amount -> Tarik dana dan cetak pesan berhasil atau "Withdrawal failed: [accountNumber]"
        // - TRANSFER:fromAccount:toAccount:amount -> Transfer dana dan cetak pesan berhasil atau "Transfer failed: [exception message]"
        // - INTEREST:accountNumber -> Terapkan bunga dan cetak "Interest applied to [accountNumber]"
        
        // TODO: Setelah semua perintah diproses, cetak "--- Bank Summary ---"
        
        // TODO: Cetak detail setiap akun menggunakan getDetails()
        
        // TODO: Cetak "Total deposits: $[total]" dengan format 2 angka di belakang koma
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online