본문 바로가기

JAVA

은행관리 프로그램 (클래스 분리)

계좌 생성 입금 출금 계좌이체  기능 구현하기

기능별로

계좌정보 저장하는 클래스

계좌 생성하는 클래스

입금하는 클래스 

출금하는 클래스

계좌이체하는 클래스 

전부 따로 만들었다. 그러나...

 

코드만 복사해놨던걸 빈 클래스에다 붙여 넣기 한 것이라서 오류가 있음. 무시해도 무방.

 

계좌이체하는 클래스 하나이다. 구현하는 기능도 계좌이체 하나뿐

 

그러나 보이는가? 저 수 많은 if들이.... 아주 징그럽다...

잘 돌아가면 그나마 괜찮은데 이상하게 출금계좌를 두 번 물어보는 문제 발생.... 코드가 너무 길고 if가 너무 많아 도대체가 어디서 잘못된 건지 알 수가 없음. 메서드처럼 if문도 접을 수 있었으면 좋았을 텐데;;;; 

아무튼 손을 대지 못하는 상황발생.

조언을 얻으니 그냥 갈아엎는 수밖에 없다고 함... 근데 너무 아까웠음..

 

그래서 일단 입력한 계좌가 객체 배열 내에 있는지 검색하는 거랑

비밀번호 맞는지 체크하는 기능은 공통 같아서 분리하기로 함.

 

그 결과...

계좌정보 저장 클래스 계좌번호 이름 생일 비밀번호 예금액 그리고 꼼수 변수 in(설명은 아래에서)

계좌 생성 클래스

표시한 부분이 계좌번호 자동생성코드.

원래는 이것도 입력으로 처리하려다가 우리가 계좌 생성하러 은행에 가도 우리 맘대로 계좌번호를 만들진 않으니까 객체 생성하면 자동으로 입력되는 방식으로 함. (기본형식인 275400에 난수 1~100 사이의 수를 더해서)

근데 이것도 문제가 있음. 생성되는 난수가 중복될 수가 있음. 근데 중복 값을 제거하는 법을 잘 모르겠어서 일단은...

 

대망의 이체 클래스

보이는가 이 간결해짐이??  수많은 if문은 사라지고 한 화면에 딱 맞게 들어온다.

작동을 위한 Main과 MainDriver클래스, 출력 클래스

계좌번호를 입력받아서 객체 배열에 해당 계좌번호가 있는지 검색하는 클래스 

비밀번호 입력받아서 찾은 계좌번호랑 비밀번호가 맞는지 대조하는 클래스

3번 이상 틀리면 프로그램이 종료되게끔 했다.

이 간단한 은행 프로그램에 클래스가 9개나 나왔다. 

이렇게 많이 나올 줄이야...

이렇게 만드는 데에도 문제가 없었던 것이 아님 

FindAccount클래스를 돌려서 인덱스 값 i를 알아내서 리턴하는데 

문제는 FindPassword클래스에서 해당 인덱스 값을 알아야 입력한 패스워드랑 대조를 하는데 그 값을

어떻게 갖고 와야 할지 모르는 문제 발생.

같은 클래스에 있을 때는 간단히 처리되던 게 클래스가 분리되니 저걸 어떻게 가져와야 할지 고민....

진짜 한참을 고민했음. 진짜 갈아 없는 방법밖에 없는 것인가 하던 차에 생각난 게

Account클래스에 스태틱 변수 in을 만들었다.

FindAccount 클래스에 보면 일치하는 인덱스 값을 찾으면 리턴 전에 해당 값을 in에 대입하게끔 했다.

비밀번호 대조할 때는 in에 접근해서 대조하게끔.

 

 

이거 궁리하는데 도대체 얼마나 걸린 건지....

근데 이렇게 해도 문제는 있다.

 

이체 클래스를 잘 보면 

출금계좌번호 입력

비밀번호 입력

이체금액 입력

입금계좌번호 입력 

이 순서로 되어있다.

하지만 실제 은행은

제일 마지막에 비번을 입력한다.

근데 저 방식은 계좌번호를 찾을 때마다 스태틱 변수 값을 바꾸기 때문에

출금계좌 찾고 입금계좌를 찾고 그다음에 비번을 입력하라고 하면 대조 인덱스가 출금계좌의 것이 아니라 입금계좌의 것이 된다. 그러니 비번을 먼저 입력받도록 한 것... 절대 좋은 방법은 아닌데 더 이상은 지금은 못할 듯...

 

또 하나 아주 기초적인 if문 문제...

 

입력한 계좌번호가  배열에 없으면 계속 반복 입력을 하게 했다.

끝까지 확인해서 없을 경우에만 일치하는 경우가 없다고 메시지가 출력되도록 하고 

다시 입력을 받아서 for문을 돌리게 했다.

 

문제는 주석 부분. 

다시 입력을 받아서 for문을 배열의 처음부터 검색을 시작하게 해야 했다.

그래서 index=0;으로 초기화를 해줬다. 

그랬더니 인덱스 0에 있는 계좌를 못 찾는 게 아닌가?

test로 돌릴 때는 보통 3개 정도 계좌를 생성해서 돌려보니 0번 계좌가 없을 수가 없다.

근데 아무리 봐도 어디가 문제인지 모르겠더라. 하도 답답해서 반복문 for문 문법 교재를 다시 봤다.

문제는 저기서 0으로 초기화를 해주면 0을 받아서 index=1부터 시작한다는 것. 증감 식이 index++이기 때문에.

for문을 한 번 돌린 것으로 판단, 0부터 시작하는 게 아니라 1부터..... 그러니 죽어도 0번 인덱스에 있는 계좌가 검색이 안되지.... 허탈 허탈;;;;

 

 

정리

 

클래스 분리는  필수!!

클래스 분리하고 따로 관리해서 호출하는 식으로 하니 딱 그것만 고치면 돼서 너무 편하더라.

수많은 if else에서 해방된 것은 말할 것도 없고.

처음 설계할 때부터 염두하고 설계를 해야 할 듯. 다 짜고 분리를 하는 게 아니라.

 

그것 말고도 문제는 있다. 

ArrayList를 활용하긴 했지만 어떤 원리로 저렇게 돌아가는지 모른다. 

신나게 쓰긴 했는데 예제 보고 활용방식을 따라한 것뿐. 개념 정리는 아직 안되었다.

컬렉션이 결국은 대량의 데이터를 처리 관리하기 위해 유용한 클래스들을 메서드와 함께 정의해 놓은 것 그래서 우리는 가져다 쓰기만 하면 되고. 그렇게 이해를 했는데 근데 어떤 식으로 가져오는지 잘 모르겠다. 

예제는 처음부터 ArrayList를 선언하고 객체 생성하고 거기서 각종 메서드를 활용하는 걸 보여주는데

저렇게 여러 가지 형의 데이터가 모여있는 객체 배열이 따로 있을 경우 어떻게 접근해서 활용하는 건지 잘 모르겠다.

다른 교재 정의 부분을 보면 좀 알까 싶어서 상호대차를 신청해놓은 상태다;;;