반응형
코틀린의 표준함수를 이용하면 코드를 더 단수화하고 읽기 좋게 만들어 줍니다.
표준함수는람다식과 고차함수를 이용해 선언되어 있습니다.
람다식과 고차 함수 복습하기
람다식
val 변수 이름: 자료형 = { 매개 변수[,,] -> 람다식 본문 }
val sum :(Int, Int) -> Int = { x, y -> x + y}
println(sum(1,2)) // 3
val mul: (Int, Int) -> Int = {x, y -> x * y }
println(mul(2,2)) // 4
// 매개 변수 1개 일 경우, it으로 표기할 수 있음.
val add:(Int) -> Int = {it +1}
println(add(1)) // 2
추론된 반환 자료형이 Unit이 아닌 경우에는 본문의 마지막 표현식이 반환값으로 처리됩니다.
val isPositive: (Int) -> Boolean = {
val isPositive = it > 0
isPositive
}
println(isPositive(1)) // true
println(isPositive(-1)) // false
특정 라벨 지정 반환
val isPOsitiveLabel: (Int) -> Boolean = number@{
val result = it > 0
return@number result
}
println(isPOsitiveLabel(1)) // true
println(isPOsitiveLabel(-1)) // false
고차함수
고차함수는 매개변수로 함수를 받거나 반환할 수 있는 함수입니다.
fun inc(x : Int): Int{
return x + 1
}
fun high(name:String, body:(Int) -> Int) : Int {
println("name $name")
val x =0
return body(x)
}
println(high("sam",{x -> inc(x + 3)}))
//결과
// name sam
// 4
클로저
람다식을 사용하다 보면 내부 함수에서 외부 변수를 호출하고 싶을 때가 있습니다. 클로저란 람다식으로 표현된 내부 함수에서 외부 범위에 선언된 변수에 접근할 수 있는 개념을 말합니다.
클로저 조건
final 변수를 포획한 경우 변수 값을 람다식과 함께 저장한다.
final이 아닌 변수를 포획한 경우 변수를 특정 래퍼(wrapper)로 감싸서 나중에 변경하거나 읽을 수 있게 한다.
이때 래퍼에 대한 참조를 람다식과 함께 저장한다.
아래 코드에서 result는 자신의 유효 범위를 벗어나 삭제되어야 하지만 클로저의 개념에 의해 독립된 복사본을 가집니다.
람다식 반환값은 Unit으로 선언되어 반환되는 값이 없습니다. 하지만 result = x + y와 같이 result에 값을 저장함으로써 포획된 변수 result에 값을 저장할 수 있었습니다.
fun main(){
val calc = Calc()
var result = 0 // 외부 변수
calc.addNum(2,3) {x, y -> result = x + y } // 클로저
println(result) // 값을 유지하여 5 출력
}
class Calc{
fun addNum(a: Int, b: Int, add:(Int, Int) -> Unit){ // 람다식 add에는 반환값이 없음
add(a, b)
}
}
반응형
'Do it 코틀린 프로그래밍' 카테고리의 다른 글
코틀린 시퀀스 (1) | 2020.09.05 |
---|---|
코틀린 컬렉션(3) - Set과 Map 활용하기 (1) | 2020.08.25 |
코틀린 컬렉션(2) - List 활용하기 (0) | 2020.08.24 |
코틀린 컬렉션(1) - 기본 구조 (1) | 2020.08.23 |
코틀린 문자열 (0) | 2020.08.22 |
댓글