본문 바로가기
Java/구현하기(Implementation)

23.06.21) Java 계좌 관리 프로그램 구현하기

by NH_club 2023. 6. 21.

●계좌 관리 프로그램 구현하기

은행에서 고객들의 계좌를 관리하는 프로그램입니다.

●구현 멤버

Account 클래스
customerName: 고객 이름
balance: 현재 잔액
accountNumber: 계좌 번호
deposit(long amount, ): 입금 기능
withdraw(long amount): 출금 기능, 출금하려는 금액이 현재 잔액보다 많을 경우 출금이 되지 않아야 함.
getBalance(): 현재 잔액 출력

소스 코드: https://github.com/NHclub/Implementation/tree/main/src/account


●의문점: 입금과 출금을 왜 Bank 클래스가 아니라 Account 클래스에서 진행해야 되는가?

캡슐화의 원칙에 따라서 객체에 대한 연산은 객체 내부에서 일어나게 해야 함.
예를 들어 Account(계좌)는 이름, 잔액, 계좌 번호의 값을 가질 수 있음. 이 필드 값들을 연산해야 할 때는 Account(계좌) 클래스 내부에서 실행 되어야 함. Bank에선 그 연산한 값을 갖고 와서 저장만 시키면 되는 것임.

Account는 '계좌' 객체임. 그 계좌들을 관리해 주는 것이 Bank 클래스임.

Bank 클래스는 '계좌(Account)'의 리스트를 갖고 관리 해주는 것임 Account 클래스는 계좌 그 자체임 '한' 계좌의 속성을 갖고 '한' 계좌의 연산만 수행하는 것임. 이렇게 해야 각 클래스별 책임과 역할이 명확해짐.

●첫 번째 문제: 출금이 안되는 경우가 두가지임 잔액이 부족할 때, 계좌번호를 잘못 입력 했을 때. 

두 가지 경우를 구분해서 출력을 어떻게 해야 할지 모르겠음.

조건문을 나눠서 진행하면 된다.

먼저 계좌번호가 있는지 확인하고 계좌번호가 있으면 출금하려는 잔액이 잔고보다 많은지 확인하는 로직으로 진행.

이렇게 하면 계좌번호가 있는지 확인하고, 출금 잔액이 잔고보다 많은지 구분해서 알맞은 문제 출력 가능!

public void withdrawFromAccount(long accountNumber,long amount) {
    boolean flag = false;
    for (int i = 0; i < accountsList.size(); i++) {
        if(accountsList.get(i).getAccountNumber() == accountNumber){
            if (accountsList.get(i).getBalance() > accountNumber) {
                accountsList.get(i).withdraw(amount);
                System.out.println("출금이 완료 되었습니다.");
                System.out.println("현재 잔액은 " + accountsList.get(i).getBalance() + "원 입니다.");
                flag = true;
                return;
            } else {
            	flag = true;
                System.out.println("잔액이 부족합니다.");
            }
        }
    }
    if(flag == false){
        System.out.println("계좌번호를 찾을 수 없습니다.");
    }
}

 

계좌 관리 프로그램 구현 완료!

 

코드 리뷰:

1. 실제로 사용되지 않는 생성자가 2개가 있다. 불필요한 생성자는 제거하는 것이 좋다.
2. Bank 클래스에서 계좌 번호의 중복을 accountsList.contains(accountNumber)로 확인하고 있다.
    이 것은 Account객체와 accountNUmber 실제값을 비교하기 때문에 항상 flase를 반환한다. 수정이 필요하다
3. withdrawFromAccount 메소드에서 잔액이 부족합니다 라는 메시지를 출력하고 있다.

    이런 경우는 예외를 발생시키는 것이 좋다. 
4. 가독성 있는 코드를 작성하기 위해서 클래스 이름은 명사를, 메소드 이름은 동사를 사용한다.
    이 규칙을 따르면 코드를 읽는 사람들이 의미를 더 잘 이해할 수 있다.
5. Bank 클래스의 Random과 accountList는 외부에서 접근할 필요가 없으니 private로 선언하는 것이 좋다.