Kotlin Lambda Expression, 코틀린 람다 표현식

98oys·2022년 5월 12일
2

language

목록 보기
1/9
post-thumbnail

Lambda Expression은 람다식, 람다 표현식이라고 합니다. 람다식는 단순하게보면 익명함수라고 볼 수 있습니다.

람다식은 java 8 부터 사용이 가능합니다.
안드로이드 스튜디오에서는 functional interface를 사용하려면 N OS 이상이어야 합니다.
하지만 코틀린은 위의 제약조건없이 사용할 수 있다는 장점이 있습니다!

🤔 먼저 람다식을 공부하기전에 함수형 프로그래밍에 대해서 알아보고 가겠습니다

🍐 함수형 프로그래밍이란

하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식이며, 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임을 의미합니다.

말이 너무 어렵나요..? 쉽게 설명하자면 함수형 프로그래밍은 함수를 사용해 선언형 프로그래밍을 하는 것입니다😶

🍎 함수형 프로그래밍의 특징

  • 순수함수
  • 불변성
  • 1급 객체
  • 고차함수

🍋 순수 함수란, pure function

동일한 입력 인자에 대해 항상 같은 결과값을 반환하는 함수

순수 함수의 조건
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. 입력과 무관한 전역변수 사용

😉 순수 함수를 사용하는 이유

  • 입력과 내용을 분리하고 모듈화 하므로 재사용성이 높아집니다.
  • 여러가지 함수들과 조합해도 부작용이 없습니다.
  • 병행 작업 시 안전합니다.
  • 함수값을 추적하고 예측 할 수 있기 때문에 테스트와 디버깅에 유리합니다.

🍉 불변성

  • 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야합니다.
  • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어 그 일부를 변경하고, 변경한 복사본을 사용합니다.

🍌 일급 객체, First Class Object

다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체

일급객체의 조건

  • 함수의 인자로 전달 가능
  • 함수의 반환값으로 사용가능
  • 변수에 담을 수 있음

일급 객체 예제

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함수를 정의합니다.

항상 타입을 써줄 때는 () 괄호를 까먹지 않고 써줘야합니다! 파라미터의 타입을 ()로 감싸주는 것이 정확한 문법입니다.

profile
Android Developer, Department of Information and Communication Engineering, Inha University

0개의 댓글