kotiln 기초 - (함수, 람다함수, 스코프함수)

홍석희·2024년 2월 19일
post-thumbnail

📌고차함수

고차함수란 함수를 인스턴스처럼 취급하여 다른 함수의 파라미터로 또는 결과값으로 반환받을 수 있는 형태

kotlin 에서는 모든 함수를 고차함수로 표현 가능

fun a(str: String) {
    println("$str 함수 a")
}

fun b(function: (String)->Unit) {
    function("b가 호출한 ")
}

fun main() {
	b(::a) // "b가 호출한 함수 a" 출력
}

function: (String)->Unit : 파라미터로 들어온 함수 function은 String을 매개변수로 가지고 아무것도 반환하지 않는다.(Unit)

📌람다함수

val c: (String)->Unit = {str -> println("$str 람다함수")}
b(c) // "b가 호출한 람다함수" 출력

타입 추론을 활용하여 위 코드는 아래와 같이 축약할 수 있다

val c = {str:String -> println("$str 람다함수")}

파라미터가 1개라면 it을 사용하여 나타낼 수 있다

val c: (String)->Unit = {println("$it 람다함수")}

람다함수를 구성하는 라인이 여러 줄이라면, 가장 마지막 코드가 반환된다

val cal: (Int, Int)->Int = { a, b ->
    	println(a)
    	println(b)
    	a + b  // 반환
    }
    
println(cal(1, 2)) // 1 2 3 출력

📌스코프함수

  • 스코프함수 내에서는 참조 연산자를 사용하지 않아도 된다.

apply

  • apply 함수는 인스턴스를 새로 생성하고 특정 변수에 할당하기 전에 초기화 작업을 해줄 수 있는 스코프를 만즐어 준다
class Book(var name: String, var price: Int) {
    fun discount() {
        price -= 2000
    }
}

var book1 = Book("book title", 10000).apply{
        name = "[세일중] " + name
        discount()
    }
    
// name: [세일중] book title, price: 8000
println("name: ${book1.name}, price: ${book1.price}")

apply 내의 코드들이 수행된 이후에 인스턴스가 새로 생성되어 반환한다

run

  • run 함수는 반환하는 것이 apply와 달리 인스턴스가 아닌 스코프 코드 실행 결과 값이다
  • 인스턴스가 만들어진 후에 함수나 속성을 scope 내에서 사용해야 할 때 유용하다
var book1 = Book("book title", 10000).apply{
        name = "[세일중] " + name
        discount()
    }
    var bookCost = book1.run {
    	println("name: ${book1.name}, price: ${book1.price}")
        price + 2000 // 반환
    }
    
    println("원가는 $bookCost 입니다.") // 원가는 10000 입니다.

with

  • run과 동일한 기능을 가지고 인스턴스를 참조연산자 대신 파라미터로 받는다
book1.run {...}
with(a) {...}

also / let

also는 apply, let은 run과 동일한 기능을 수행하지만 also와 let은 it을 통해 스코프내의 변수를 사용할 수 있다.

var price = 5000
    
var book2 = Book("book title2", 10000)
    
var book1 = Book("book title", 10000).apply{
    name = "[세일중] " + name
    discount()
}
    
book1.run {
    // name: [세일중] book title, price: 5000
    // main 함수의 price의 우선순위가 더 높기 때문
    println("name: ${name}, price: ${price}")
    price + 2000
}

위와 같이 price 변수의 값이 중복되면서 우선시 되는 상황에서 우선순위에 따라 의도한 결과와 다르게 동작 할 수 있다.

book1.let {
    println("name: ${it.name}, price: ${it.price}")
    price + 2000
}

따라서 also / let과 함께 it을 사용하면 변수명의 중복으로 인해 발생하는 문제를 해결할 수 있다.

profile
개발 기록

0개의 댓글