본문 바로가기

혼자해보는 공부

Java 계산기 만들면서 풀이하기(2)

728x90

import java.awt.Color; //JFrame 뺴고 자동입력 됌
import java.awt.Font;
import java.awt.GridLayout; // Grid문을 사용하기위해 선언
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame; // import문을 선언 JFrame에 커서올리고 Ctrl + Shift + O 입력시 자동입력
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class Calculator extends JFrame { // JFrame를 사용하기위해 상속시킴

private JTextField inputSpace;
private String num= "";
private ArrayList<String> equation = new ArrayList<String>();


public Calculator() {

    setLayout(null); // GUI 형식을 지정할 수 있다.

    inputSpace = new JTextField(); // inputSpace에는 GUI로 텍스트를 입력받는 JTextField로 구현
    inputSpace.setEditable(false); // 수정이 불가능하도록 만듬
    inputSpace.setBackground(Color.white); // 배경색을 지정
    inputSpace.setHorizontalAlignment(JTextField.RIGHT); //  오른쪽으로 정렬한다.
    inputSpace.setFont(new Font("Arial", Font.BOLD, 50)); // 폰트 Arial로 지정
    inputSpace.setBounds(8,10,270,70); // x : 8 y : 10 의 위치에 270x70의 크기로 설정

    //버튼패널
    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new GridLayout(4,4,10,10)); // 칸수, 세로 칸수, 좌우간격, 상하간격을 입력 4행 4열로 총 16칸을 만들었다.
    buttonPanel.setBounds(8, 90, 270, 235); //가로위치,세로위치,가로길이,세로길이

    String button_names[] = {"C","÷","×","=","7","8","9","+","4","5","6","-","1","2","3","0"}; // 16칸에 각 값 입력
    JButton buttons[] = new JButton[button_names.length];

    for (int i=0; i<button_names.length; i++) {
        buttons[i] = new JButton(button_names[i]); 
        buttons[i].setFont(new Font("Arial",Font.BOLD, 20)); // 1씩 증가하면서 button_names에 있는 값들을 삽입해준다. 폰트사이즈를 지정함
        if(button_names[i] =="C" )buttons[i].setBackground(Color.red); // C문자일시 백그라운드 색상을 "RED"로 변경
        else if ((i >= 4 && i <= 6) || (i >= 8 && i<= 10) || (i >= 12 && i <= 15)) buttons[i].setBackground(Color.black);
        // 숫자는 모두 black로 지정 i는 순번대로 입력된 숫자를 직접 입력했다.
        else buttons[i].setBackground(Color.GRAY); // 나머지는 "GRAY"로 지정
        buttons[i].setForeground(Color.white); // 폰트는 "Whight"로 지정
        buttons[i].setBorderPainted(false); // 테두리 없애기
        buttons[i].addActionListener(new PadActionListener()); // 버튼이 클릭될 시 동작하도록 설정
        buttonPanel.add(buttons[i]); // 아까만들어둔 버튼판넬에 값을 집 어넣는다.


}

    add(inputSpace); // 기본 인터페이스를 불러온다.
    add(buttonPanel); // 위에서 만든 버튼들에 값을넣어 불러온다.


    setTitle("계산기"); // 창의 제목
    setVisible(true); // 창을 보화면에 나타내도록 설정
    setSize(300, 370); // 창의 사이즈 설정
    setLocationRelativeTo(null); // 창을 한가운데로 나오게 한다.
    setResizable(false); // 창의 사이즈 설정이 불가능 하도록 만든다.
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 창을 닫을때 실행중인 프로그램도 함께 종료시킨다.
}

class PadActionListener implements ActionListener{ // 선언문 ActionListener을 상속시켜서 사용한다.
    public void actionPerformed(ActionEvent e) { // 버튼이 눌려질시 실행 
        String operation = e.getActionCommand();  // 눌려진 버튼의 값을 operation에 삽입(비교해야함)

        if (operation.equals("C")) { // 값이 C 일시 값 패널을 비운다.
            inputSpace.setText("");
            }else if (operation.equals("=")) { // 값이 = 일시 계산한 값을 넣는다.
                String result = Double.toString(calculate(inputSpace.getText())); // result에 숫자값을 해당하는 문자열 표현으로 변환한 후 삽입 ( calculate는 계산식 )
                inputSpace.setText(""+result); // Text패널에 값을 삽입한다.
                num = ""; // num값은 초기화 시킨다.
            }else {
                    inputSpace.setText(inputSpace.getText() + e.getActionCommand()); // = 이 아닐시 원레있던 숫자값에 새로 추가된 숫자 값을 더한다. ( 더하기가 아닌 숫자를 그대로 올린다.)        
            }

    }

}

private void fullTextParsing(String inputText) { // inputText 호출시 실행됨 ( 클릭이벤트로 입력되는값을 화면에 띄우기위한 식)
    equation.clear();  // 변수를 초기화한다.

    for(int i=0; i < inputText.length(); i++) { // inputText안에 있는 값들의 수만큼 비교한다.
        char ch = inputText.charAt(i); // 변수ch에 배열안에 있는 변수중 i 번째에 있는 값을 ch에 삽입

        if(ch == '-' | ch == '+' | ch == '×' | ch == '÷' ) { // ch가 사칙연산인지 확인
            equation.add(num); // 사칙연산일시 밑에있는 else에서 넣어놓은 값을 넣어준다(숫자)
            num =""; // num값은 다시 초기화
            equation.add(ch+ ""); // 사칙연산이 들어가있는 ch값을 넣어준다. ex) 숫자2, + 를 넣으면 우산 if가 else가되서 먼저 2가 equation에 들어간 후 다시 돌아와서 true가 되자마자 num이 먼저 삽입되서 숫자가 들어간 후 사칙연산이 들어가게됌
        } else {
            num = num + ch; // 숫자면 숫자값을 저장한다.
        }

    }
        equation.add(num); // 마지막 값이 사칙연산이 아닐시 else에 있는 num값을 넣어주며 종료(값이 모두 들어간 상태) '=' 이 입력되면 calculate가 호출됌
}

    public double calculate(String inputText) { // '='이 입력됐을때 호출됨  
    fullTextParsing(inputText); // 텍스트에 있는 값을 모두 불러온다.

    double prev = 0; // 변수 선언 소수점까지 해야하기에 double 선언
    double current = 0;
    String mode = "";  // 문자변수 mode 초기화
    for (String s : equation) { // for문 ':' 를 사용하면 (대입받을변수 : 배열명)으로 입력, 배열의 길이만큼 for문이 돌아가게된다.
        if(s.equals("+")) {  // fullTextParsing의 for문 종료 후에 넣어놓은 equation값(모든값)에서 어떤 사칙연산인지 확인한다.
            mode = "add";        
        } else if (s.equals("-")) {
        mode = "sub";        
        } else if (s.equals("×")) {        
        mode = "mul";        
        } else if (s.equals("÷")) {
        mode = "div"; // 사칙연산은 읽어올 수 없으므로 mode에 변수를 넣어주고 계산식을 넣는다.
        } else {
            current = Double.parseDouble(s);  // 사칙연산이 아니라면 계산할 수 있도록 문자열을 정수형으로 변경한다.

            if(mode == "add") {
                prev += current;
            } else if (mode == "sub") {
                prev -= current;
            } else if (mode == "mul") {
                prev *= current;
            } else if (mode == "div") {
                prev /= current;
            } else {
                prev = current; // prev에 current 값을 넣어준다. ( 처음값 )
            }
        }
        }         
            return prev; // 계산된 prev값을 넣어준다.
            }

public static void main(String[] args) {
    // TODO Auto-generated method stub
    new Calculator(); // 위에 있는 클래스를 호출하여 화면이 나온다.


}

}

728x90
댓글