4 minute read

안드로이드를 사용해 계산기를 만들어 보도록 하겠습니다.

📜구성Permalink


컴포넌트 트리는 아래와 같습니다.

image

ConstraintLayout에 숫자와 연산, 계산을 나타내는 17개의 Button, 텍스트를 보여주는 textView(result_text), 선을 나타내는 view(view2)로 구성되어 있습니다.


image Textview를 사용해 계산 결과를 확인할 수 있도록 하였고, 처음 실행시에는 0을 보여주도록 설정하였습니다.


image

Button들은 chain기능을 사용하여 배치하였고, layout_width은 wrap_content로, layout_height는 0으로 설정하였습니다. 숫자 버튼을 누르면 숫자가 텍스트뷰에 나타나게 되고, 연산 버튼을 누르면 숫자끼리의 연산이 이루어집니다. 또, CLEAR 버튼은 텍스트 뷰를 비우는 버튼이며, OK버튼은 연산의 최종적인 결과를 텍스트 뷰에 나타내게 됩니다.


image

계산기를 사용하기 위해서는 숫자를 먼저 입력해야 합니다. 따라서 연산자를 먼저 입력했을 경우, “숫자를 입력하세요.”라는 토스트 메시지가 나오도록 설정했습니다.


📜설명Permalink


    //변수선언
    private TextView text;
    private double storedVal;
    private char curOperator;

MainActivity클래스에 변수를 선업합니다. Text는 TextView변수, storedVal은 실수를 나타내는 double변수, curOperator은 문자를 나타내는 char변수입니다.


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text = findViewById(R.id.result_text);
    }

Textview의 id값을 가져와 TextView변수인 text에 연결하여 대입합니다.


 public void  onClick(View view){
        String current = text.getText().toString();

        switch (view.getId()){
            case R.id.num0:
                text.setText(current + "0");
                break;
            case R.id.num1:
                text.setText(current + "1");
                break;
            case R.id.num2:
                text.setText(current + "2");
                break;
            case R.id.num3:
                text.setText(current + "3");
                break;
            case R.id.num4:
                text.setText(current + "4");
                break;
            case R.id.num5:
                text.setText(current + "5");
                break;
            case R.id.num6:
                text.setText(current + "6");
                break;
            case R.id.num7:
                text.setText(current + "7");
                break;
            case R.id.num8:
                text.setText(current + "8");
                break;
            case R.id.num9:
                text.setText(current + "9");
                break;
            case R.id.dot:
                text.setText(current + ".");
                break;

onclick함수를 생성하여 기능을 넣어줍니다. 문자열 변수이자, 현재 값을 나타내는 변수인 current를 만들어 text변수의 텍스트를 가져와 문자열로 변경한 후, 저장합니다. 그리고 각 숫자 버튼을 누르면 해당되는 숫자가 나타나도록 switch문을 사용하였습니다.


            case R.id.plus:
                if(current.equals("")){
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요.",
                            Toast.LENGTH_SHORT).show();
                }else{
                    storedVal = Double.parseDouble(current);
                    curOperator = '+';
                    text.setText("");
                    break;
                }
            case R.id.minus:
                if (current.equals("")) {
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요", Toast.LENGTH_SHORT).show();
                } else {
                    storedVal = Double.parseDouble(current);
                    curOperator = '-';
                    text.setText("");
                    break;
                }
            case R.id.times:
                if (current.equals("")) {
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요", Toast.LENGTH_SHORT).show();
                } else {
                    storedVal = Double.parseDouble(current);
                    curOperator = '*';
                    text.setText("");
                    break;
                }
            case R.id.divide:
                if (current.equals("")) {
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요", Toast.LENGTH_SHORT).show();
                } else {
                    storedVal = Double.parseDouble(current);
                    curOperator = '/';
                    text.setText("");
                    break;
                }

            case R.id.clear:
                text.setText("");
                storedVal = 0.0;
                break;

if문을 사용해 숫자입력 없이 연산자를 먼저 눌렀을 경우, “숫자를 입력하세요”라는 토스트 메시지가 짧게 나타나게 됩니다. 숫자를 누르고 연산자를 눌렀다면, 각각의 연산을 실행할 수 있도록 하였습니다. CLEAR버튼은 초기화 버튼이므로, 클릭하면 빈 문자열이 나타나도록 설정해 주었고 storedVal값도 0.0으로 초기화 시켜주었습니다.


            case R.id.result:
                if (current.equals("")) {
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요", Toast.LENGTH_SHORT).show();
                } else {
                    double result = 0;
                    double thisValue = Double.parseDouble(text.getText().toString());
                    switch (curOperator) {
                        case '+':
                            result = storedVal + thisValue;
                            break;
                        case '-':
                            result = storedVal - thisValue;
                            break;
                        case '*':
                            result = storedVal * thisValue;
                            break;
                        case '/':
                            result = storedVal / thisValue;
                            break;
                    }

OK버튼의 id는 result이며, 이 버튼 역시 먼저 클릭되면 토스트 메시지가 짧게 나타나게 됩니다. 만약 계산 결과를 알기 위해 OK버튼을 눌렀을 경우는 else문에 해당합니다. 실수형 변수인 result를 만들어 0으로 초기화하고, thisValue변수를 만들어 텍스트 뷰의 텍스트들을 문자열로 바꿔 저장합니다. Switch문을 사용하여 +이면 덧셈 연산, -이면 뺄셈 연산, *이면 곱셈 연산, /이면 나눗셈 연산이 수행되도록 합니다.


                    String s_result = Double.toString(result);
                    if (s_result.charAt(s_result.length()-1) == '0' && s_result.charAt(s_result.length()-2) == '.'){
                        text.setText(""+(int)result);
                    }else {
                        text.setText("" + result);
                    }

                    storedVal = 0.0;
                    break;
                }
        }

    }

연산을 수행하고 결과변수인 result를 문자열로 바꿔 s_result함수에 대입합니다. 그리고 if문을 사용하여 s_result에서 1을 뺀 값이 0이고, 2를 뺀 값이 -이면 정수형으로 결과를 나타내고, 조건이 성립하지 않으면 실수형으로 결과가 나타나도록 했습니다. OK버튼을 누르면 storedVal의 값은 0.0으로 초기화됩니다!


📜결과Permalink


image

image


📜코드Permalink


package com.example.calculator;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private TextView text;
    private double storedVal;
    private char curOperator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text = findViewById(R.id.result_text);
    }

    public void  onClick(View view){
        String current = text.getText().toString();

        switch (view.getId()){
            case R.id.num0:
                text.setText(current + "0");
                break;
            case R.id.num1:
                text.setText(current + "1");
                break;
            case R.id.num2:
                text.setText(current + "2");
                break;
            case R.id.num3:
                text.setText(current + "3");
                break;
            case R.id.num4:
                text.setText(current + "4");
                break;
            case R.id.num5:
                text.setText(current + "5");
                break;
            case R.id.num6:
                text.setText(current + "6");
                break;
            case R.id.num7:
                text.setText(current + "7");
                break;
            case R.id.num8:
                text.setText(current + "8");
                break;
            case R.id.num9:
                text.setText(current + "9");
                break;
            case R.id.dot:
                text.setText(current + ".");
                break;
            case R.id.plus:
                if(current.equals("")){
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요.",
                            Toast.LENGTH_SHORT).show();
                }else{
                    storedVal = Double.parseDouble(current);
                    curOperator = '+';
                    text.setText("");
                    break;
                }
            case R.id.minus:
                if (current.equals("")) {
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요", Toast.LENGTH_SHORT).show();
                } else {
                    storedVal = Double.parseDouble(current);
                    curOperator = '-';
                    text.setText("");
                    break;
                }
            case R.id.times:
                if (current.equals("")) {
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요", Toast.LENGTH_SHORT).show();
                } else {
                    storedVal = Double.parseDouble(current);
                    curOperator = '*';
                    text.setText("");
                    break;
                }
            case R.id.divide:
                if (current.equals("")) {
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요", Toast.LENGTH_SHORT).show();
                } else {
                    storedVal = Double.parseDouble(current);
                    curOperator = '/';
                    text.setText("");
                    break;
                }

            case R.id.clear:
                text.setText("");
                storedVal = 0.0;
                break;

            case R.id.result:
                if (current.equals("")) {
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요", Toast.LENGTH_SHORT).show();
                } else {
                    double result = 0;
                    double thisValue = Double.parseDouble(text.getText().toString());
                    switch (curOperator) {
                        case '+':
                            result = storedVal + thisValue;
                            break;
                        case '-':
                            result = storedVal - thisValue;
                            break;
                        case '*':
                            result = storedVal * thisValue;
                            break;
                        case '/':
                            result = storedVal / thisValue;
                            break;
                    }
                    String s_result = Double.toString(result);
                    if (s_result.charAt(s_result.length()-1) == '0' && s_result.charAt(s_result.length()-2) == '.'){
                        text.setText(""+(int)result);
                    }else {
                        text.setText("" + result);
                    }

                    storedVal = 0.0;
                    break;
                }
        }

    }
}