안녕하세요!
상당히 오랜만에 포스팅을 하게 되었습니다. 다름아니라
나름대로 구현해보고 싶은 문제가 있었기에, 한번 부딪혀 봤는데 생각 이상으로 잘 안풀리다 보니
엄청 늦어졌습니다. 그리고 기능의 일부도 구현을 안했는데 ,이것까지 하려면 너무 진도가 밀려서 하는 수 없이 잠정보류하겠습니다. 그래도 중요하다 생각되는 부분은 거의 구현은 했습니다. 이번 미니 프로젝트는 정말 오래 걸린만큼. 속으로 유혹이 계속 왔던 것 같습니다.
'중간에 포기하고, 다른 사람 것 베끼고...그냥 해설만이라도 달면서 이해할까' 이런 생각이 막히니까 계속해서 들었습니다.
하지만 그냥 포기하는 것은 지는 것 같기도 하고, 나중에 현업자 되었을 때, 도움이 안되는 사고방식 같기에 계속해서 도전했으며 필요하다면 다른 사람의 것을 다 따라쳐보고 이해도 해보고, 겉으로 어설프게라도 흝어보고 하는 식으로 저에게 맞게 변형해서 문제를 최대한 풀어봤습니다.
누군가 그러더군요 한번 프로젝트 붙잡고 하면, 실력이 금방 오른다고. 저도 이번 기회에 실력이 확실히 업 된 것 까지는 아니어도. 그 말의 십분 공감할 수 있었으며, 컴퓨팅 사고라는 것의 흐릿한 잔상만이라도 캐치했던 것 같습니다!(지금은 또 가물가물 하지만요ㅠㅜ) 어쨌건 간에 반이라도 성공한 기념으로 막 떠들었는데, 이번 프로젝트에서 구현하려한 점, 장단점, 느낀점을 적고, 코드만 올리고 마무리 짓겠습니다.
깔끔하게 도표를 활용하면 좋지만, 그 시간에 공부나 개인 기록을 남기는 게 지금으로서는 유익할 것 같아 글로만 남기는 점 양해 부탁드립니다.
구현하려한 요소
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(0, 5, 3, 3)); 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 |

'Study > POWER JAVA(기본서)' 카테고리의 다른 글
| POWER JAVA 10장 예제 11-3 사용자로부터 받은 정수의 제곱 계산(GUI) (0) | 2022.11.09 |
|---|---|
| POWER JAVA 10장 예제 11-1 label 및 font 변경 (0) | 2022.11.09 |
| POWER JAVA 10장 예제 10-3 자동차 움직이기 (주석) (0) | 2022.11.03 |
| POWER JAVA 10장 Lab1 가위,바위,보 게임 (주석) (0) | 2022.11.02 |
| POWER JAVA 10장 LAB 키패드 만들기 (주석) (0) | 2022.11.02 |