본문 바로가기
안드로이드 코틀린

[Kotlin][Android] Lambda 사용해서 계산 기능 만들기

by teamnova 2022. 6. 13.

안녕하세요. 이번 시간에는 람다식을 사용해서 계산 기능을 만들겠습니다.

그동안 함수를 매개변수로 넘기고 싶은데, 람다식에 대해서 모르면, 번거롭게 인터페이스를 만들어서 하셨을 겁니다. 이제 그러시지 않으셔도 됩니다.

 

이번 시간에 만들 것은 더하기, 빼기, 곱하기 등 단일 연산을 하는 계산기를 만들겠습니다.

그런데 부호를 누르면 계산이 되는 것이 아닌, 부호를 선택하고 계산하기를 눌러야 계산이 되게 하겠습니다.

 

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"
    }
}

 

 

실행 화면 입니다.