본문 바로가기
Develop/Android

Android 함수를 매개변수로 전달 - kotlin

by 라이프레이서 2020. 5. 16.

목차

    반응형

    kotlin에서는 함수를 이용할 때 이를 매개변수로 전달할 수 있습니다.

    저는 EditText에 대한 확장함수를 만들어 적용해보았습니다.

    먼저 코드를 한 번 보도록 하겠습니다.

    fun EditText.textChangedListener(textChanged : (CharSequence?) -> Unit){
      this.addTextChangedListener(object :TextWatcher{
          override fun afterTextChanged(s: Editable?) = Unit
          override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
          override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
          textChanged(s)
          }
      })
    }

    여기서 addTextChangedListener는 TextWatcher라는 인터페이스를 구현하도록 되어있는데, 이 인터페이스는
    세 가지 메소드를 재정의 해 주어야 합니다. 여기서 필자는 onTextChanged 함수만 이용할 예정이므로, 나머지 함수들에 대해서는 반환값을 Unit(반환값이 없다는 표시)으로 지정해주었습니다.

    주목해야 할 부분은 함수의 선언부분입니다.

    fun EditText.textChangedListener(textChanged : (CharSequence?) -> Unit){
    
    }

    여기서 각각의 의미를 한 번씩 살펴보겠습니다.

    textChanged : 매개변수로 넘어오는 함수 하나의 이름(textChangedListener라는 함수 내부에서 textChanged라는 이름으로 사용 가능합니다.

    () -> Unit : 매개변수가 없는 함수이며, 리턴타입 또한 없습니다.
    (CharSequence?) -> Unit : 매개변수가 CharSequence?타입 하나를 가지며, 리턴타입은 없습니다.
    (A,B) -> Int : 매개변수로 A타입 하나, B타입 하나를 받으며, 리턴타입으로 Int를 반환합니다.

    이정도 알고 나서, 실제 확장함수가 어떻게 사용되는지 살펴보겠습니다.

    et_id.textChangedListener{
        if(it.isNullOrBlank()){
            Toast.makeText(this,"아이디 빈칸",Toast.LENGTH_SHORT).show()
        }
    }

    실제 EditText객체에서 해당 확장함수를 부를 떄, {}안에 원하는 로직을 적어주면 됩니다.

    반응형