ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (JAVA/자바) GUI 계산기 만들기
    프로젝트 2022. 1. 24. 00:29

    안녕하세요~ 코딩하는 코알못 코메인입니다.

    이번엔 제가 개인 프로젝트(?)를 하나 진행했습니다.

    그건 바로 기초 중의 기초라 불리는 계산기 만들기(GUI를 이용해 만들었습니다.)

    우선 구동하는 움짤부터

    입력과 지우기(AC는 전체 지우기 / C는 한글자 지우기)
    각종 계산
    루트와 제곱 계산
    실수 계산

     

    -구현 기능-

    1. 기본적인 사칙연산 구현

    2. 양수 음수 계산 구현

    3. 실수 계산 (부동소수점때문에 소수점 9자리에서 반올림) 구현

    4. 루트와 제곱 연산 구현

    5. 전체 초기화 / 한글지 지우기 구현

    6. 숫자 최대 입력 길이 구현

    7. 한번에 한번만 연산 가능하게 제한

    8. 이전 입력 숫자나 연산 결과를 상단에 출력

    등등 구현했다.

     

    생각보다 구현하고 싶었던 것들을 구현하는데 시간을 잡아 먹었고 예상 했던 기간보다 오래 걸려버린거같다.

     

    이제 코드다

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class MyCalc extends JFrame {
    	static JLabel label;
    	static JLabel info;
    	double result = 0;
    	String math = "";
    	double num = 0;
    	String tostring = "";
    	public MyCalc() {
    		setTitle("내가 만든 계산 계산기");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    		Container MyCon = getContentPane();
    		MyCon.setLayout(new BorderLayout(5, 5));
    		MyCon.setBackground(Color.LIGHT_GRAY);
    		
    		//입력 값과 결과값이 출력되는 위 패널 생성 후 콘테이너에 추가
    		UpPanel UP = new UpPanel();
    		MyCon.add(UP, BorderLayout.EAST);
    		//버튼을 넣을 아래 패널 생성 후 콘테이너에 추가
    		DownPanel DP = new DownPanel();
    		MyCon.add(DP, BorderLayout.SOUTH);
    		
    		setSize(350, 600);
    		setVisible(true);
    	}
    	class UpPanel extends JPanel {
    		public UpPanel() {
    			setLayout(new GridLayout(3, 1));
    			setBackground(Color.LIGHT_GRAY);
    			info = new JLabel("");
    			label = new JLabel("0");
    			
    			info.setFont(new Font("맑은 고딕", 0, 40));
    			info.setForeground(Color.BLACK);
    			info.setHorizontalAlignment(SwingConstants.RIGHT);
    			
    			label.setFont(new Font("맑은 고딕", Font.BOLD , 55));
    			label.setForeground(Color.BLACK);
    			label.setHorizontalAlignment(SwingConstants.RIGHT);
    			
    			add(info);
    			add(label);
    		}
    	}
    	
    	class DownPanel extends JPanel{
    		public DownPanel() {
    			JButton[] bt = new JButton[20];
    			setLayout(new GridLayout(5, 4, 5, 5));
    			setBackground(Color.DARK_GRAY);
    			
    			bt[0] = new JButton("×");
    			bt[1] = new JButton("÷");
    			bt[2] = new JButton("AC");
    			bt[3] = new JButton("C");
    
    			bt[4] = new JButton("7");
    			bt[5] = new JButton("8");
    			bt[6] = new JButton("9");
    			bt[7] = new JButton("√");
    			
    			bt[8] = new JButton("4");
    			bt[9] = new JButton("5");
    			bt[10] = new JButton("6");
    			bt[11] = new JButton("-");
    			
    			bt[12] = new JButton("1");
    			bt[13] = new JButton("2");
    			bt[14] = new JButton("3");
    			bt[15] = new JButton("+");
    			
    			bt[16] = new JButton("^2");
    			bt[17] = new JButton("0");
    			bt[18] = new JButton(".");
    			bt[19] = new JButton("=");
    			
    			for(int i = 0; i <= 19; i++) {
    				bt[i].setPreferredSize(new Dimension(0, 65));
    				bt[i].setFont(new Font("맑은 고딕", 0, 20));
    				bt[i].setForeground(Color.BLACK);
    				bt[i].setBackground(new Color(240, 240, 240));
    				if(3 < i && i < 15 && i % 4 != 3) {
    					bt[i].addActionListener(new ActionListener() {
    						
    						@Override
    						public void actionPerformed(ActionEvent e) {
    							JButton b = (JButton)e.getSource();
    							if(label.getText() == "0") {
    								label.setText("");
    							}
    							String labeltext = label.getText();
    							String text = b.getText();
    							String newtext = labeltext + text;
    							int n = newtext.length();
    							if(n <= 10) {
    								label.setText(newtext);
    							}
    							if(info.getText().contains("=") == true) {
    								info.setText("");
    								label.setText(b.getText());
    								result = 0;
    								num = 0;
    							}
    						}
    					});
    				}else if(i == 17) {
    					bt[i].addActionListener(new ActionListener() {
    						
    						@Override
    						public void actionPerformed(ActionEvent e) {
    							JButton b = (JButton)e.getSource();
    							String labeltext = label.getText();
    							String text = b.getText();
    							String newtext = labeltext + text;
    							if(labeltext == "0") {
    								label.setText("0");
    							}else {
    								label.setText(newtext);
    							}
    							
    						}
    					});
    				}else if(i == 19) {
    					bt[i].setBackground(new Color(78, 197, 255));
    					bt[i].addActionListener(new Result());
    				}else if(i % 4 == 3 || i < 3 || 15 < i) {
    					bt[i].setBackground(new Color(218, 218, 218));
    					if(i == 2) {
    							bt[i].addActionListener(new ActionListener() {
    							
    							@Override
    							public void actionPerformed(ActionEvent e) {
    								int n = label.getText().length();
    								if(n >= 0) {
    									label.setText("0");
    									info.setText("");
    								}
    								result = 0;
    							}
    						});
    					}else if(i == 3) {
    						bt[i].addActionListener(new ActionListener() {
    							
    							@Override
    							public void actionPerformed(ActionEvent e) {
    								int n = label.getText().length();
    								if(n > 0) {
    									setBackSpace(getBackSpace().substring(0, getBackSpace().length() - 1));
    								}
    								if(label.getText() == "") {
    									label.setText("0");
    								}
    							}
    						});
    					}else if(i == 18) {
    						bt[i].addActionListener(new ActionListener() {
    							
    							@Override
    							public void actionPerformed(ActionEvent e) {
    								JButton b = (JButton)e.getSource();
    								String labeltext = label.getText();
    								String text = b.getText();
    								String newtext = labeltext + text;
    								int n = newtext.length();
    								if(label.getText().contains(b.getText()) == false && n < 10) {
    										label.setText(newtext);
    								}
    								}
    						});
    					}else {
    						bt[i].addActionListener(new Result());
    					}
    				}
    				add(bt[i]);
    			}
    		}		
    	}
    	
    	public class Result implements ActionListener{
    		public void actionPerformed(ActionEvent e) {
    			JButton b = (JButton)e.getSource();
    			String labeltext = label.getText();
    			String text = b.getText();
    			String newtext = labeltext + text;
    			int n = newtext.length();
    			if(text != "^2") {
    				num = Double.parseDouble(label.getText().substring(0, n - 1));				
    			}
    			if(math == "+") {
    				result += num;
    				math = "";
    			}else if(math == "-") {
    				result -= num;
    				math = "";
    			}else if(math == "×") {
    				result *= num;
    				math = "";
    			}else if(math == "÷") {
    				result /= num;
    				math = "";
    			}
    			if(math == "") {
    				math = b.getText();			
    			}
    			if(info.getText() == "" && text != "^2" && text != "=") {
    				info.setText(newtext);
    				result = num;
    				label.setText("0");
    			}else if(info.getText() != "" && text != "^2" && text != "="){
    				result = (Math.round(result*1000000000)/1000000000.0);
    				if(result % 1 == 0) {
    					info.setText((int) result + text);
    					label.setText("0");
    				}else {
    					info.setText(result + text);
    					label.setText("0");
    				}
    			}
    			if(text == "^2") {
    				num = Double.parseDouble(label.getText().substring(0, n - 2));
    				math = "";
    				if(info.getText() == "") {
    					result = (Math.round((Math.pow(num, 2))*1000000000)/1000000000.0);
    					if(result % 1 == 0) {
    						info.setText("pow(" + (int) num + ")");
    						label.setText(String.valueOf((int) result));
    					}else {
    						info.setText("pow(" + num + ")");
    						label.setText(String.valueOf(result));
    					}
    				}else {
    					if(result % 1 == 0) {
    						info.setText("pow(" + (int) result + ")");
    						result = (Math.round((Math.pow(result, 2))*1000000000)/1000000000.0);
    						label.setText(String.valueOf((int) result));
    					}else {
    						info.setText("pow(" + result + ")");
    						result = (Math.round((Math.pow(result, 2))*1000000000)/1000000000.0);
    						label.setText(String.valueOf(result));
    					}
    				}
    			}
    			if(text == "√") {
    				math = "";
    				if(info.getText() == "") {
    					result = (Math.round((Math.sqrt(num))*1000000000)/1000000000.0);
    					if(result % 1 == 0) {
    						info.setText("sqrt(" + (int) num + ")");
    						label.setText(String.valueOf((int) result));
    					}else {
    						info.setText("sqrt(" + num + ")");
    						label.setText(String.valueOf(result));
    					}
    				}else {
    					if(Math.sqrt(result) % 1 == 0) {
    						info.setText("sqrt(" + (int) result + ")");
    						result = (Math.round((Math.sqrt(result))*1000000000)/1000000000.0);
    						label.setText(String.valueOf((int) result));
    					}else {
    						info.setText("sqrt(" + result + ")");
    						result = (Math.round((Math.sqrt(result))*1000000000)/1000000000.0);
    						label.setText(String.valueOf(result));
    					}
    				}
    			}
    			if(text == "=") {
    				math = "";
    				if(info.getText() != "" && label.getText() != "" && info.getText().contains(text) == false) {
    					if(result % 1 == 0) {
    						info.setText(info.getText() + label.getText() + text);
    						label.setText(String.valueOf((int) result));
    					}else {
    						info.setText(info.getText() + label.getText() + text);
    						label.setText(String.valueOf(result));
    					}
    				}
    			}
    		}
    	}
    	
    	public double Calculator(String ss) {
    		return 0;
    	}
    	private void setBackSpace(String bs) {
    		label.setText(bs);
    	}
    	
    	private String getBackSpace() {
    		return label.getText();
    	}
    
    	public static void main(String[] args) {
    		new MyCalc();
    	}
    }

    나쁘지 않은 결과물이라 생가한다. 구현하고 싶었던 것들은 대부분 구현하는데 성공했고 수많은 에러를 해결하는 과정도 좋았다. 확실히 이런 프로젝트를 하나 잡고 완성까지 직접 하면 모르던 것들 새로운 것들을 많이 알게되는 것 같고 공부에도 많은 도움이 된다.

    다음엔 무엇을 해볼까...?

     

    아 참고로 코드는 깃헙에도 올라가있다.

    https://github.com/goodunkuck/Project

     

    GitHub - goodunkuck/Project

    Contribute to goodunkuck/Project development by creating an account on GitHub.

    github.com

    댓글