Side Projects - Calculator
우리가 평소에 기본 앱으로 자주 사용하는 계산기 앱을 구현하는 간단한 프로젝트
기본적인 사칙연산 기능 뿐만 아니라 계산 히스토리를 볼 수 있는 기능을 추가한 앱을 개발합니다.
- GitHub Repository-> https://github.com/hwayeon351/Calculator
학습 회고
오늘은 어제 만들어 두었던 계산기 레이아웃에 계산 기능을 추가하는 실습을 진행했다.
이를 위해 먼저 xml 파일에 정의한 View들을 MainActivity에 연결해줘야 한다.
그리고 사용자가 계산기의 버튼을 클릭할 때의 경우들을 모두 살펴서 올바르게 동작하도록 로직을 구현해야 한다.
오늘 공부한 내용
- by lazy를 사용한 초기화
변수를 선언하고 이후에 초기화 하는 경우들이 있다. 예를 들어 안드로이드의 경우, xml 파일에서 layout을 구성하고 Java 파일에서 View들을 연결해줄때, 전역변수에 View를 선언해주고 실제 초기화는 Oncreate() 함수가 실행될 때 진행한다.
이 경우에 코틀린에서는 by lazy를 사용해서 초기화를 해주는 것이 유용하다.
by lazy는 한 번 초기화를 한 이후에 변경이 필요 없는 val 타입의 변수를 할당할 때 사용할 수 있다.
xml 파일에서 만든 2개의 TextView를 Java 파일에 연결해줄 때 이렇게 by lazy를 사용해서 실제 TextView가 사용될 때 블록 안의 초기화 구문이 실행된다.
따라서, 저렇게 전역변수로 선언을 해주고 실제 초기화는 OnCreate() 함수가 실행되고 TextView가 화면에 그려진 이후에 해당 TextView를 사용하는 첫 시점에서 findViewById를 통해 xml에 그려준 TextView가 Java 파일에 연결이 되는 것이다.
- 버튼에 Onclick Listener를 xml 파일에서 지정
버튼에 Onclick Listener를 xml 파일에서 지정할 수 있다. android:onClick이라는 속성을 이용해서 연결해 줄 메서드(Java 파일에서 선언한 매서드)를 지정해주는 방식이다.
계산기의 숫자와 피연산자 버튼을 클릭했을 때 실행되는 매서드 buttonClicked를 Java파일에 생성하고 xml에서 각 버튼들에 onClick 속성을 통해 지정해주었다.
이후, R.id 값을 통해 각각의 버튼을 클릭했을 때 발생해야하는 다음 로직을 when문을 통해 지정해주었다.
- SpannableStringBuilder
위와 같이 연산자는 검정색으로 피연산자는 초록색으로 텍스트 색을 넣기 위해서 Span을 사용할 수 있다.
Span은 텍스트에 색상을 추가하거나 텍스트를 클릭 가능하게 만들거나, 크기를 조정하는 등 다양한 방식으로 텍스트를 변경할 수 있도록 한다.
Span을 만들 때 사용하는 클래스는 SpannedString, SpannableString, SpannableStringBuilder가 있는데 사용 여건에 따라 각각 다르다.
만들고자 하는 계산기 앱에서는 계산식을 텍스트로 가져와 연산자를 초록색으로 변경해주고 변경된 텍스트를 다시 TextView에 적용해야 한다.
따라서, Span을 만들고 텍스트를 수정해서 Span을 다시 텍스트를 연결하는 경우에 사용되는 Spannable String Builder를 이용했다.
SpannableStirngBuilder는 Spannable 인터페이스를 확장한다. 따라서 Span을 적용할 때 Spannable 객체의 setSpan을 사용할 수 있다.
public abstract void setSpan (Object what,
int start,
int end,
int flags)
setSpan의 인자에는 what, start, end, flags 4개의 인자가 들어간다.
what은 텍스트에 적용할 Span을 넣어주고, start와 end를 통해 해당 Span을 적용할 범위를 지정한다.
그리고 flags에는 Spannable.SPAN_EXCLUSIVE_INCLUSIVE와 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE를 지정할 수 있는데, Span 경계에 텍스트를 삽입하려면 Spannable.SPAN_EXCLUSIVE_INCLUSIVE를 아니라면 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE를 지정한다.
https://developer.android.com/guide/topics/text/spans?hl=ko
- 객체의 확장 함수를 정의하는 방법
계산기의 버튼을 클릭해 만든 계산식을 계산하기 위해서는 피연산자1 | 연산자 | 피연산자2의 구조로 계산식이 잘 짜여져 있는지를 판단해줘야한다. 이때 피연산자가 2개 필요하기 때문에 String 타입으로 정의된 계산식에서 피연산자가 2개 존재하는지를 판단해야 한다.
따라서 피연산자가 숫자로 이뤄져있는지 아닌지를 판단하기 위해서 String.isNumber()이라는 확장 함수를 정의했다.
String 객체를 확장하는 함수는 객체.확장함수명 형태로 정의해주면 된다.
'Android > Side Projects' 카테고리의 다른 글
Pomodoro Timer 앱 개발하기 (0) | 2022.01.29 |
---|---|
전자 액자 앱 개발하기 (0) | 2022.01.28 |
전자 액자 앱 개발하기 (3) | 2022.01.27 |
계산기 앱 개발하기 (0) | 2022.01.26 |
계산기 앱 개발하기 (0) | 2022.01.24 |