-
[Android Studio] Kotlin의 람다 표현식, Member Reference을 이용해 코드의 가독성을 높혀보자개발 끄적끄적/Android 2020. 9. 28. 23:21반응형
Kotlin과 유사한 Java에서도 쓰이는 람다 표현식에 대해 알아보겠습니다.
람다 표현식이란?
람다식 또는 람다 함수는 프로그래밍 언어에서 쓰이는 개념으로 익명 함수를 지칭하는 용어입니다. 코드의 간결성을 목적으로 사용되며 많은 프로그래밍 언어에서 지원합니다.
Kotlin에서 함수를 정의할 땐 fun이라는 예약어를 사용합니다.
fun sum(x: Int, y:Int) : Int { //함수 내용 return x+y }
위와 같이 fun 함수이름(매개변수) { 함수내용 } 의 형식입니다.
함수이름을 정의하고 () 안에 매개변수를 정의하는 것이 일반적입니다. 그런데 람다 함수는 fun과 함수 이름을 명시하지 않고 축약형으로 선언할 수 있습니다.
{ 매개변수 -> 함수내용 } 의 형식으로 위 sum함수를 간단히 정의할 수 있습니다.
//람다 표현식 1 val sum = { x:Int, y:Int -> x + y }
위 fun 예약어를 사용해 선언한 함수와 아래 람다 표현식으로 정의한 함수 모두 아래와 같이 사용할 수 있습니다.
val result = sum(10, 20) //result = 30
앞서 말한 것처럼 람다 함수는 fun 예약어를 사용하지 않으며, 함수명도 명시하지 않습니다.
-> 기호 왼쪽이 매개 변수, 오른쪽이 함수의 내용을 포함합니다.
따로 return 문을 명시하지 않았지만, 람다 함수에서 함수 내용 부분의 마지막 줄이 반환 값이므로 x+y 값을 반환합니다.
람다 표현식 1에선 람다 함수를 정의했지만 이름이 없어서 호출할 수 없기 때문에 sum이라는 변수에 대입한 것입니다. 이처럼 함수형 프로그래밍에서는 함수를 변수에 대입하거나 다른 함수의 반환값으로 사용할 수 있습니다.
람다 API
기본적으로 람다식을 이용한 편리한 람다 api들이 있습니다.
data class Student(val name: String, val score1:Int, val score2:Int) val studentList = listOf( Student("Student A", 80, 50), Student("Student B", 70, 100), Student("Student C", 50, 80) ) println( studentList.maxBy{it.score2} ) // Student(name = Student B, score1 = 70, score2 = 100
Kotlin은 collection의 확장 함수를 제공합니다.
위에서 예시로 든 maxBy와 같은 라이브러리를 잘 활용한다면 직관적이며 단축된 코딩을 할 수 있을 것입니다.
코드의 간결성을 위해 아래와 같은 규칙도 존재합니다.
- 함수의 맨 마지막 인자가 람다라면 () 안에서 빼내 밖에 람다를 표현할 수 있습니다.
- 인자가 하나이면서 그 인자가 람다 타입이라면 ()를 생략할 수 있습니다.
- 인자가 하나라면 그 인자는 람다식 내부에서 it으로 받을 수 있습니다.
studentList.maxBy ({s: Student -> s.score2}) studentList.maxBy () {s: Student -> s.score2} studentList.maxBy {s: Student -> s.score2} studentList.maxBy {it.score2}
위와 같이 다양한 방법으로 표현할 수 있습니다.
단, 마지막 방법인 it을 사용해 람다식을 구성한 경우, 람다 안에 람다가 중첩되는 경우에 각각의 it이 어떤 파라미터를 가리키는 것인지 헷갈릴 수 있기 때문에 사용에 주의를 요합니다.
Kotlin에선 람다 api로 maxBy 외에도 많은 라이브러리를 제공합니다. 따라서, 원하는 로직을 구현하기 전에 지원하는 api가 있는지 찾아본다면 코드의 간결성과 가독성을 높힐 수 있을 것입니다.
Member Reference(멤버 참조)
Member Reference는 프로퍼티나 메소드를 단 하나만 호출하는 함수를 만들어줍니다.
Student::score1 val getScore = {student: Student -> student.score1 }
만일 Class를 넘겨야 하는 경우 ::class.java를 이용해 클래스 참조를 얻어낼 수 있습니다.
보통 안드로이드에서 인텐트를 생성(다른 화면으로 넘어갈 때 등)할 때 사용합니다.
// NextScreen에 해당하는 Intent 생성 val nextIntent = Intent(this, NextScreen::class.java)
바운드 멤버 참조를 사용하면 Member Reference를 생성할 때 해당 클래스의 인스턴스를 함께 저장해서 객체를 넘길 필요가 없어집니다.
val s = Student("Tony", 70, 90) val getStudentScore = Student::score1 val getTonyScore = s::score1 println( getStudentScore(s) ) // -> 70 println( getTonyScore() ) // -> 70
반응형'개발 끄적끄적 > Android' 카테고리의 다른 글
[Android Studio] 코틀린의 정적 변수 개념 알아보기 - const, companion object (0) 2020.10.07 [Android Studio] 액티비티의 활동 수명 주기(Activity LifeCycle) 알아보기 - onCreate(), onStart() 등 (0) 2020.10.06 [Android Studio] Kotlin 변수와 데이터 타입 알아보기 (0) 2020.09.25 [Android Studio] 안드로이드 개발 환경 구축하기 - Android Studio 사용방법 및 구조 이해하기 (0) 2020.09.22 [Android Studio] 안드로이드 개발 환경 구축하기 - Android Studio 설치 (0) 2020.09.18