Java로 나만의 은행 프로그램, 어렵지 않아요!
프로그래밍을 처음 배우시는 분들에게는 ‘은행 프로그램’ 같은 조금 복잡해 보이는 예제가 낯설게 느껴질 수 있습니다. 하지만 걱정 마세요! 오늘은 Java를 이용해 입금과 출금 기능을 가진 아주 간단한 은행 프로그램을 함께 만들어볼 거예요. 마치 레고 블록을 쌓듯, 차근차근 따라오시면 어느새 나만의 프로그램을 완성하실 수 있을 겁니다.
이 글을 통해 여러분은 다음과 같은 내용을 배우게 됩니다.
-
은행 프로그램의 기본 구조: 계좌 정보는 어떻게 관리해야 할까요?
-
입금 기능 구현: 잔액을 안전하게 늘리는 방법
-
출금 기능 구현: 잔액이 부족할 때는 어떻게 해야 할까요?
-
간단한 사용자 인터페이스: 콘솔에서 입출금 명령을 받는 방법
이 모든 과정을 쉬운 Java 코드로 설명해 드릴 테니, 지금 바로 시작해 볼까요?
1단계: 은행 프로그램의 기본 설계 (Account 클래스 만들기)
모든 은행 거래의 핵심은 ‘계좌’입니다. 계좌에는 어떤 정보가 필요할까요? 가장 기본적인 것은 계좌 번호와 잔액입니다. 이 두 가지 정보를 담을 Java 클래스를 만들어 봅시다.
Account 클래스란 무엇일까요?
클래스는 객체를 만들기 위한 ‘설계도’와 같습니다. Account 클래스는 은행 계좌라는 개념을 코드로 표현한 것이죠. 이 설계도를 바탕으로 실제 은행 계좌 객체를 여러 개 만들 수 있습니다.
public class Account {
private String accountNumber; // 계좌 번호
private double balance; // 잔액
// 생성자: Account 객체를 만들 때 계좌 번호와 초기 잔액을 설정합니다.
public Account(String accountNumber, double initialBalance) {
this.accountNumber = accountNumber;
this.balance = initialBalance;
}
// 계좌 번호 가져오기 (Getter)
public String getAccountNumber() {
return accountNumber;
}
// 현재 잔액 가져오기 (Getter)
public double getBalance() {
return balance;
}
// 입금 기능: 잔액을 증가시킵니다.
public void deposit(double amount) {
if (amount > 0) { // 입금액이 0보다 커야 합니다.
this.balance += amount;
System.out.println(amount + "원이 입금되었습니다. 현재 잔액: " + this.balance + "원");
} else {
System.out.println("입금액은 0보다 커야 합니다.");
}
}
// 출금 기능: 잔액을 감소시킵니다.
public boolean withdraw(double amount) {
if (amount > 0) { // 출금액이 0보다 커야 합니다.
if (this.balance >= amount) { // 잔액이 출금액보다 많거나 같아야 합니다.
this.balance -= amount;
System.out.println(amount + "원이 출금되었습니다. 현재 잔액: " + this.balance + "원");
return true; // 출금 성공
} else {
System.out.println("잔액이 부족합니다. 현재 잔액: " + this.balance + "원");
return false; // 출금 실패
}
} else {
System.out.println("출금액은 0보다 커야 합니다.");
return false; // 출금 실패
}
}
}
코드 설명:
-
private String accountNumber;:accountNumber변수는 계좌 번호를 저장합니다.private는 이 변수가Account클래스 안에서만 직접 접근 가능하다는 것을 의미합니다. -
private double balance;:balance변수는 현재 잔액을 저장합니다.double타입을 사용하여 소수점 이하 금액도 처리할 수 있게 했습니다. -
public Account(String accountNumber, double initialBalance): 이것은 생성자입니다.new Account(...)형태로Account객체를 만들 때 호출되며, 계좌 번호와 초기 잔액을 설정하는 역할을 합니다. -
public String getAccountNumber()와public double getBalance(): 이 메소드들은 각각 계좌 번호와 잔액을 가져오는(get) 역할을 합니다. 외부에서Account객체의 내부 정보를 읽을 수 있도록 제공하는 Getter 메소드입니다. -
public void deposit(double amount): 입금 기능을 담당합니다.amount는 입금할 금액입니다. 입금액이 0보다 클 때만 잔액에 더하고, 결과를 출력합니다. -
public boolean withdraw(double amount): 출금 기능을 담당합니다. 입금 기능과 마찬가지로amount는 출금할 금액입니다. 중요한 점은 출금액이 0보다 크고, 현재 잔액(this.balance)이 출금액(amount)보다 많거나 같을 때만 출금이 가능하도록 조건을 추가했다는 것입니다. 출금 성공 여부를true또는false로 반환하여 프로그램의 다른 부분에서 결과를 확인할 수 있도록 했습니다.
2단계: 은행 프로그램을 실행할 메인 클래스 만들기 (BankSimulation 클래스)
이제 우리가 만든 Account 클래스를 가지고 실제로 은행 업무를 처리할 프로그램을 만들어야 합니다. main 메소드를 포함하는 BankSimulation 클래스를 만들어 보겠습니다.
import java.util.Scanner; // 사용자 입력을 받기 위한 Scanner 클래스를 불러옵니다.
public class BankSimulation {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // Scanner 객체 생성
// 초기 계좌 생성 (예시)
Account myAccount = new Account("1234-5678", 10000.0);
System.out.println("은행 프로그램에 오신 것을 환영합니다!");
System.out.println("계좌 번호: " + myAccount.getAccountNumber() + ", 초기 잔액: " + myAccount.getBalance() + "원");
System.out.println("------------------------------------");
int choice;
do {
// 메뉴 표시
printMenu();
System.out.print("원하시는 작업 번호를 입력하세요: ");
choice = scanner.nextInt(); // 사용자로부터 작업 번호 입력 받기
switch (choice) {
case 1: // 입금
System.out.print("입금할 금액을 입력하세요: ");
double depositAmount = scanner.nextDouble();
myAccount.deposit(depositAmount);
break;
case 2: // 출금
System.out.print("출금할 금액을 입력하세요: ");
double withdrawAmount = scanner.nextDouble();
myAccount.withdraw(withdrawAmount);
break;
case 3: // 잔액 조회
System.out.println("현재 잔액: " + myAccount.getBalance() + "원");
break;
case 0: // 종료
System.out.println("은행 프로그램을 종료합니다. 이용해주셔서 감사합니다.");
break;
default:
System.out.println("잘못된 입력입니다. 0부터 3까지의 숫자를 입력해주세요.");
}
System.out.println("------------------------------------");
} while (choice != 0); // 사용자가 0을 입력할 때까지 반복
scanner.close(); // Scanner 자원 해제
}
// 메뉴를 출력하는 메소드
public static void printMenu() {
System.out.println("=== 은행 업무 메뉴 ===");
System.out.println("1. 입금");
System.out.println("2. 출금");
System.out.println("3. 잔액 조회");
System.out.println("0. 종료");
System.out.println("=====================");
}
}
코드 설명:
-
import java.util.Scanner;: 사용자로부터 키보드 입력을 받기 위해Scanner클래스를 사용합니다. 이 클래스는java.util패키지에 속해 있으므로import문을 통해 불러와야 합니다. -
Scanner scanner = new Scanner(System.in);:Scanner객체를 생성합니다.System.in은 키보드 입력을 의미합니다. -
Account myAccount = new Account("1234-5678", 10000.0);:Account클래스의 설계도를 이용해myAccount라는 이름의 실제 계좌 객체를 생성합니다. 계좌 번호는 “1234-5678”, 초기 잔액은 10,000원으로 설정했습니다. -
do-while루프: 프로그램이 종료될 때까지(사용자가 0을 입력할 때까지) 메뉴를 계속 보여주고 사용자의 선택에 따라 작업을 수행하도록 합니다. -
printMenu(): 은행 업무 메뉴를 화면에 보기 좋게 출력하는 별도의 메소드입니다. 코드를 구조화하고 가독성을 높이는 데 도움이 됩니다. -
switch (choice): 사용자가 입력한choice값에 따라 다른 동작을 수행하도록 합니다. -
case 1: 입금. 사용자에게 입금할 금액을 입력받아myAccount.deposit()메소드를 호출합니다. -
case 2: 출금. 사용자에게 출금할 금액을 입력받아myAccount.withdraw()메소드를 호출합니다. -
case 3: 잔액 조회.myAccount.getBalance()메소드를 호출하여 현재 잔액을 출력합니다. -
case 0: 프로그램 종료. -
default: 사용자가 잘못된 번호를 입력했을 경우 메시지를 출력합니다. -
scanner.close();: 프로그램이 종료될 때Scanner객체가 사용하던 시스템 자원을 해제해 줍니다.
3단계: 프로그램 실행 및 테스트
이제 위에서 작성한 Account.java 파일과 BankSimulation.java 파일을 같은 폴더에 저장한 후, Java 컴파일러를 사용하여 실행해 봅시다.
컴파일 및 실행 방법 (명령 프롬프트 또는 터미널):
-
Account.java와BankSimulation.java파일이 있는 폴더로 이동합니다. -
다음 명령어로 컴파일합니다.
javac Account.java BankSimulation.java
(만약 두 파일을 하나의 .java 파일로 합쳤다면 해당 파일만 컴파일해도 됩니다.)
- 컴파일이 성공하면
BankSimulation.class파일이 생성됩니다. 다음 명령어로 실행합니다.
java BankSimulation
실행 결과 예시:
은행 프로그램에 오신 것을 환영합니다!
계좌 번호: 1234-5678, 초기 잔액: 10000.0원
=== 은행 업무 메뉴 ===
1. 입금
2. 출금
3. 잔액 조회
0. 종료
=====================
원하시는 작업 번호를 입력하세요: 1
입금할 금액을 입력하세요: 5000
5000.0원이 입금되었습니다. 현재 잔액: 15000.0원
=== 은행 업무 메뉴 ===
1. 입금
2. 출금
3. 잔액 조회
0. 종료
=====================
원하시는 작업 번호를 입력하세요: 2
출금할 금액을 입력하세요: 3000
3000.0원이 출금되었습니다. 현재 잔액: 12000.0원
=== 은행 업무 메뉴 ===
1. 입금
2. 출금
3. 잔액 조회
0. 종료
=====================
원하시는 작업 번호를 입력하세요: 2
출금할 금액을 입력하세요: 15000
잔액이 부족합니다. 현재 잔액: 12000.0원
=== 은행 업무 메뉴 ===
1. 입금
2. 출금
3. 잔액 조회
0. 종료
=====================
원하시는 작업 번호를 입력하세요: 0
은행 프로그램을 종료합니다. 이용해주셔서 감사합니다.
이처럼 콘솔에 메뉴가 나타나고, 숫자를 입력하면 해당 작업이 수행되는 것을 확인할 수 있습니다.
흔한 실수와 주의사항
-
private변수에 직접 접근:Account클래스에서accountNumber와balance를private으로 선언한 이유는 외부에서 함부로 값을 변경하는 것을 막기 위해서입니다. 입금이나 출금 같은 메소드를 통해서만 계좌 정보를 변경해야 합니다. -
잔액 부족 시 처리: 출금 시 잔액이 부족한 경우를 제대로 처리하지 않으면 음수 잔액이 발생할 수 있습니다.
withdraw메소드에서if (this.balance >= amount)조건을 통해 이를 방지해야 합니다. -
Scanner자원 해제:Scanner객체는 시스템 자원을 사용하므로, 사용이 끝난 후에는 반드시scanner.close()를 호출하여 자원을 해제해 주는 것이 좋습니다. -
double타입의 한계:double타입은 부동 소수점 연산의 특성상 아주 미세한 오차가 발생할 수 있습니다. 금융 거래에서는BigDecimal과 같은 클래스를 사용하는 것이 더 정확하지만, 이 예제에서는double로도 충분히 개념을 이해할 수 있습니다.
다음 단계로 나아가기
이것은 아주 기본적인 은행 프로그램입니다. 더 발전시키고 싶다면 다음과 같은 기능들을 추가해 볼 수 있습니다.
-
여러 계좌 관리:
ArrayList와 같은 컬렉션을 사용하여 여러 개의Account객체를 저장하고 관리할 수 있습니다. -
계좌 이체: 한 계좌에서 다른 계좌로 금액을 이체하는 기능을 구현할 수 있습니다.
-
계좌 생성/삭제: 사용자가 직접 계좌를 새로 만들거나 기존 계좌를 삭제하는 기능을 추가할 수 있습니다.
-
GUI (그래픽 사용자 인터페이스): 콘솔 대신 Swing이나 JavaFX 같은 라이브러리를 사용하여 시각적인 인터페이스를 만들 수 있습니다.
-
예외 처리 강화: 잘못된 입력(문자열 입력 등)에 대해 프로그램이 오류를 내고 종료되는 대신, 사용자에게 다시 입력받도록 처리할 수 있습니다.
결론
Java로 간단한 은행 프로그램(입금/출금)을 만드는 과정을 살펴보았습니다. Account 클래스를 설계하고, BankSimulation 클래스에서 Scanner를 이용해 사용자 입력을 받아 Account 객체의 메소드를 호출하는 기본적인 흐름을 익혔습니다.
지금 바로 실천해 보세요!
-
코드를 직접 복사해서 실행해보고, 다양한 금액으로 입출금을 테스트해보세요.
-
잔액이 부족할 때 출금이 안 되는지 직접 확인해보세요.
-
Account클래스의balance값을 직접 변경해보면private접근 제한자 때문에 오류가 나는 것을 확인할 수 있습니다.
이 경험을 바탕으로 여러분은 Java 프로그래밍의 객체 지향 개념과 기본적인 입출력 처리에 대한 이해를 더욱 높일 수 있을 것입니다.
INTERNAL_LINKS: (유사한 게시글 입력)
EXTERNAL_LINKS: Java Tutorials, Java 공식 문서
