패스트캠퍼스 챌린지

[패스트캠퍼스 챌린지 1일차] Android

핸드폰에서 자주 이용하는 기본 어플 중에 계산기를 만들어보았습니다. 레이아웃을 완성하고 오늘은 숫자 버튼을 눌러서 위 화면에 표시하고 연산자들을 사용해서 결과값을 보여주는 기능, 숫자들을 지워주는 clear 기능과 결과값을 나타내 주는 = 버튼 기능까지 구현하였습니다.

fun buttonClicked(v: View){
        when(v.id){
            R.id.btn0 -> numberButtonClicked("0")
            R.id.btn1 -> numberButtonClicked("1")
            R.id.btn2 -> numberButtonClicked("2")
            R.id.btn3 -> numberButtonClicked("3")
            R.id.btn4 -> numberButtonClicked("4")
            R.id.btn5 -> numberButtonClicked("5")
            R.id.btn6 -> numberButtonClicked("6")
            R.id.btn7 -> numberButtonClicked("7")
            R.id.btn8 -> numberButtonClicked("8")
            R.id.btn9 -> numberButtonClicked("9")
            R.id.btnMulti -> operatorButtonClicked("X")
            R.id.btnMinus -> operatorButtonClicked("-")
            R.id.btnPlus -> operatorButtonClicked("+")
            R.id.btnModulo -> operatorButtonClicked("%")
            R.id.btnDivider -> operatorButtonClicked("/")
        }
    }

버튼을 눌렀을 때 사용되는 함수를 만들면서 when의 사용을 알게 되었습니다. when문은 다른 언어 문법에서 switch문과 매우 흡사합니다. 위에 코드는 R.id.btn* 버튼의 아이디를 불러와서 numberButtionClicked 함수에 일치하는 숫자를 문자열 형태의 인자로 전달해줍니다. btnMulti, btnMinus, btnPlus, btnModulo, btnDivider는 연산자로 operatorButtonClicked함수에 일치하는 연산자를 문자열 형태의 인자로 전달해줍니다.

private fun numberButtonClicked(number : String){
        if(isOperator){
            expressionTextView.append(" ")
        }
        isOperator = false
        val expression = expressionTextView.text.split(" ")
        if(expression.isNotEmpty() && expression.last().length >= 15){
            Toast.makeText(this, "15자리 까지만 사용할 수 있습니다.",Toast.LENGTH_SHORT).show()
            return
        }
        else if(expression.last().isEmpty() && number == "0"){
            Toast.makeText(this,"0이 맨 앞에 올 수 없습니다.",Toast.LENGTH_SHORT).show()
            return
        }
        expressionTextView.append(number)
        resultTextView.text = calculateExpression()

    }

위에서 부른 numberButtonClicked함수는 isOperator(지금 누른것이 연산자 인지 확인)를 이용해서 숫자가 아니라면 공백을 채워줍니다. expression 변수는 expressionTextView에 있는 text를 split 함수를 이용하여 공백을 기준으로 나눠서 저장합니다. expression이 공백이 아니고 숫자를 15개 이상 누르게 되면 Toast 메시지를 띄워 예외 처리해준다. 또한 지금 expression이 비어있는데 0이 제일 먼저 들어오게 되는 경우도 Toast 메시지를 띄워 예외 처리해줍니다.

정상적으로 입력이 되었다면 expressionTextView에 숫자를 나타내 줍니다.

(resultTextView의 text에는 calculateExpression 함수를 이용하여 값을 넣어준 것은 아래 코드로 설명)

private fun calculateExpression(): String{
        val expressionTexts = expressionTextView.text.split(" ")
        if(hasOperator.not() || expressionTexts.size != 3){
            return ""
        }else if(expressionTexts[0].isNumber().not() && expressionTexts[2].isNumber().not()){
            return ""
        }
        val exp1 = expressionTexts[0].toBigInteger()
        val exp2 = expressionTexts[2].toBigInteger()
        val op = expressionTexts[1]
        return when(op){
            "+"-> (exp1 + exp2).toString()
            "-"-> (exp1 - exp2).toString()
            "X"-> (exp1 * exp2).toString()
            "/"-> (exp1 / exp2).toString()
            "%"-> (exp1 % exp2).toString()
            else->""

        }
    }

hasOperator(지금 연산자가 한 번은 입력되었는지 확인)가 아니거나 사이즈가 3이 아니라면 빈 값을 return 해줍니다.

expressiontexts의 첫 번째 인자와 3번째 인자가 둘 다 숫자가 아니라면 빈 값을 return 해줍니다.

위 두 개의 예외처리가 발생하지 않고 정상적으로 입력되었다면 입력받은 숫자와 연산자를 이용하여 계산하고 결과를 보여줍니다.

 

 

패스트캠퍼스 바로가기 -> https://bit.ly/3FVdhDa

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.