배운 코드를 적기

실습예제 구현하기

Jungsoomin :) 2020. 6. 3. 23:32

실습시간에 했던 예제이다. 객체..지향적으로 만들어보려고 열심히 분투하고..직접 메소드를 짜보면서 했다..많이 부족하다 싶다...

 

더 노력하고 더 꾸준히 할 수 밖에는 없음을 느낀다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package Account;
 
import java.util.Scanner;
 
 class Account extends BankApplication{//고객 배열 ac가 부모클래스에 있어 상속을 잡았습니다.
    
    private String name;//고객의 이름입니다. private 선언 입니다.
    private String AccNo;//계좌 입니다. private 선언 입니다.
    private int balance;//잔고 입니다. setter 메소드가 2개이기도하고, private로 선언 되야하기도 했습니다.
    
    protected Account(String name, String AccNo, int balance){
        this.name = name;
        this.AccNo = AccNo;
        this.balance = balance;
    }//생성자입니다. 값은 메서드 안에서 매개변수로 받고 실제 값은 프로그램에서 판단하여 생성합니다.
    
        protected void setWithdraw(int withdraw){//출금용 setter 입니다. BankApplication클래스의 withDraw() 에서 실행됩니다.
            if(withdraw>0 && withdraw<MAX_VALUE ) {//매개변수 값을 1차로 검사합니다.출금 값은 일단 음수이거나 MAX상수를 넘어서는안됩니다.
                    if(withdraw<=this.balance ) {//2차로 출금값이 해당고객(this)의 잔고(balance)보다 크면 안됩니다.
                        int ConvertWithdraw =-withdraw;//확인되면 음수반전 시켜 += 연산으로 대입합니다.
                    this.balance += ConvertWithdraw;
                    return;
                    }//한도값이 이상하다면 맞는 안내문을 주고 start를 돌리고 return 시킵니다. 
                System.out.println("\n한도값이 초과되었습니다. 초기화면으로 돌아갑니다.");
                return;
                }//출금액이 이상하다면 맞는 안내문을 주고 return 시킵니다. 
                    System.out.println("\n잘못된 출금액입니다. 초기화면으로 돌아갑니다.");
                return;//return 시킵니다. 
        }
 
        protected String getName() {//<<같은 setter getter 입니다.
            return this.name;
        }
        protected void setName(String name) {
            this.name = name;
        }
        protected String getAccNo() {
            return this.AccNo;
        }
        protected void setAccNo(String accNo) {
            AccNo = accNo;
        }
        protected int getBalance() {
            return this.balance;
        }//<
        
        protected void setBalance(int balance) {//입금용 setter 입니다. BankApplication클래스의 deposit() 에서 실행합니다.
            if(balance>0 && balance<MAX_VALUE ) {//입금액은 음수이면 안되며 최대 예금액을 넘어서면 안됩니다.
            if(this.balance+balance<MAX_VALUE && this.balance+balance>MIN_VALUE) {//<2차로 더한값이 0보다 적거나 최대 예금액을 넘어서는지 검사합니다.
                this.balance += balance;//모두 충족 된다면 필드를 바꿉니다.
                return;//리턴문으로 밑의 문장을 거치지않고 바로 종료시킵니다.
            }//해당 검사값에 맞는 내용을 안내하고 리턴시킵니다.
            System.out.println("\n한도값이 초과되었습니다. 초기화면으로 돌아갑니다.");
            return;
            }//해당 검사값에 맞는 내용을 안내하고 리턴시킵니다.
                System.out.println("\n잘못된 입급액입니다. 초기화면으로 돌아갑니다.");//<50000 입금시
            return;
        }
        
    
 }
 
cs

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package Account;
 
import java.util.Scanner;
import java.util.regex.Pattern;
 
public class BankApplication {
    private Scanner sc ;//스캐너 필드이며 받을때마다 새로운 객체를 만듭니다. private입니다.
    private static Account[] ac = new Account[100];//임시로 100명으로 놓았습니다. private이며 공통된 값을 위해 static입니다.
    protected final int MAX_VALUE = 1000000;//계좌당 최대예금액입니다. Account의 입급 출금 setter판단을 위해서 protected로 선언했습니다.
    protected final int MIN_VALUE = 0;//계좌당 최소 예금액입니다. Account의 입급 출금 setter판단을 위해서 protected로 선언했습니다.
            private boolean treager;//start메소드를 정지시키기위한 플래그입니다. private입니다.
    
        private void createAcc() {//계좌생성 메소드이며 private선언 입니다.
            
        String AcNo = "";
        sc = new Scanner(System.in);
        System.out.print("\n계좌번호: \r");//print가 많아 \n 과 \r을 사용했습니다.
        String message = sc.nextLine();
        boolean result = Pattern.matches("^([0-9]{3})-[0-9]{3}$", message);//<<<계좌 규격판단 메서드입니다.
        if(!result) { //계좌가 규격에 맞지않으면 ! <   리턴문으로 메소드를 중지시킵니다.
            System.out.println("\n올바르지 않은 값이 입력되었습니다. 000-000 형식으로 작성해주세요. \n초기화면으로 돌아갑니다.");
            return;
        }else {
            AcNo = message;//정상적이라면 로컬변수 AcNo에 대입해줍니다.
        }
        sc = new Scanner(System.in);
        System.out.print("\n계좌주: \r");
        String name = sc.nextLine();
        boolean result1= Pattern.matches("^(?:[가-힣]{3,4}|[a-zA-Z]{1,15})$", name);//위와같이 이름 판단을 하여 맞지않으면 리턴시키고 종료합니다.
        if(!result1) {
            System.out.println("\n올바르지 않은 값이 입력되었습니다. 한글3~4자 및 영소대문자 1~15자 이내로 작성해주세요.\n 초기화면으로 돌아갑니다.");
            return;
        }
        //잘 작성됬다면 이쪽블럭으로 내려와서 다시 입력값을 받고 로컬변수에 담은 후에 초기값이 상수 값에 범위에 존재하는지 판단합니다.
        System.out.print("초기 입금액: \r");
        sc = new Scanner(System.in);
        int check  = sc.nextInt();
            if(check>MAX_VALUE || check<MIN_VALUE) {//없다면 리턴하여 종료시킵니다. 
            System.out.println("\n올바르지 않은 값이 입력되었습니다. 초기화면으로 돌아갑니다.");
            return;
        }
        //작 작성됬다면 for문이 돌아가고 Account배열인 ac[i]값을 탐색 후 null인 값이 있다면 빈공간이니 new연산자로 로컬변수 값을 매개변수로 주어 생성하고 대입합니다.
        for(int i=0; i<ac.length; i++) {
            if(ac[i] ==null) {
                ac[i] = new Account(name,AcNo,check);
                break;//for 문이 더이상 돌아가지않게 멈춰줍니다.
            }
        }
        System.out.println("\n 결과: 계좌가 생성되었습니다.");//사용자에게 결과를 띄우고 메소드 마지막 블록이니 리턴문을 굳이 넣지 않았습니다.
        }
    
        private void accArrShow() {//계좌 출력 메소드이며 private 선언 입니다.
        if(this.ac.length>0) {//배열의 길이가 0보다 크다면 시작합니다. 그렇다면 값이 존재하며 띄워줄 값이 존재합니다.
        for(int i =0; i<this.ac.length; i++) {//for 문이 돌아 null값이 아니라면 계좌가 있는 것으로 확인합니다. 다 출력해주어야하기에 이외의 조건은 생각하지않았습니다.
            if(this.ac[i] != null) {
            System.out.printf("%s \t %s \t %,d\n",this.ac[i].getAccNo(),this.ac[i].getName(),this.ac[i].getBalance());//매개값을 이용하여 단위에 맞게 출력합니다.
            }else {
                break;// 불필요한 for문 루프를 막기위해서 null값을 발견하면 break 시켜 빠져나옵니다.
            }
        }
        }
        return;//return 문으로 메소드를 안전하게 종료시킵니다.
    }
    
        private void deposit() {//입금 메소드이며 private 선언 입니다.
        System.out.print("계좌번호: \r");
        sc = new Scanner(System.in);// 전과 동일하게 새로운 Scanner 객체로 값을 받으며 시작하고, 
        String check= sc.nextLine();
        boolean result = Pattern.matches("^([0-9]{3})-[0-9]{3}$", check);//패턴에 맞추어 값이 맞다면 true 아니라면 false로 가려집니다.
        if(result) {//이를 통해 1차 로 if문을 사용해 경우를 고려합니다.
        for(int i=0; i<ac.length; i++) {//맞다면 for문이 돌게되고 아래 if문으로 2차 검증에 들어갑니다.
                if(ac[i].getAccNo().equals(check) && ac[i].getAccNo().hashCode() == check.hashCode() ) {
                    //컴퓨터가 주는 아이디인 HashCode(String 클래스의 자동 오버라이딩)와 String클래스의 오버라이딩되어있는 equals 메소드를 이용하여 계좌의 값을 입력값과 동일한지 판단합니다.
                    sc = new Scanner(System.in);//맞다면 다시 변수에 새로운 스캐너 객체를 만들어 입력값을 받습니다.
                    System.out.print("입금액: \r");
                    int amont = sc.nextInt();//매개변수에 입금액을받고
                    ac[i].setBalance(amont);//배열의 해당 인덱스 값은 이미 위의 if문으로 탐색이 되어 바로 setBalance(amount)로 잔고를 수정해줍니다.
                    return;//안내문을 출력하고 안전하게 메소드를 종료시킵니다.
                }
            }//2차 검증에 실패하면 계좌를 찾지못했다는 안내문을 출력하고 안전하게 메소드를 종료시킵니다.
            System.out.println("\n맞는 계좌를 찾지 못하였습니다.");
            return;
        }//1차 검증에 실패하면 잘못입력했다는 안내문을 출력하고 안전하게 메소드를 종료시킵니다.
        System.out.println("계좌를 잘못입력하셨습니다.");
        return;
    }
        
    
        private void appOff() {//start메소드와 엮여있는 메소드 인 종료 메소드 입니다. private 선언 입니다.
        treager =true//boolean 플래그인 treager 를 false로 만들고 종료 안내문을 띄움으로서 while문을 탈출시킵니다. 
        System.out.println("\n 프로그램 종료.");//안내문을 출력합니다.
    }
    
        private void withdraw() {//출금메소드 입니다. private 선언 입니다.
        sc = new Scanner(System.in);
        System.out.print("계좌번호: \r");//동일하게 sc 에 새로운 스캐너객체를 대입시켜 로컬변수 check에 값을 받습니다.
        String check = sc.nextLine();
        boolean result = Pattern.matches("^([0-9]{3})-[0-9]{3}$", check);//형식에 맞나 파악하는 것으로 이해해주시면 감사하겠습니다. 리턴값은 boolean타입이며 true와 false로 나뉩니다.
        if(result) {//<형식 일치하면 for문이 돌기시작합니다.
            for(int i=0; i<ac.length; i++) {
                if(ac[i] != null &&ac[i].getAccNo().equals(check)&& ac[i].getAccNo().hashCode() == check.hashCode()) {    
                    //동일합니다. null이 아니면 값이있고, 해쉬코드와 계좌의 equal로 3가지 조건을 얹어 동일 유무를 파악합니다.
                    System.out.print("출금액: \r");//맞다면 출금액 안내를 띄우고 값을 받습니다.
                    sc = new Scanner(System.in);
                    int amount = sc.nextInt();
                    ac[i].setWithdraw(amount);//<위의 if문으로 해당 인덱스는 구해졌으니 이를 이용해 Account에 있는 출금용 setter를 실행시키고 메소드를 안전하게 종료합니다.
                    return;
            }
            }
        }    
        System.out.println("계좌를 잘못입력하셨습니다.");
        return;
    }
    
    
        public void start() {//평소 화면을 띄우는 메소드입니다. 실행하는 메인메소드에서는 이 하나의 메소드만을 볼 수 있으며 이 객체생성과정만을 보게 되며 접근 불가합니다.
        sc = new Scanner(System.in);
        while(!treager) {//treager의 기본값은 false이기에 ! 연산자로 true 만들어 while문을 돌립니다.
            System.out.println("------------------------------------------------------\n"
                                     + "1.계좌생성 | 2.계좌목록 | 3.예금 | 4.출금 | 5.종료"
                                  + "\n------------------------------------------------------");//가독성을 고려해봤습니다.
            int check =sc.nextInt();//입력값을 받아 switch문을 돌립니다.
            
            switch(check) {//switch 문에 case에 따라 해당 메소드를 돌립니다. private 선언이 되있기에 사용자가 건들 수 없게끔 생각해 봤습니다.
            case 1:
                System.out.println("\n-------------\n"
                          + "계좌생성"
                    + "\n------------");
                createAcc();
                break;
            case 2:
                System.out.println("\n-------------\n"
                          + "계좌목록"
                    + "\n------------");
                accArrShow();
                break;
            case 3:
                System.out.println("\n-------------\n"
                          + "예금"
                    + "\n------------");
                deposit();
                break;
            case 4:
                System.out.println("\n-------------\n"
                          + "출금"
                    + "\n------------");
                withdraw();
                break;
            default:
                appOff();//5번은 default입니다.
            }
            start();//각 메소드는 return 문으로 안전하게 종료를 합니다. 그리고 다시 start메소드의 switch 문으로 돌아와서 밑의 break 문을 만나 switch문을 빠져나오게 되면 start메소드가 재귀적으로 다시 시작합니다.
        }
        //appOff() 메소드로 treager가 변경되면 while 문을 빠져나오고 그로인해 모든 실행 중인 메소드들이 안전하게 종료되게 됩니다.
    }
    
    
 
}
 
cs

 

 

 

1
2
3
4
5
6
7
8
9
package Account;
 
public class Test {
    public static void main(String[] args) {
 
        BankApplication bApp = new BankApplication();
        bApp.start();
    }
}
cs

'배운 코드를 적기' 카테고리의 다른 글

JavaFX 로 간단한 app 구현 중.  (0) 2020.06.07
채팅서버 구현하기  (0) 2020.05.09
이것이 자바다 - 04.조건문과 반복문  (0) 2020.03.25