람다함수의 특별한 케이스
1. 람다함수도 여러 구문으로 사용 가능
val c: (String) -> Unit = { str ->
println("$str 람다함수")
println("여러 구문을")
println("사용가능합니다")
}
람다함수가 여러 줄이 되는 경우 마지막 구문의 결과값이 반환됨
val calculate: (Int, Int) -> Int = { a, b ->
println(a)
println(b)
a + b // * a + b의 값을 Int로 반환함
}
2. 람다함수에 파라미터가 없다면? 중괄호 안에 실행할 구문만 나열
val a: () -> Unit = { println("패러미터가 없어요") }
3. 파라미터가 하나뿐이면 it 사용
val c: (String) -> Unit = { println("$it 람다함수") }
스코프 함수
: 함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 기본 제공하는 함수. 클래스에서 생성한 인스턴스를 스코프 함수에 전달하면 인스턴스의 속성이나 함수를 좀 더 깔끔하게 불러 쓸 수 있다.
1. apply : 인스턴스를 생성한 후 변수에 담기 전에 초기화 과정을 수행할 때 많이 쓰임
fun main(){
var a = Book("디모의 코틀린", 10000).apply{
name = "[초특가]" + name
discount()
}
}
class Book(var name: String, var price: Int){
fun discount(){
price -= 2000
}
}
2. run : apply처럼 run 스코프 안에서 참조연산자를 사용하지 않아도 된다는 점은 같지만 일반 람다함수처럼 인스턴스 대신 마지막 구문에 결과값을 반환한다는 차이점이 있다.
var b = a.run {
println(a.price)
a.name
}
// 이렇게 쓰면 가격은 출력하지만 마지막 구문인 이름은 반환하여 b라는 변수에 할당됨
따라서 이미 인스턴스가 만들어진 후에 인스턴스의 함수나 속성을 scope 내에서 사용해야 할 때 유용하다.
fun main(){
var a = Book("디모의 코틀린", 10000).apply{
name = "[초특가]" + name
discount()
}
a.run{
println("상품명:${name}, 가격:${price}원") // 상품명:[초특가]디모의 코틀린, 가격:8000원
}
}
class Book(var name: String, var price: Int){
fun discount(){
price -= 2000
}
}
3. with : run과 동일한 기능을 가지지만 인스턴스를 참조연산자 대신 파라미터로 받는다.
with(a) { … }
a.run { … }
4. also : apply와 같은 기능 (처리가 끝나면 인스턴스를 반환)
5. let : run과 같은 기능 (처리가 끝나면 최종값을 반환)
공통적인 차이점 - apply와 run이 참조연산자 없이 인스턴스의 변수와 함수를 사용할 수 있었다면 also와 let은 파라미터로 인스턴스를 넘긴 것처럼 it을 통해 인스턴스를 사용할 수 있다.
왜 굳이 파라미터를 통해서 인스턴스를 사용?
→ 같은 이름의 변수나 함수가 scope 바깥에 중복되어 있는 경우에 혼란을 방지하기 위해서
fun main(){
var price = 5000
var a = Book("디모의 코틀린", 10000).apply{
name = "[초특가]" + name
discount()
}
a.run{
println("상품명:${name}, 가격:${price}원") // 상품명:[초특가]디모의 코틀린, 가격:5000원
}
a.let{
println("상품명:${it.name}, 가격:${it.price}원") // 상품명:[초특가]디모의 코틀린, 가격:8000원
}
}
class Book(var name: String, var price: Int){
fun discount(){
price -= 2000
}
}
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 익명객체와 옵저버 패턴 (0) | 2023.09.09 |
---|---|
[Kotlin] 오브젝트 (0) | 2023.09.09 |
[Kotlin] 고차함수와 람다함수 (0) | 2023.09.07 |
[Kotlin] 스코프와 접근제한자 (0) | 2023.09.06 |
[Kotlin] 기본 프로젝트 구조 (0) | 2023.09.05 |