Android

[Android] 계산기 앱 만들기

poppy 2020. 9. 14. 21:19
반응형

윈도우 계산기를 기반으로 하여 계산기 앱을 만들어 보았습니다!

Button.OnClickListener onClickListener = new Button.OnClickListener() {
            public void onClick(View view) {
            	//버튼id로 케이스 나누기
                switch (view.getId()) {
                	//숫자버튼
                    case R.id.btn_0:
                        if(tv_result.getText().toString().equals("0")) {
                            tv_result.setText("0");
                        }
                        else {
                            tv_process.setText(tv_process.getText().toString() + "0");
                            tv_result.setText(tv_result.getText().toString() + "0");
                        }
                        break;
                    //~나머지 생략
                    
                    //.버튼
                    case R.id.btn_dot:
                        if(tv_result.getText().toString().equals("0"))
                            tv_process.setText("0");
                        tv_process.setText(tv_process.getText().toString() + ".");
                        tv_result.setText(tv_result.getText().toString() + ".");
                        break;
                        
                    //=버튼
                    case R.id.btn_result:
                        tv_process.setText(tv_process.getText().toString() + "=");
                        num2 = tv_result.getText().toString();

                        Double num_1 = Double.parseDouble(num1);
                        Double num_2 = Double.parseDouble(num2);

                        switch (operator) {
                            case "+":
                                tv_result.setText(num_1 + num_2 + "");
                                break;
                          	//~나머지 생략
                            case "/":
                                try {
                                    if(num_2 == 0)
                                        throw new ArithmeticException();
                                    tv_result.setText(num_1/num_2 + "");
                                }
                                catch (ArithmeticException e) {
                                    Toast.makeText(getApplicationContext(),"0으로 나눌 수 없습니다", Toast.LENGTH_LONG).show();
                                }
                                break;
                            //~나머지 생략
                        }
                        num1 = tv_result.getText().toString();
                        break;
                        
                    //연산자버튼
                    case R.id.btn_plus:
                        num1 = tv_result.getText().toString();
                        if(num1.equals("0"))
                            tv_process.setText("0");
                        operator = "+";
                        tv_result.setText("");
                        tv_process.setText(tv_process.getText().toString() + "+");
                        break;
                    //~나머지 생략    
                        
                    //C버튼
                    case R.id.btn_clear:
                        tv_process.setText("");
                        tv_result.setText("0");
                        operator = "";
                        num1 = "";
                        num2 = "";
                        break;
                        
                    //DEL버튼
                    case R.id.btn_del:
                        String del_process = tv_process.getText().toString();
                        tv_process.setText(del_process.substring(0,del_process.length() - 1));
                        String del_result = tv_result.getText().toString();
                        tv_result.setText(del_process.substring(0,del_process.length() - 1));
                }
            }
        };
        
        btn_0.setOnClickListener(onClickListener); //클릭시 onClickLisntener 호출
        
}

숫자버튼

숫자버튼 중에서 0버튼은 초기에 tv_result가 0으로 세팅해줬기 때문에 0을 계속 클릭할 경우 0을 계속 추가해주지 않고 0만 보이도록 했습니다. tv_result에 0이 아닌 다른 숫자가 있을 경우에는 숫자를 추가할 수 있도록 해주었습니다

나머지 숫자버튼은 초기에 tv_result가 0으로 세팅되어 있기 때문에 tv_result가 0일 경우 누른 숫자버튼으로 바꾸어주었고, 0이 아닐 경우에는 추가될 수 있도록 해주었습니다.

모든 숫자버튼은 공통적으로 tv_process에 숫자가 계속 추가되어지는 것이 보여지도록 하였습니다.

 

. (dot)버튼

이 버튼은 숫자버튼과 마찬가지로 눌렀을 때 tv_result 와 tv_process 에 추가되어지도록 하였습니다. 하나 특별한 점은 

0을 누르고 이 버튼을 누를 경우 tv_process에 0과 .(dot) 이 같이 추가되어 보이도록 하였습니다.

 

연산자버튼 

연산자버튼은 누를 경우 연산자 누르기 전의 까지의 결과값을 저장하고 tv_result를 초기화해줍니다. 그 다음 연산자를 tv_process 에 추가해줍니다. 0을 누르고 연산자를 누를 경우 0과 연산자가 tv_process에 같이 추가되도록 하였습니다.

 

=버튼

=버튼을 누를 경우 먼저 tv_process에 "=" 을 추가해주고, 마지막 숫자인 tv_result 값을 가져와서 저장합니다.

그 다음 두 개의 값이 문자열이기 때문에 연산을 위해 숫자로 바꾸어줍니다. switch-case로 경우를 나눠서 각각 연산을 해주고 tv_result에 나타냅니다. 더하기, 빼기, 곱하기의 경우 연산의 결과를 tv_result에 보여줍니다. 나누기의 경우 0으로 나눌 때 예외를 발생시켜 토스트메세지로 알려주도록 하였습니다.

 

C버튼

C버튼은 모든 것을 초기화해줍니다. tv_process, tv_result 등 모든 것을 초기화해줍니다.

 

DEL버튼

DEL버튼은 문자열을 지우는 버튼입니다. 값을 가져와서 저장을 한 후 substring() 메소드를 통해 마지막 문자만 빼고 문자열을 잘라낸 후 tv_process 와 tv_result에 보여줍니다.

 

주의할 점은 버튼.setOnClickListener(onClickListener); 을 꼭 해주어야 동작합니다! 해당 버튼 클릭시 onClickListener로 가서 일을 처리하겠다는 의미입니다.

 

다음은 실행화면입니다

 

반응형