본문 바로가기

Language/Kotlin

[Kotlin] 3장. 함수와 함수형 프로그래밍 2 - 고차 함수와 람다식

728x90

람다식

일급 객체의 특징을 가진 이름 없는 함수.

일급 객체의 특징은 다음과 같다.

  • 함수의 인자로 전달 가능한 객체
  • 함수의 반환값에 사용할 수 있는 객체
  • 변수에 담을 수 있는 객체

고차함수

일급 객체 혹은 일급 함수를 서로 주고받을 수 있는 함수.

 

 

highFunc의 매개변수에 람다식이 들어가고,

highFunc 함수에서 sum을 통해 람다식을 매개변수로 받아들여서 사용하는 형태의 고차함수이다.

 

위의 예제를 순서대로 해설하면 다음과 같다.

  1. highFunc 함수에 3개의 매개변수가 들어간다.
  2. x,y 의 2가지 변수를 받아서 x + y 의 결과 값으로 반환해주는 람다식과, Int 타입의 변수 100, 10
  3. highFunc 함수에서 람다식을 sum 이라는 변수를 통해 받는다.
  4. sum은 Int 타입 변수 2개를 받아 Int 타입의 결과 값을 반환한다.
  5. sum에 저장된 람다식에서는 2가지 변수를 받아 2개를 더한 값을 반환해 주는 람다식 이기 때문에, 결과적으로 Int 타입 변수 2개를 받아 더한 Int 값을 반환하게 된다.
  6. a, b라는 변수 이름으로 Int 타입의 매개변수를 받는다.
  7. highFunc 함수는 Int 타입을 반환한다.
  8. return 의 한줄만 있기 때문에 함수 간략화를 사용한다.
  9. sum(a,b)는 4,5번의 설명을 통해 a + b 의 값을 더한 결과 값을 반환하게 된다.
  10. 110의 값을 출력한다.

*

매개변수가 1개일 경우 화살표 표기를 생략하고 $it로 대체할 수 있다.

 

 

변수에 람다식 할당

함수의 매개변수에 람다식을 할당하는 것 처럼 변수에도 람다식을 할당할 수 있다.

 

val multi: (Int, Int) -> Int = {x: Int, y: Int -> x * y }
val multi = {x: Int, y: Int -> x * y }
val multi: (Int, Int) -> Int = {x, y -> x * y }

val sample: () -> Unit = { println("sample") }
val sample = { println("sample") }

 

첫 번째와 같은 경우, 아무것도 생략하지 않은 전체 표현.

두 번째는 선언 자료형을 생략.

세 번째는 람다식 매개변수 자료형의 생략한 것.

네,다섯번 째는 매개 변수가 없는 자료형의 람다식을 표현한 것이다.

 

일반 함수 호출

람다식이 아닌 일반함수를 매개변수로 사용하기 위해서는 2개의 콜론(::) 기호를 함수 이름 앞에 사용해 소괄호와 인자를 생략하고 사용할 수 있다.

 

 

일반 함수를 매개변수로 넣을 때는 ::함수명 으로 사용하면 되지만, 매개변수를 받는 함수에서는 람다식에서 사용한 것과 똑같이 자료형을 써줘야 한다.

일반 매개 변수와 람다식을 같이 사용하는 경우

람다식과 일반 매개변수를 나눠줄 수 있다.

 

 

람다식 매개변수가 마지막 인자에 위치하는 경우, 이와 같이 람다식을 소괄호에서 빼내어 나누어서 사용이 가능하다.

람다식 매개변수가 맨 처음이거나, 중간에 있는 경우에는 사용이 불가능하며 반드시 맨 마지막 인자에 위치하는 경우에만 사용이 가능하다.

 

*

이는 매개 변수가 람다식 함수만 있을 때도 마찬가지로 사용이 가능하다.

method({람다식 함수1}, {람다식 함수2})
method({람다식 함수1}) {람다식 함수2}

method({람다식 함수1}, {람다식 함수2}) {람다식 함수3}

와 같이 맨 마지막 인자가 람다식 함수일 경우에 나눠서 사용할 수 있다.

 

 

728x90