Lambda Expression은 람다식, 람다 표현식이라고 합니다. 람다식는 단순하게보면 익명함수라고 볼 수 있습니다.
람다식은 java 8 부터 사용이 가능합니다.
안드로이드 스튜디오에서는 functional interface를 사용하려면 N OS 이상이어야 합니다.
하지만 코틀린은 위의 제약조건없이 사용할 수 있다는 장점이 있습니다!
🤔 먼저 람다식을 공부하기전에 함수형 프로그래밍에 대해서 알아보고 가겠습니다
하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식이며, 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임을 의미합니다.
말이 너무 어렵나요..? 쉽게 설명하자면 함수형 프로그래밍은 함수를 사용해 선언형 프로그래밍을 하는 것입니다😶
동일한 입력 인자에 대해 항상 같은 결과값을 반환하는 함수
순수 함수의 조건
1. 같은 인자에 대하여 항상 같은 값이어야함.
2. 함수 외부의 어떤 상태도 바뀌지 않는다.
순수 함수 예제 코드
fun sum(a:Int, b:Int):Int{
return a+b
}
fun main(){
sum(1,2)
}
sum() 함수에 동일한 값을 넣는다면 같은 출력이 나옵니다.
위 함수는 순수 함수의 조건을 모두 만족합니다.
순수 함수가 아닌 예제
fun checkGrade() {
val user: User = User()
val grade = user.grade()
if (grade != null) process(grade)
}
val globalValue = 10
fun localFunc(){
val sum = { x:Int, y:Int -> x + y + globalValue }
}
🙁 순수 함수가 아닌 이유
1. 함수에 없는 외부 객체 User을 사용
2. grade는 User.grade() 값에 따라 달라짐
3. 입력과 무관한 전역변수 사용
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체
일급객체
의 조건
일급 객체 예제
val oneParam = { n: Int -> n + 2 }
val returnObjectVal = oneParam(1)
val returnObjectFunc = { oneParam(1) }
고차 함수는 함수를 매개변수로 사용하거나 함수를 반환하는 함수. 이와 같은 조건에 부합하기 위해 1급 객체여야 함
즉, 고차함수는 함수를 인자값 반환값으로 다룰 수 있는 함수입니다.
고차 함수 예제
fun highFunc(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b)
fun main(){
highFunc({ x:Int, y:Int -> x+y }, 10, 20). => 결과 값 : 30
}
프로그램을 모듈화시키기 때문에 테스트와 디버깅이 쉬워집니다.
순수 함수를 조합해 상태 데이터 변경이나 부작용이 없는 루틴을 만들어내며, 익명 함수형태인 람다식을 이용해 고차함수를 구성해 생산성을 높일 수 있습니다.
람다식과 고차함수로 다향한 함수 조합이 가능합니다.
코틀린의 람다 표현식을 사용하는 방법은 아래와 같습니다😁
val lambda = {x:Int, y:Int -> x+y}
위 함수는 현재는 반환 타입을 생략하고 파라미터로 Int타입 x,y를 받고 x+y를 반환하는 함수입니다.
val lambda:(Int,Int)->(Int) = {x:Int,y:Int->(x+y)}
위 표현이 반환 타입까지 나타낸 완전한 상태입니다.
val lambda: {x,y -> x + y}
이 표현은 타입 추론 불가로 에러가 발생합니다!
val nestedLambda: ()->()->Unit = { { println("nested") } }
람다식 안에 람다식이 있는 경우
val greet : () -> Unit
val square: (Int)->Int = { x-> x + x }
반환값이 없거나 매개변수가 하나만 있는 경우
fun notParameter(out:()->String) = println(out())
매개변수가 없는 람다함수가 notParameter 함수의 매개변수 out으로 지정
매개변수가 하나 있는 람다식 함수가 oneParameter함수의 매개변수 out으로 지정
fun oneParameter(out:(String)->String) = println(out("im parameter"))
이 람다식 함수를 자바 코드로 변환하면 아래와 같습니다.
public static final void oneParameter(@NotNull Function1 out) {
Intrinsics.checkNotNullParameter(out, "out");
Object var1 = out.invoke("im parameter");
boolean var2 = false;
System.out.println(var1);
}
oneParameter함수의 매개변수로 out함수를 넣고, 함수 내부에서 out함수를 정의합니다.
항상 타입을 써줄 때는 () 괄호를 까먹지 않고 써줘야합니다! 파라미터의 타입을 ()로 감싸주는 것이 정확한 문법입니다.