본문 바로가기
Study/POWER JAVA(기본서)

POWER JAVA 10장 mini project GUI 활용 계산기 (일부 기능만) -재수정

by prlkt5200 2022. 11. 7.
반응형

안녕하세요!

상당히 오랜만에 포스팅을 하게 되었습니다. 다름아니라 

나름대로 구현해보고 싶은 문제가 있었기에, 한번 부딪혀 봤는데 생각 이상으로 잘 안풀리다 보니

엄청 늦어졌습니다. 그리고 기능의 일부도 구현을 안했는데 ,이것까지 하려면 너무 진도가 밀려서 하는 수 없이 잠정보류하겠습니다. 그래도 중요하다 생각되는 부분은 거의 구현은 했습니다. 이번  미니 프로젝트는 정말 오래 걸린만큼. 속으로 유혹이 계속 왔던 것 같습니다.

'중간에 포기하고, 다른 사람 것 베끼고...그냥 해설만이라도 달면서 이해할까' 이런 생각이 막히니까 계속해서 들었습니다.

하지만 그냥 포기하는 것은 지는 것 같기도 하고, 나중에 현업자 되었을 때, 도움이 안되는 사고방식 같기에 계속해서 도전했으며 필요하다면 다른 사람의 것을 다 따라쳐보고 이해도 해보고, 겉으로 어설프게라도 흝어보고 하는 식으로 저에게 맞게 변형해서 문제를 최대한 풀어봤습니다.

 

누군가 그러더군요 한번 프로젝트 붙잡고 하면, 실력이 금방 오른다고. 저도 이번 기회에 실력이 확실히 업 된 것 까지는 아니어도. 그 말의 십분 공감할 수 있었으며, 컴퓨팅 사고라는 것의 흐릿한 잔상만이라도 캐치했던 것 같습니다!(지금은 또 가물가물 하지만요ㅠㅜ) 어쨌건 간에 반이라도 성공한 기념으로 막 떠들었는데, 이번 프로젝트에서 구현하려한 점, 장단점, 느낀점을 적고, 코드만 올리고 마무리 짓겠습니다.

 

깔끔하게 도표를 활용하면 좋지만, 그 시간에 공부나 개인 기록을 남기는 게 지금으로서는 유익할 것 같아 글로만 남기는 점 양해 부탁드립니다.

 

구현하려한 요소

1.계산기의 사칙연산

2.C 기능

3.textField를 통해 연산 결과물 출력 

 

구현하지 못한 요소

1. backSpace 기능

2.숫자에 음수 부호를 추가한 연산( -10+5)

 

 

 

잘했다 생각한 부분

1.기존의 다른 분들 코드에서처럼 불가변성인 String이 아닌 가변성인 StringBuffer를 활용해서 메모리를 아끼려고 시도

2.actionPerformed에서 액션 처리를 다하려기 보다 처리를 해주는 메소드를 만들어서 활용한 점

3.문제점을 추적해가려 계속해서 사고한 점

4.arrayList를 활용해보려 시도한 점

5.문자열을 wrapper class?(래퍼 클래스)를 활용하여 변환하려 시도해보려 한 점

6.문제 해결을 위해 계속해서 다양한 방식의 풀이를 생각해보려 한 점

7.기본적인 목표선은 포기 안한 점

 

못했다 생각한 부분

1.error 메시지를 잘 보면 되는데, 소홀히 하고 잘찾아보려 하지 않은 점

2.많이 막혔을 때 다른 사람의 코드를 1개만이 아닌 여러개를 따라쳐보고 이해하려 시도하지 않은 점

3.나만의 방식을 고집하려 한 점

4.사고가 유연하지 못한 점

5.완성을 짓지 못한 점

 


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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
public class Calculator extends JFrame implements ActionListener {
    private JPanel panel;
    private JTextField tField;
    private JButton[] buttons;
    private String[] labels = { "Backspace""""""CE""C""7""8""9""/""sqrt""4""5""6""x""%",
            "1""2""3""-""1/x""0""+/-"".""+""=" };
 
    private double result;
 
    private StringBuffer num = new StringBuffer(35);
    private StringBuffer memoryNumber = new StringBuffer(35);
 
    private double currentNumber = 0.0;
    private double prevNumber = 0.0
 
    ArrayList<String> list = new ArrayList<String>(35);
    // 입력된연산을 기억하는 배열
    ArrayList<String> function = new ArrayList<String>(35);
 
    public Calculator() {
        tField = new JTextField(35);
        panel = new JPanel();
        tField.setText("");
        tField.setEnabled(false);
        panel.setLayout(new GridLayout(0533));
        buttons = new JButton[25];
        int index = 0;
        for (int rows = 0; rows < 5; rows++) {
            for (int cols = 0; cols < 5; cols++) {
                buttons[index] = new JButton(labels[index]);
                if (cols >= 3)
                    buttons[index].setForeground(Color.red);
                else
                    buttons[index].setForeground(Color.blue);
                buttons[index].setBackground(Color.yellow);
                panel.add(buttons[index]);
                index++;
            }
        }
        for (int i = 0; i < 25; i++) {
            buttons[i].addActionListener(this);
        }
        add(tField, BorderLayout.NORTH);
        add(panel, BorderLayout.CENTER);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
    }
 
    public void functionKey(String s) {
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        String actionCommand = e.getActionCommand();
        switch (actionCommand) {
        case "CE":
        case "C":
            tField.setText("0");
            result = 0;
            num.append("C");
            textParsing(num.toString());
            break;
        case "+":
            // 연산자 입력의 경우, 연산자도 num에 저장되기에 이것을 제거한 뒤 숫자(문자열)만 list 배열에 값을
            // 저장시키기 위해서는 textParsing 메소드의 첫 번째 분기(if)의조건문을 수행하도록 유도해야 하며,
            // 따라서 연산자가 입력이 되어야 한다.
            // 그리고 연산자 단계에서는 버튼으로 입력한 값이 list로 전달되는 과정까지만 유도하고 계산은
            // calculate 메소드를 활용해, "="연산자에서 마저 실행한다.
            tField.setText("+");
            num.append("+");
            textParsing(num.toString());
            function.add("+");
            break;
        case "-":
            tField.setText("-");
            num.append("-");
            textParsing(num.toString());
            function.add("-");
            break;
        case "x":
            tField.setText("x");
            num.append("x");
            textParsing(num.toString());
            function.add("x");
            break;
        case "/":
            tField.setText("/");
            num.append("/");
            textParsing(num.toString());
            function.add("/");
            break;
        case "%":
            tField.setText("%");
            num.append("%");
            textParsing(num.toString());
            function.add("%");
            break;
        case "1/x":
            tField.setText("d");
            num.append("d");
            textParsing(num.toString());
            function.add("d");
            break;
        case "sqrt":
            tField.setText("s");
            num.append("s");
            textParsing(num.toString());
            function.add("s");
            break;
        case "Backspace":
            num.deleteCharAt(num.length() - 1);
            tField.setText(num.toString());
            System.out.println(num);
            break;
        case "=":
            // textParsing 메소드의 첫 번째 분기(if)의 조건문을 수행하도록 유도 tField.setText("=");
            num.append("=");
            if (list.size() != 0) {
                textParsing(num.toString());
                calculate();
            }
            tField.setText(Double.toString(result));
            System.out.println(result);
            break;
        default:
            num.append(actionCommand);
            tField.setText(num.toString());
            System.out.println(num.toString());
            break;
        }
 
    }
 
    public void textParsing(String inputText) {
        for (int i = 0; i < inputText.length(); i++) {
 
            // 문자열에서 연산자를 검색하기 위한 char 변수이다. 문자열에서 한 글자씩 따와서아래 조건문을 통해 연산자를 식별한다.
            char text = inputText.charAt(i);
 
            // 반복문 수행하면서 StringBuffer 변수에 저장하다가 연산자 나오면 list에 저장한다.
            memoryNumber.append(inputText.charAt(i));
 
            if (text == '+' || text == '-' || text == 'x' || text == '/' || text == '%' || text == 'd' || text == 's'
                    || text == '=') {
                memoryNumber.deleteCharAt(memoryNumber.length() - 1);
                list.add(memoryNumber.toString());
                memoryNumber.delete(0, memoryNumber.length());
                num.delete(0, num.length());
            } else if (text == 'C') {
                boolean b = true;
                while (b) {
                    if (list.size() != 0) {
                        list.remove(0);
                        System.out.println("리스트 제거.");
                    } else if (function.size() != 0) {
                        function.remove(0);
                        System.out.println("연산자 제거2.");
                    } else {
                        num.delete(0, num.length());
                        memoryNumber.deleteCharAt(0);
                        System.out.println("메모리넘버 제거 ");
                        b = false;
                    }
                }
            }
        }
    }
 
    public void calculate() {
        prevNumber = Double.parseDouble(list.get(0));
        int count = 1;
        for (String s : function) {
            if (s == "+") {
                currentNumber = Double.parseDouble(list.get(count));
                prevNumber += currentNumber;
                result = prevNumber;
                count++;
            }
            if (s == "-") {
                currentNumber = Double.parseDouble(list.get(count));
                prevNumber -= currentNumber;
                result = prevNumber;
                count++;
            }
            if (s == "x") {
                currentNumber = Double.parseDouble(list.get(count));
                prevNumber *= currentNumber;
                result = prevNumber;
                count++;
            }
            if (s == "/") {
                currentNumber = Double.parseDouble(list.get(count));
                prevNumber /= currentNumber;
                result = prevNumber;
                count++;
            }
            if (s == "%") {
                currentNumber = Double.parseDouble(list.get(count));
                prevNumber %= currentNumber;
                result = prevNumber;
                count++;
            }
            if (s == "d") {
                result = 1 / result;
                tField.setText(Double.toString(result));
            }
            if (s == "s") {
                tField.setText(Double.toString(Math.sqrt(result)));
            }
            count = 1;
            System.out.println(count);
        }
    }
 
    public static void main(String[] args) {
        Calculator s = new Calculator();
    }
}
cs

 

반응형