[Kotlin] 람다 함수 보충 설명, 스코프 함수 설명 & 예제

728x90

람다함수의 특별한 경우

  1. 람다함수도 여러 구문의 사용이 가능
val c: (String) -> Unit = { str -> println("$str 람다함수") }

val c: (String) -> Unit = { str -> 
    println("$str 람다함수")
    println("여러 구문을")
    println("사용 가능 합니다")}

val calculate:(Int, Int) -> Int = {a,b ->
    println(a)
    println(b)
    //구문의 마지막 a+b을 Int 값으로 반환
    a+b
  1. 파라미터가 없는 람다 함수

-> 실행할 구문들만 나열하면 됨

val a:() -> Unit = { println("패러미터가 없어요") }
  1. 패러미터가 하나 뿐이라면 it 사용
val c: (String) -> Unit = { println("$it 람다함") }

스코프 함수

함수형 언어의 특징을 좀더 편리하게 사용할 수 있도록 기본 제공 하는 함수

클래스의 인스턴스를 Scope 함수에 전달하면 인스턴스의 속성이나 함수를 좀더 깔끔하게 불러 쓸수 있다.

  1. apply
    인스턴스를 생성한후 변수에 담기전에 초기화 과정을 수행할때 주로 사용
fun main() {
    //a.name = "(할인)" + a.name
    //a.discount()
    //생성되자마자 조작된 인스턴스를 얻을 수 있음 : 코드가 깔끔해짐
    var a = Book("코틀린 기초 공부", 10000).apply {
        name = "(할인)" + name
        discount()
    }
}

class Book(var name: String, var price: Int) {
    fun discount() {
        price -= 2000
    }
}
  1. run
    run 스코프 안에서 참조연산자를 사용하지 않아도 된다는 점은 apply와 같지만 일반 람다함수처럼 마지막 구문에 결과값 반환

-> 이미 인스턴스가 만들어진 후에 인스턴스의 함수나 속성을 scope 내에서 사용해야 할 때 유용

fun main() {

    var a = Book("코틀린 기초 공부", 10000).apply {
        name = "(할인)" + name
        discount()
    }
    //apply에서 수정한 책 이름과 할인된 가격을 확인 가능
    a.run {
        println("상품명: ${name}, 가격: ${price}원")
    }
}

class Book(var name: String, var price: Int) {
    fun discount() {
        price -= 2000
    }
}
  1. with
    run과 동일한 기능을 가지지만 단지 인스턴스를 참조 연산자 대신 파라미터로 받는 다는 차이만 있다.
    a.run{...}
    with(a){...}
  2. also / let
    각각 apply와 run 과 같은 기능을 가지고 있다.
  • 처리가 끝나면 인스턴스를 반환
    • apply / also
  • 처리가 끝나면 최종값을 반환
    • run / let

차이점 : apply , run 이 참조 연산자 없이 인스턴스의 변수와 함수를 사용 할 수 있었다면 also와 let은 마치 패러미터로 인스턴스를 넘긴 것 처럼 it을 통해서 인스턴스를 사용할 수 있다는 것 입니다.

이유 : 이는 같은 이름의 변수나 함수가 'scope' 바깥에 중복되어 있는 경우에 혼란을 방지하기 위해

fun main() {

    //run 함수가 인스턴스내의 price 보다 main price를 우선시 한다.
    // -> run 대체 let 사용
    var price = 5000

    var a = Book("코틀린 기초 공부", 10000).apply {
        name = "(할인)" + name
        discount()
    }
    //apply에서 수정한 책 이름과 할인된 가격을 확인 가능
    a.run {
        println("상품명: ${name}, 가격: ${price}원")
    }
    a.let {
        println("상품명: ${it.name}, 가격: ${it.price}원")
    }
}

class Book(var name: String, var price: Int) {
    fun discount() {
        price -= 2000
    }
}

scope 함수는 인스턴스의 속성이나 함수를 scope 내에서 깔끔하게 분리하여 사용 할 수 있어 코드의 가독성을 향상시킨다

728x90

댓글

Designed by JB FACTORY