이때까지 한 걸 되돌아보자.


splash 애니메이션과 계산기 버튼을 누를 경우 연산자와 피연산자를 나누어 로그에 띄우는 것까지 완료하였다.
이제 본격적으로 계산 로직을 짜보자.
1. 값을 받아 계산하기
여기서 괄호를 쓰지는 않기 때문에 후위연산자를 사용하지는 않을 것이다.
다만, 곱셈과 나눗셈을 먼저 계산한 후 덧셈뺄셈 계산하는 부분에 전달할 것이다.
class CalcUtil {
fun getResult(expr: String): Double{
val calcUnits: List<String> = expr.split(" ") as MutableList<String>
val handleUnits = ArrayList<String>()
val result= ArrayList<String>()
var i = 0
while(i < calcUnits.size){
if(calcUnits[i] == "*"){
handleUnits.set(
handleUnits.size-1,
(handleUnits[handleUnits.size-1].toDouble() * calcUnits[i+1].toDouble()).toString()
)
i++
} else if (calcUnits[i] == "/"){
handleUnits.set(
handleUnits.size-1,
(handleUnits[handleUnits.size-1].toDouble() / calcUnits[i+1].toDouble()).toString()
)
i++
}else{ //숫자, +, -
handleUnits.add(calcUnits[i])
}
i++
}
return 0.0
}
}
곱셈과 나눗셈을 계산하는 부분이다.
calcUnits에서 곱셈과 나눗셈을 계산한 후 남은 값들을 덧셈뺄셈 기호와 함께 handleUnits 배열(동적으로 추가할 것이라 ArrayList를 사용)로 보냈다.
i = 0
while(i < handleUnits.size){
if(handleUnits[i]=="+"){
result.set(
result.size-1,
(result[result.size-1].toDouble() + handleUnits[i+1].toDouble()).toString()
)
i++
} else if(handleUnits[i]=="-"){
result.set(
result.size-1,
(result[result.size-1].toDouble() - handleUnits[i+1].toDouble()).toString()
)
i++
} else{
result.add(handleUnits[i])
}
i++
}
return result[0].toDouble()
덧셈뺄셈을 처리하는 부분이다.
곱셈나눗셈 계산할 때와 비슷하게 handleUnits에서 차례대로 연산을 처리한 후 결과를 result로 전달한다.
2. 메인액티비티 xml파일 꾸미기

화면 디자인을 살짝만 바꾸어도 완성도가 크게 올라간다.
drawable에 가서 drawable resource file을 추가한다. 이때, root element를 selector에서 shape로 바꿔준다.
shape_input_background.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white" />
<stroke android:width="1dp" android:color="@color/black" />
<corners android:radius="3dp" />
</shape>
이렇게 작성해준 후, activity_main에서 editText의 background로 적용해준다.
padding을 4dp정도 넣어주고, layout_height를 40dp정도 만든다.
hint도 넣어주면 좋다. 힌트 메시지가 너무 왼쪽에 붙어있으므로 paddingLeft를 10dp 넣는다.

마찬가지로 drawable에 버튼에 적용할 디자인도 추가한다.
shape_button_back_***
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FCA3CC" />
<corners android:radius="50dp" />
</shape>
이런 식으로 색깔별로 만들어서 버튼의 background에 씌워준다.
하지만 처음에는 색이 보라색에서 바뀌지 않는데, 이는 material design이 적용되고 있어서이다.
이를 바꾸기 위해서는 res->values->themes 로 가서, 각 파일의 parent를 materialComponents에서
"Theme.AppCompat.DayNight.NoActionBar"
으로 바꾸어준다. 위에 있었던 액션바도 지워준다.
모든 버튼의 높이(layout_height)도 60dp로 키우고, 간격(layout_margin)도 4dp씩 띄워준다.
textSize도 키우고 bold 효과도 주면

나름 볼만해졌다.

끝~~특강 파이팅!! 피드백 환영!!
'TIL' 카테고리의 다른 글
[WebSocket] Http vs WebSocket (0) | 2022.10.07 |
---|---|
[Swift][iOS][SwiftUI] #0801 json mock 데이터 파싱해서 화면에 뿌리기 (0) | 2022.08.01 |
#0720 [안드로이드][코틀린] 계산기 앱 만들기 - 2 (0) | 2022.07.21 |
#0718 [안드로이드][코틀린] 계산기 앱 만들기 - 1 (0) | 2022.07.20 |
#0711 코루틴과 비동기처리 (0) | 2022.07.18 |