본문 바로가기
Develop/Android

Android - Kotlin Lambda 활용하기

by 라이프레이서 2021. 6. 5.
반응형

람다 식 - Lambda Expression

> 다른 함수에 넘길 수 있는 작은 코드 조각

공통 코드 구조를 함수로 뽑아낼 수 있다.
람다식을 사용하면 코드가 더욱 간결해진다.

맛보기

자바 코드

button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View view){
        //수행동작
    }
})

자바의 경우 무명 내부 클래스를 선언하고 동작을 적어 줄 수 있다. 이는 코드를 번잡스럽게 만들며, 규모가 커지는 경우 가독성을 현저히 저하시킨다.

Kotlin

button.setOnClickListener{ /*수행동작*/ }

하지만 람다식을 활용하면 보다 간결한 표현으로 기능을 구현할 수 있다.

람다 식의 문법

위와 같이 람다 식은 항상 중괄호로 둘러 싸여 있다.
화살표 (->)가 파라미터와 본문을 구분해준다.

또한 람다식에 대한 특징은 다음과 같다

  • 컴파일러가 문맥으로부터 유추할 수 있는 인자 타입을 굳이 적을 필요는 없다.
  • 인자가 단 하나뿐인 경우 굳이 인자에 이름을 붙이지 않아도 된다.
  • 함수 호출 시 맨 뒤에 있는 인자가 람다 식이라면 그 람다를 괄호 밖으로 뺄 수 있다.
people.maxBy({p : Person -> p.age})

우선 위 식은 인자 타입을 컴파일러가 유추할 수 있으므로 타입 생략이 가능하다 따라서 아래와 같이 사용할 수 있다.

people.maxBy({p -> p.age})

또한 인자가 단 하나뿐인 경우에 해당하므로 굳이 인자에 이름을 붙이지 않아도 된다.

people.maxBy({it.age})

여기서 it은 람다의 파라미터 이름을 가르킨다. (it은 람다의 파라미터가 하나뿐이고, 컴파일러가 추론할 수 있는 경우 사용한다) 또한 함수 호출시 맨 뒤 인자가 람다식이기 때문에 그 람다를 괄호 밖으로 뺄 수 있다.

people.maxBy(){it.age}

함수 호출 시 인자가 여러 개가 아닌 람다식 하나만 있다면 ()를 생략 가능하다

people.maxBy{it.age}

멤버 참조

인자로 넘기려는 코드가 이미 함수로 선언된 경우 어떻게 해야 할까?

그 함수를 호출하는 람다를 만들어도 되나 이는 중복이다..!!

함수를 직접 넘겨보자

val getAge = Person::age

::을 사용하여 멤버를 참조한다.
::은 프로퍼티나 메소드를 단 하나만 호출하는 함수 값을 만들어준다.
::은 클래스 이름과 참조하는 멤버(프로퍼티나 메소드)이름 사이에 위치한다.

멤버 참조는 그 멤버를 호출하는 람다와 같은 타입이다. 다음 예처럼 그 둘을 자유롭게 바꿔 쓸 수 있다.

people.maxBy(Person::age)
people.maxBy{p->p.age}
people.maxBy{it.age}
반응형