밍비
프로그램의 편린
밍비
전체 방문자
오늘
어제
  • 분류 전체보기 (64)
    • Spring (2)
    • TIL (23)
    • 프로그래머스 (12)
    • Udemy (16)
    • Typescript (2)
    • MERN (1)
    • AWS (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 컴포넌트트리
  • state 관리
  • 한입 크기로 잘라먹는 리액트
  • react
  • AWS Regions
  • 리액트 생애주기
  • useNavigate
  • state 끌어올리기
  • Page Moving
  • Edge Locations
  • overflow-wrap
  • useState
  • Availability Zones
  • 리액트
  • 리액트 reducer
  • API 호출
  • 리스트 조회
  • 데이터 수정
  • 함수형 update
  • 한입크기로잘라먹는리액트
  • 서비스아키텍처
  • 분산저장소
  • useRef
  • State 합치기
  • useParams
  • DOM
  • 리액트 프로젝트 만들기
  • 네이버커넥트
  • Points of Presence
  • 수평 스케일링

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
밍비

프로그램의 편린

[코틀린][안드로이드] #0721 계산기 앱 만들기 - 3
TIL

[코틀린][안드로이드] #0721 계산기 앱 만들기 - 3

2022. 7. 21. 23:29
728x90

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

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 넣는다.

위의 설정이 적용된 editText

마찬가지로 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 효과도 주면

나름 볼만해졌다.

끝~~특강 파이팅!! 피드백 환영!!

728x90

'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
    밍비
    밍비

    티스토리툴바