728x90
안녕하세요. 이번 시간에는 람다식을 사용해서 계산 기능을 만들겠습니다.
그동안 함수를 매개변수로 넘기고 싶은데, 람다식에 대해서 모르면, 번거롭게 인터페이스를 만들어서 하셨을 겁니다. 이제 그러시지 않으셔도 됩니다.
이번 시간에 만들 것은 더하기, 빼기, 곱하기 등 단일 연산을 하는 계산기를 만들겠습니다.
그런데 부호를 누르면 계산이 되는 것이 아닌, 부호를 선택하고 계산하기를 눌러야 계산이 되게 하겠습니다.
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 |