이번에는 안드로이드 스튜디오를 이용해서 만든 간단한 계산기 앱을 보여드리려고 합니다.

 

원래 부스트코스 에이스 과정 중 기업연계 프로젝트로 진행한 주제였는데, ReactNative로 만들어야 하는 걸 제가 시간이 없는 관계로 이틀 동안 스튜디오로 만들었습니다. (하루 정도 코드를 rn으로 변환해보려고 했는데 쉽지가 않아서 포기했습니다. rn을 안드로이드 코드로 바꾸는 것보다 안드로이드 코드를 rn으로 바꾸는 게 더 어렵다는 자료를 본 거 같아요.)

 

먼저 완성된 것부터 보여드리고 코드로 넘어가겠습니다.

 

 

실행 예시

개요

더하기, 빼기, 곱하기, 나누기, 괄호 등으로 구성된 간단한 계산기 구현

 

구성

다른 앱과 기본 계산기 앱 등을 참고하여 사용자의 입력을 표기할 상단 레이아웃, 계산식에 필요한 20개의 버튼이 있는 하단 레이아웃으로 구성.

 

상단 레이아웃 : 사용자 입력을 표기할 텍스트뷰(+스크롤뷰) + 계산 결과 미리보기를 제공하는 텍스트뷰

하단 레이아웃 : 그리드 레이아웃과 거기에 속한 20개의 버튼

 

코드

MainAcitivity.java

 

package com.example.calculator;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
CalculateHelper calculateHelper;

boolean isDot;
boolean isBracket;
boolean isPreview;

TextView textView;
TextView textView2;

int size;

String result;

Button num0;
Button num1;
Button num2;
Button num3;
Button num4;
Button num5;
Button num6;
Button num7;
Button num8;
Button num9;

Button add;
Button sub;
Button mul;
Button div;
Button clear;
Button bracket;
Button percent;
Button back;
Button dot;

Button equal;

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

calculateHelper = new CalculateHelper();

size = 0;
int number = 25;
int t = String.valueOf(Math.sqrt(number)).length();
Log.d("test", "" + t + " ? " + String.valueOf(Math.sqrt(number)));

isPreview = false;
isBracket = false;
isDot = false;

int[][] test = new int[5][4];
setButton();
setTextView();
}

private void setButton() {
num0 = findViewById(R.id.num0);
num1 = findViewById(R.id.num1);
num2 = findViewById(R.id.num2);
num3 = findViewById(R.id.num3);
num4 = findViewById(R.id.num4);
num5 = findViewById(R.id.num5);
num6 = findViewById(R.id.num6);
num7 = findViewById(R.id.num7);
num8 = findViewById(R.id.num8);
num9 = findViewById(R.id.num9);

add = findViewById(R.id.add);
sub = findViewById(R.id.sub);
mul = findViewById(R.id.mul);
div = findViewById(R.id.div);
clear = findViewById(R.id.clear);
bracket = findViewById(R.id.bracket);
percent = findViewById(R.id.percent);
back = findViewById(R.id.back);
dot = findViewById(R.id.dot);

equal = findViewById(R.id.equal);

num0.setOnClickListener(numClickListener);
num1.setOnClickListener(numClickListener);
num2.setOnClickListener(numClickListener);
num3.setOnClickListener(numClickListener);
num4.setOnClickListener(numClickListener);
num5.setOnClickListener(numClickListener);
num6.setOnClickListener(numClickListener);
num7.setOnClickListener(numClickListener);
num8.setOnClickListener(numClickListener);
num9.setOnClickListener(numClickListener);

add.setOnClickListener(markClickListener);
sub.setOnClickListener(markClickListener);
mul.setOnClickListener(markClickListener);
div.setOnClickListener(markClickListener);
clear.setOnClickListener(markClickListener);
bracket.setOnClickListener(markClickListener);
percent.setOnClickListener(markClickListener);
back.setOnClickListener(markClickListener);
dot.setOnClickListener(markClickListener);

equal.setOnClickListener(markClickListener);
}

//숫자 버튼이 눌렸을 경우
private Button.OnClickListener numClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.num0:
textView.append("0");
break;
case R.id.num1:
textView.append("1");
break;
case R.id.num2:
textView.append("2");
break;
case R.id.num3:
textView.append("3");
break;
case R.id.num4:
textView.append("4");
break;
case R.id.num5:
textView.append("5");
break;
case R.id.num6:
textView.append("6");
break;
case R.id.num7:
textView.append("7");
break;
case R.id.num8:
textView.append("8");
break;
case R.id.num9:
textView.append("9");
break;
}

preview();
}
};

//기호 버튼이 눌렸을 경우
private Button.OnClickListener markClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.add:
textView.append(" + ");
isPreview = true;
break;
case R.id.sub:
textView.append(" - ");
isPreview = true;
break;
case R.id.mul:
textView.append(" * ");
isPreview = true;
break;
case R.id.div:
textView.append(" / ");
isPreview = true;
break;
case R.id.percent:
textView.append(" % ");
isPreview = true;
break;
case R.id.clear:
textView.setText("");
textView2.setText("");

calculateHelper = new CalculateHelper();

isPreview = false;

break;
case R.id.bracket:
if (!isBracket) {
textView.append("( ");
isBracket = true;
} else {
textView.append(" )");
isBracket = false;
}

isPreview = true;

break;
case R.id.back:
size = textView.getText().length();

if (size != 0)
textView.setText(textView.getText().toString().substring(0, size - 1));

if (size > 1) {
if (calculateHelper.checkNumber(textView.getText().toString().substring(size - 2)))
preview();
else {
isPreview = false;
textView2.setText("");
}
}

break;
case R.id.dot:
textView.append(".");
isDot = true;
break;
case R.id.equal:
result = textView.getText().toString();
double r = calculateHelper.process(result);

if (!isDot)
textView.setText(String.valueOf((int) r));
else
textView.setText(String.valueOf(r));

textView2.setText("");
isDot = false;
isPreview = false;
break;
}
}
};

private void preview() {
if (isPreview) {
result = textView.getText().toString();
double r = calculateHelper.process(result);

if (!isDot)
textView2.setText(String.valueOf((int) r));
else
textView2.setText(String.valueOf(r));
}
}

private void setTextView() {
textView = findViewById(R.id.first_textView);
textView2 = findViewById(R.id.second_textView);
}

 

설명

버튼 클릭은 숫자, 기호로 구분되어 동작하며 버튼이 눌렸을 경우 append()를 사용하여 textView에 표시

textView2는 결과 미리보기로 1)숫자 입력 2)기호 입력 3)숫자 입력 순으로 앞에 숫자와 기호가 존재하고 다시 숫자가 입력되는 경우 미리보기를 제공한다. 계산은 CalculateHelper에서 진행 후 리턴.

 

CalculateHelper에 대한 것은 다음 글에서 설명하겠습니다.

+ Recent posts