본문 바로가기
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}
    반응형