wanna be dev 🧑‍💻

Cool 하고 Sick한 개발자가 되고 싶은 uzun입니다

A.K.A. Kick-snare, hyjhyj0901, h_uz99 solvedac-logo

Android/Challenge

패스트캠퍼스 챌린지 27일차

Kick_snare 2022. 2. 19. 19:06
728x90

30개 프로젝트로 배우는 Android 앱 개발 with Kotlin 초격차 패키지 Online

강의 목표


  • 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
  • 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
  • 앱 개발시 원하는 기능을 구현하기 위해 어떤 기술이 필요한 지 알 수 있습니다.
  • 디자인 아키텍처 패턴, 비동기 처리 등 효율적인 앱 개발 방법을 익힐 수 있습니다.

목차 02 Basic - Ch04. 계산기


  • 인트로
  • 계산기 UI 그리기 - 1
  • 계산기 UI 그리기 - 2
  • 계산기 UI 그리기 - 3
  • 계산기로 계산하기 - 1
  • 계산기로 계산하기 - 2
  • 계산 기록 저장하기 - 1
  • 계산 기록 저장하기 - 2
  • 아웃트로

계산기로 계산하기 - 1

  • 저번 포스팅 까지는 VIew와 그 안의 버튼들을 설계하고 그에 따른 핸들러를 등록하였다
  • 그 핸들러 함수를 짜보도록 하자
  • 먼저 일반적인 버튼(숫자, 연산자)들이 눌리면 buttonClicked 핸들러가 동작되도록 하였다
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.btnadd -> operatorButtonClicked("+")
        R.id.btnminus -> operatorButtonClicked("-")
        R.id.btnmul -> operatorButtonClicked("*")
        R.id.btndiv -> operatorButtonClicked("/")
        R.id.btnmod -> operatorButtonClicked("%")
    }
}
  • 연산자와 숫자의 기능이 다르므로 다른 함수를 사용하였다
  • when 문에서 View의 id를 기준으로 분기처리하였다
  • 먼저 numberButtonClicked 를 살펴보자
expressionTextView.append(number)
  • 숫자가 들어가면 expression 창에 추가해주면된다
  • 다만 예외처리 해야하는 사항이 3가지 있다
    1. 숫자를 눌리기 전에 연산자를 눌렀는지
    2. 입력하는 숫자가 15자리를 넘지 않는지
    3. 숫자가 0으로 시작하지 않는지
if(isOperator) {
    expressionTextView.append(" ")
    isOperator = false
}

val expressionText = expressionTextView.text.split(" ")
if (expressionText.isNotEmpty() && expressionText.last().length >= 15) {
    Toast.makeText(this, "15자리 까지만 사용할 수 있습니다", Toast.LENGTH_SHORT)
    return
} else if (expressionText.last().isEmpty() && number == "0") {
    Toast.makeText(this, "0은 젤 앞에 올 수 없습니.", Toast.LENGTH_SHORT)
    return
}
  • 이전에 연산자를 선택했을 경우, 띄어쓰기를 위해 공백 한칸을 추가해준다
  • 자릿수와 선행되는 0이 있는지 예외처리해준다
  • 다음은 연산자 버튼을 눌렀을 때의 operatorButtonClicked 를 보자
if (expressionTextView.text.isEmpty()) return

when {
    isOperator -> {
        val text = expressionTextView.text.toString()
        expressionTextView.text = text.dropLast(1)
    }
    hasOperator -> {
        Toast.makeText(this, "연산자는 한번만 사용할 수 있습니다.", Toast.LENGTH_SHORT)
        return
    }
    else -> {
        expressionTextView.append(" $operator")
    }
}

val ssb = SpannableStringBuilder(expressionTextView.text)

ssb.setSpan(
    ForegroundColorSpan(getColor(R.color.green)),
    expressionTextView.text.length - 1,
    expressionTextView.text.length,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
expressionTextView.text = ssb

isOperator = true
hasOperator = true
  • 연산자 버튼을 눌렀는데, expression이 비어있다면 무시한다 (return)
  • 연산자 버튼을 눌렀는데, 이미 이전에 연산자 버튼을 눌렀다면 연산자를 수정한다
  • 연산자 버튼을 눌렀는데, 이미 예전에 연산자 버튼을 눌러 가지고 있다면 메세지를 띄우고 종료
  • 연산자를 띄어 쓰기와 함께 expression에 추가한다
  • 연산자 기호는 색상을 주기 위해 Spannable String을 사용한다 (녹색)

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

수강인증샷

 

 

링크

https://bit.ly/37BpXiC

 

 

 

 

 

 

728x90