람다식
일급 객체의 특징을 가진 이름 없는 함수.
일급 객체의 특징은 다음과 같다.
- 함수의 인자로 전달 가능한 객체
- 함수의 반환값에 사용할 수 있는 객체
- 변수에 담을 수 있는 객체
고차함수
일급 객체 혹은 일급 함수를 서로 주고받을 수 있는 함수.
highFunc의 매개변수에 람다식이 들어가고,
highFunc 함수에서 sum을 통해 람다식을 매개변수로 받아들여서 사용하는 형태의 고차함수이다.
위의 예제를 순서대로 해설하면 다음과 같다.
- highFunc 함수에 3개의 매개변수가 들어간다.
- x,y 의 2가지 변수를 받아서 x + y 의 결과 값으로 반환해주는 람다식과, Int 타입의 변수 100, 10
- highFunc 함수에서 람다식을 sum 이라는 변수를 통해 받는다.
- sum은 Int 타입 변수 2개를 받아 Int 타입의 결과 값을 반환한다.
- sum에 저장된 람다식에서는 2가지 변수를 받아 2개를 더한 값을 반환해 주는 람다식 이기 때문에, 결과적으로 Int 타입 변수 2개를 받아 더한 Int 값을 반환하게 된다.
- a, b라는 변수 이름으로 Int 타입의 매개변수를 받는다.
- highFunc 함수는 Int 타입을 반환한다.
- return 의 한줄만 있기 때문에 함수 간략화를 사용한다.
- sum(a,b)는 4,5번의 설명을 통해 a + b 의 값을 더한 결과 값을 반환하게 된다.
- 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}
와 같이 맨 마지막 인자가 람다식 함수일 경우에 나눠서 사용할 수 있다.
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 4장. 프로그램의 흐름 제어 (0) | 2020.06.26 |
---|---|
[Kotlin] 3장. 함수와 함수형 프로그래밍 3 - 다양한 함수 (0) | 2020.06.25 |
[Kotlin] 3장. 함수와 함수형 프로그래밍 1 - 함수형 프로그래밍 (0) | 2020.06.25 |
[Kotlin] 2장. 변수와 자료형, 연산자 2 - 변수와 자료형 (0) | 2020.06.24 |
[Kotlin] 2장. 변수와 자료형, 연산자 1 - 코틀린 패키지 (0) | 2020.06.23 |