안녕하세요. 이번 시간에는 람다식을 사용해서 계산 기능을 만들겠습니다.
그동안 함수를 매개변수로 넘기고 싶은데, 람다식에 대해서 모르면, 번거롭게 인터페이스를 만들어서 하셨을 겁니다. 이제 그러시지 않으셔도 됩니다.
이번 시간에 만들 것은 더하기, 빼기, 곱하기 등 단일 연산을 하는 계산기를 만들겠습니다.
그런데 부호를 누르면 계산이 되는 것이 아닌, 부호를 선택하고 계산하기를 눌러야 계산이 되게 하겠습니다.
activity를 하나 생성합니다.
layout입니다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.rai.MainActivity">
<EditText
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="48dp"
android:layout_marginLeft="48dp"
android:layout_marginTop="108dp"
android:inputType="number"
android:hint="value 1"
android:textSize="24sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginLeft="20dp"
android:inputType="number"
android:hint="value 2"
android:textSize="24sp"
app:layout_constraintStart_toEndOf="@+id/tv1"
app:layout_constraintTop_toTopOf="@+id/tv1" />
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="36dp"
android:layout_marginLeft="36dp"
android:text="결과 :"
android:textSize="24sp"
app:layout_constraintStart_toEndOf="@+id/tv2"
app:layout_constraintTop_toTopOf="@+id/tv2" />
<Button
android:id="@+id/btn_plus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="더하기"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv2" />
<Button
android:id="@+id/btn_minus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="빼기"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_plus" />
<Button
android:id="@+id/btn_multiply"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="곱하기"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_minus" />
<Button
android:id="@+id/btn_div"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="나누기"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_multiply" />
<TextView
android:id="@+id/selected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="64dp"
android:padding="10dp"
android:ems="10"
android:hint="누른 연산자"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_div" />
<Button
android:id="@+id/btn_calculate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="계산하기"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/selected" />
</androidx.constraintlayout.widget.ConstraintLayout>
acitivty입니다.
람다식 정의 방법은 쉽습니다.
(매개변수) -> 결과 (없는 경우 Unit)입니다.
예를 들어 int 2개를 받아서 결과값이 String인 함수형은
(Int, Int) -> String 로 두시면 됩니다.
class MainActivity : AppCompatActivity() {
lateinit var etInt1 : EditText
lateinit var etInt2 : EditText
lateinit var selectedCal : TextView
lateinit var btnPlus : Button
lateinit var btnMinus : Button
lateinit var btnMulti : Button
lateinit var btnDiv : Button
lateinit var doCalculate : Button
lateinit var tvResult : TextView
var calculate: ((parm1: Int, parm2: Int) -> String)? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout);
etInt1 = findViewById(R.id.tv1)
etInt2 = findViewById(R.id.tv2)
selectedCal = findViewById(R.id.selected)
btnPlus = findViewById(R.id.btn_plus)
btnMinus = findViewById(R.id.btn_minus)
btnMulti = findViewById(R.id.btn_multiply)
btnDiv = findViewById(R.id.btn_div)
doCalculate = findViewById(R.id.btn_calculate)
tvResult = findViewById(R.id.tv_result)
btnPlus.setOnClickListener {
selectedCal.text = "+"
calculate = { parm1 : Int, parm2 : Int ->
(parm1 + parm2).toString()
}
}
btnMinus.setOnClickListener {
selectedCal.text = "-"
calculate = { parm1 : Int, parm2 : Int ->
(parm1 - parm2).toString()
}
}
btnMulti.setOnClickListener {
selectedCal.text = "*"
calculate = { parm1 : Int, parm2 : Int ->
(parm1 * parm2).toString()
}
}
btnDiv.setOnClickListener {
selectedCal.text = "/"
calculate = { parm1 : Int, parm2 : Int ->
if (parm2 != 0) {
(parm1 / parm2).toString()
} else {
"ERROR"
}
}
}
doCalculate.setOnClickListener {
if (calculate == null) {
setResult(0)
return@setOnClickListener
}
doCalculate(calculate!!)
}
}
fun doCalculate(calculate : (parm1 : Int, parm2: Int) -> String) {
setResult(calculate(etInt1.text.toString().toInt(), etInt2.text.toString().toInt()))
}
@SuppressLint("SetTextI18n")
fun setResult(value: String) {
tvResult.text = "결과 : $value"
}
}
실행 화면 입니다.
'안드로이드 코틀린' 카테고리의 다른 글
[Kotlin][Android] BottomSheetDialogFragment 구현해보기 (0) | 2022.06.22 |
---|---|
[Kotlin][Android] 디바이스 전체 화면 길이 구하기 (0) | 2022.06.18 |
[Java][Android] circle-menu 만들기 (0) | 2022.06.12 |
[Kotlin][Android] 오늘 요일 알아오기 (0) | 2022.06.11 |
[Kotlin][Android] ViewModel 공유하기 (0) | 2022.06.10 |