2023. 12. 18. 17:04ㆍ프로그래밍 언어/Kotlin
안드로이드 스튜디오 개발자 페이지를 기반으로 작성됨.
https://developer.android.com/courses/pathways/android-basics-compose-unit-1-pathway-1?hl=ko
Kotlin 프로그래밍 소개 | Android Basics Compose - First Android app | Android Developers
Kotlin에서 Android 앱 빌드를 준비하기 위해 Kotlin의 입문 프로그래밍 개념을 알아봅니다.
developer.android.com
이번 블로그에서는 코틀린에서 제공하는 람다 문법에 대해서 소개해보도록 한다.
람다 문법은 fun 키워드 없이 함수를 정의할 수 있는 간결한 문법으로 함수에 대한 참조 없이 함수를 변수처럼 다룰 수 있는 문법이다.
Android Studio에서 처음 프로젝트를 생성하면 나오는 코드에서도 람다 문법의 확장판인 후행 람다 문법이 쓰이기도 하고 적절히 간단한 표현을 위해서 알아두면 좋은 문법이라고 생각한다.
변수에 함수를 저장
변수 자체에 함수를 저장하는 방법에 대해서 알아보도록 한다.
코틀린에서는 최고 수준의 구성체인 함수도 데이터 유형으로 간주하기도 한다. 따라서 함수를 변수처럼 활용하여 매개변수에도 함수를 사용할 수 있다.
Android developer에서 사용한 예시와 동일하게 trick or treating 예제를 활용하여 람다 문법을 소개해보도록 한다.
기존 함수를 구성하는 방식대로 함수를 변수에 저장해보는 예시를 살펴보자.
fun main() {
val trickFunction = ::trick
}
fun trick() {
println("No treats")
}
함수를 변수처럼 참조하기 위해서는 위 코드에 보이는 것처럼 함수 참조 연산자인 :: 를 사용한다.
위의 예제를 람다 표현식을 사용하여 다시 정의해보자.
fun main() {
val trickFunction = trick
trickFunction()
// No treats!
}
val trick = {
println("No treats!")
}
위와 같이 일반 변수를 정의하는 것처럼 val 키워드와 변수 이름을 지정해준 후에 중괄호를 사용해 함수의 본문을 채워주는 형식이다.
main 함수에서 trickFunction 변수를 함수처럼 활용할 수 있는 것을 알 수 있다.
함수를 데이터 유형으로 사용
앞서 언급한 것처럼 함수를 데이터 유형으로도 활용할 수 있다.
이전에 trick을 람다 문법을 활용해 함수의 역할을 하는 변수로 만들었는데, 이 변수의 데이터 유형은 무엇일까? 정답은 매개변수를 받지 않는 반환 값이 없는 함수이다.
이제, 매개변수 및 반환 유형을 지정하는 함수 유형을 표현하기 위한 문법을 알아보자.
val treat: () -> Unit = {
println("Have a treat")
}
이런식으로 함수를 정의할 때 입력 및 반환 유형을 설정하는 것처럼 동일하게 해주면 된다.
함수를 반환 유형 혹은 입력 유형으로 활용하는 코드도 한번 살펴보자.
fun main() {
val coins: (Int) -> String = { quantity ->
"$quantity quarters"
}
val cupcake: (Int) -> String = {
"Have a cupcake"
}
val treatFunction = trickOrTreat(false, coins)
val trickFunction = trickOrTreat(true, cupcake)
treatFunction()
trickFunction()
}
fun trickOrTreat(isTrick: Boolean, extraTreat: (Int) -> String): () -> Unit {
if (isTrick) {
return trick
} else {
println(extraTreat(5))
return treat
}
}
val trick = {
println("No treats!")
}
val treat = {
println("Have a treat")
}
위 코드는 함수를 입력 유형, 반환 유형으로 사용하는 방법과 매개변수 및 반환 값이 있는 함수 형태의 람다 표현식을 모두 보여주는 코드로 람다 표현식이 간결성에 있어 유용하다는 것을 보여준다.
추가적으로 함수도 일반적인 데이터 유형처럼 nullable이 가능한데 위 .trickOrTreat 함수의 매개변수인 extraTreat가 nullable이라고 한다면 아래와 같이 수정해주면 된다.
fun trickOrTreat(isTrick: Boolean, extraTreat: ((Int) -> String)?): () -> Unit {...}
여기서 좀 더 표현을 간단하게 할 수 있는 몇 가지 방법에 대해서 소개하고자 한다. 후행 람다 문법도 포함되어 있다.
매개변수 이름 생략
먼저 람다 표현식으로 함수를 구성했을 때, 매개변수의 이름을 생략할 수 있다. 위 코드의 coin 변수를 예시로 들어보자.
// 기존 표현
val coins: (Int) -> String = { quantity ->
"$quantity quarters"
}
// 약식 표현
val coins: (Int) -> String = {
"$it quarters"
}
coins 변수를 아래 코드와 같이 코틀린 내부적으로 지원하는 it 매개변수를 활용하여 간결하게 표현할 수 있다.
람다 표현식을 함수에 직접 전달
coin변수는 함수의 역할을 하는 변수이지만 함수 리터럴일 뿐이다. 결국 trickOrTreat 함수에 매개변수로 전달하는 용도 한 군데에만 쓰이고 있다.
이 때, 아래와 같이 함수에 인자를 전달할 때 직접 함수를 기입할 수도 있다.
// 기존 표현
val coins: (Int) -> String = {
"$it quarters"
}
val treatFunction = trickOrTreat(false, coins)
// 약식 표현
val treatFunction = trickOrTreat(false, {"$it quarters"})
후행 람다 문법
람다 문법 중에 함수를 호출할 때 마지막 매개변수가 함수일 경우에 축약 표현을 활용하여 람다 표현식을 작성할 수 있다. Android studio에서 많은 함수들이 후행 람다 문법을 사용하고 있으니 숙지하는 것이 좋을 것 같다.
사용 방법 및 예시를 살펴보자.
// 기존 표현
val treatFunction = trickOrTreat(false, {"$it quarters"})
// 약식 표현
val treatFunction = trickOrTreat(false) { "$it quarters" }
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
Kotlin - 특수 클래스(data class, enum class, sealed class) (1) | 2024.01.30 |
---|---|
Kotlin - Generic (1) | 2024.01.30 |
Kotlin - 클래스 (1) | 2023.12.18 |
Kotlin - nullable variable (0) | 2023.12.15 |
Kotlin - 조건문 (0) | 2023.12.13 |