Menu
CoddyTech

Sistem Perbankan

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

Tantangan ini menugaskanmu membangun Sistem Perbankan yang memodelkan operasi keuangan di 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. Sebuah 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.

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

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 bangun Sistem Perbankan lengkap yang menunjukkan penguasaanmu atas prinsip OOP! Kamu akan membuat sistem dengan berbagai tipe rekening, 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 abstrak yang mewakili rekening 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 abstrak getAccountType() yang mengembalikan String. Implementasikan method getDetails() yang mengembalikan "[accountNumber] ([accountType]): $[balance]" dengan saldo yang 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 menaikkan 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 melebihi batas ini.
  • Bank.java: Buat class yang mengelola rekening menggunakan ArrayList. Sertakan method berikut:
    • addAccount(Account account) - menambahkan rekening ke bank
    • findAccount(String accountNumber) - mengembalikan Account atau null jika tidak ditemukan
    • transfer(String fromAccount, String toAccount, double amount) - mentransfer uang antar rekening, dengan melempar InsufficientFundsException jika rekening sumber tidak memiliki dana yang cukup. Jika berhasil, kembalikan "Transferred $[amount] from [fromAccount] to [toAccount]"
    • getTotalDeposits() - mengembalikan jumlah semua saldo rekening
  • Main.java: Bangun 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 diproses, cetak --- Bank Summary ---, lalu detail setiap rekening (menggunakan getDetails()), dan terakhir Total deposits: $[total] yang diformat hingga 2 angka desimal.

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

Contohnya, 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 rekening checking mengizinkan penarikan $600 meskipun saldonya hanya $500: itulah perlindungan overdraft! Rekening savings memperoleh 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 instans Bank
        
        // TODO: Pisahkan input berdasarkan koma untuk mendapatkan setiap perintah
        
        // TODO: Proses setiap perintah:
        // - SAVINGS:accountNumber:balance:interestRate -> Buat SavingsAccount, lalu cetak "Account created: [accountNumber]"
        // - CHECKING:accountNumber:balance:overdraftLimit -> Buat CheckingAccount, lalu cetak "Account created: [accountNumber]"
        // - DEPOSIT:accountNumber:amount -> Setorkan dana, lalu cetak "Deposited $[amount] to [accountNumber]"
        // - WITHDRAW:accountNumber:amount -> Tarik dana, lalu cetak pesan keberhasilan atau "Withdrawal failed: [accountNumber]"
        // - TRANSFER:fromAccount:toAccount:amount -> Transfer dana, lalu cetak pesan keberhasilan atau "Transfer failed: [exception message]"
        // - INTEREST:accountNumber -> Terapkan bunga, lalu 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