본문 바로가기

Programming language/Java

Java - 실무1 [은행]

BankAccount.java

- 은행 계좌 클래스 

public class BankAccount {
    private int balance;
    private Person owner;

    // 은행 계좌 생성자 잔액
    public BankAccount(int pBalance){
        // 잔액이 0 이하로 주어질 때는 balance를 0으로
        if (pBalance < 0){
            balance = 0;
        }
        else{
            balance = pBalance;
        }
    }

    // 은행계좌 생성자 오버로딩 Person
    public BankAccount(Person pOwner){
        owner = pOwner;
        balance = balance;
    }

    // 은행계좌 생성자 오버로딩 잔액, Person
    public BankAccount(int pBalance, Person pOwner){
        if (pBalance < 0){
            balance = 0;
        }
        else{
            balance = pBalance;
        }

        owner = pOwner;
    }
    // Person name의 setter 메소드
    public void set_person(Person new_person) {
        owner = new_person;
    }

    // Person의 name의 getter 메소드
    public String get_person() {
        return owner.get_name();
    }

    // 은행계좌 잔액의 setter 메소드
    public void set_balance(int new_balance) {
        if (new_balance > 0) {
            balance = new_balance;
        }
    }

    // 은행계좌 잔액의 getter 메소드
    public int get_balance() {
        return balance;
    }


    // 파라미터 : 입금할 액수(정수)
    // 리턴 : 성공여부(불린)
    // 계좌에 넣을 입금 메소드
    boolean deposit(int amount) {
        // 입금액이 0보다 작거나 계좌주의 현금보다 입금액이 클 경우는 입금 실패
        // 입금이 실패할 경우는 입금되지 않는다.
        if (amount < 0 || owner.get_cash() < amount) {
            System.out.println("입금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.get_cash() + "원");
            return false;
            // 나머지 경우는 입금 성공
            // 입금이 성공할 경우에는 계좌잔액에 입금액을 더하고 소유주의 현금액은 입금액 만큼 줄어든다.
        } else {
            balance += amount;
            owner.set_cash(owner.get_cash() - amount);
            System.out.println(amount + "원 입금하였습니다. 잔고: " + balance + "원, 현금: " + owner.get_cash() + "원");

            return true;

        }
        
    }

    // 파라미터 : 출금할 액수(정수)
    // 리턴 : 성공여부(불린)
    // 소유주의 계좌에서 출금하는 메소드
    boolean withdraw(int amount) {
        // 출금액이 0보다 작거나 계좌의 잔액보다 출금액이 크면 출금 실패
        // 출금이 실패할 경우 금액 변동 없음.
        if (amount < 0 || balance < amount) {
            System.out.println("출금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.get_cash() + "원");

            return false;
            // 출금에 성공할 경우 소유주 현금이 출금액 만큼 늘고, 계좌 잔액은 출금액 만큼 준다.
        } else {
            owner.set_cash(owner.get_cash() + amount);
            balance -= amount;
            System.out.println(amount + "원 출금하였습니다. 잔고: " + balance + "원, 현금: " + owner.get_cash() + "원");

            return true;
        }
       
    }
    
    // 계좌이체 인수: (은행 계좌, 송금액)
    boolean transfer(BankAccount account, int amount) {
        // 송금액이 음수거나 계좌 잔액보다 클 경우 송금 실패.
        if (amount < 0 || amount > get_balance()) {
            System.out.println(false + " - from: " + owner.get_name() + ", to: " + account.owner.get_name() + ", amount: " + amount + ", balance: " + get_balance());
            return false;
            // 송금성공일 경우 현계좌의 잔액에서 송금액을 줄이고 보낸 계좌의 잔액을 늘린다.
        } else {
            set_balance(get_balance() - amount);
            account.set_balance(account.get_balance() + amount);
            System.out.println(true + " - from: " + owner.get_name() + ", to: " + account.owner.get_name() + ", amount: " + amount + ", balance: " + get_balance());
            return true;
        }
    }
    // 계좌이체 오버로딩 인수: (받는 사람, 송금액)
    boolean transfer(Person person, int amount) {
        // 송금액이 음수거나 계좌 잔액보다 클 경우 송금 실패.
        if (amount < 0 || amount > get_balance()) {
            System.out.println(false + " - from: " + owner.get_name() + ", to: " + person.get_name() + ", amount: " + amount + ", balance: " + get_balance());
            return false;
            // 송금성공일 경우 현계좌의 잔액에서 송금액을 줄이고 보낸 사람의 계좌잔액을 늘린다.
        } else {
            set_balance(get_balance() - amount);
            person.get_account().set_balance(person.get_account().get_balance() + amount);
            System.out.println(true + " - from: " + owner.get_name() + ", to: " + person.get_name() + ", amount: " + amount + ", balance: " + get_balance());
            return true;
        }
    }
    
}

Person.java

- 은행 소유주 클래스

public class Person {
    private String name;
    private int age;
    private int cashAmount;
    // 은행 계좌
    private BankAccount account;

    // 클래스 생성자 인수 : 이름, 나이
    public Person(String pName, int pAge) {
        name = pName;
        if (age < 0) {
            age = 12;
        } else {
            age = pAge;
        }
        // 현금은 기본 0원
        cashAmount = 0;
    }
    // 클래스 생성자 오버로딩 인수 : 이름, 나이, 현금
    public Person(String pName, int pAge, int pCashAmount) {
        name = pName;
        if (age < 0) {
            age = 12;
        } else {
            age = pAge;
        }
        if (pCashAmount < 0) {
            cashAmount = 0;
        } else {
            cashAmount = pCashAmount;
        }
    }
    // 이름 setter 메소드
    public void set_name(String new_name) {
        name = new_name;
    }

    // 이름 getter 메소드
    public String get_name() {
        return name;
    }

    // 현금 setter 메소드
    public void set_cash(int new_cash) {
        if (new_cash > 0) {
            cashAmount = new_cash;
        }
    }

    // 현금 getter 메소드
    public int get_cash() {
        return cashAmount;
    }

    // 계좌 setter
    public void set_account(BankAccount new_account) {
        account = new_account;
    }

    // 계좌 getter
    public BankAccount get_account() {
        return account;
    }

    // 계좌 송금 인수 : 수금자, 송금액
    boolean transfer(Person person, int amount) {
        // 송금액이 0보다 작거나 송금자의 계좌잔액보다 큰경우 송금 실패
        if (amount < 0 || amount > account.get_balance()) {
            System.out.println(false + " - from: " + get_name() + ", to: " + person.get_name() + ", amount: " + amount + ", balance: " + account.get_balance());
            return false;
            // 송금을 성공하면 소유주 계좌의 잔액에서 송금액을 빼고, 수금자의 계좌잔액을 송금액만큼 늘린다.
        } else {
            account.set_balance(account.get_balance() - amount);
            person.get_account().set_balance(person.get_account().get_balance() + amount);
            System.out.println(true + " - from: " + get_name() + ", to: " + person.get_name() + ", amount: " + amount + ", balance: " + account.get_balance());
            return true;
        }
    }
    // 계좌 송금 인수 : 수금자, 송금액
    boolean transfer(BankAccount Account, int amount) {
        // 송금액이 0보다 작거나 송금자의 계좌잔액보다 큰경우 송금 실패
        if (amount < 0 || amount > account.get_balance()) {
            System.out.println(false + " - from: " + get_name() + ", to: " + Account.get_person() + ", amount: " + amount + ", balance: " + account.get_balance());
            return false;
            // 송금을 성공하면 소유주 계좌의 잔액에서 송금액을 빼고, 수금자의 계좌에서 계좌잔액을 송금액만큼 늘린다.
        } else {
            account.set_balance(account.get_balance() - amount);
            Account.set_balance(Account.get_balance() + amount);
            System.out.println(true + " - from: " + get_name() + ", to: " + Account.get_person() + ", amount: " + amount + ", balance: " + account.get_balance());
            return true;
        }
    }
}
public class Main {
    public static void main(String[] args) {
        // 사람 1
        Person p1 = new Person();
        p1.set_name("김신의");
        p1.set_cash(30000);

        // 은행 계좌 1
        BankAccount a1 = new BankAccount();
        a1.set_balance(100000);

        p1.set_account(a1);
        a1.set_person(p1);

        // 사람 2
        Person p2 = new Person();
        p2.set_name("문종모");
        p2.set_cash(100000);

        // 은행 계좌 2
        BankAccount a2 = new BankAccount();
        a2.set_balance(500000);

        p2.set_account(a2);
        a2.set_person(p2);

        // 계좌 이체 테스트
        a2.transfer(a1, 200000);
        a1.transfer(p2, 150000);
        p2.transfer(a1, 270000);
        p1.transfer(p2, 130000);
    }
}
true - from: 문종모, to: 김신의, amount: 200000, balance: 300000
true - from: 김신의, to: 문종모, amount: 150000, balance: 150000
true - from: 문종모, to: 김신의, amount: 270000, balance: 180000
true - from: 김신의, to: 문종모, amount: 130000, balance: 290000