728x90
람다식과 고차함수 요약

강의 링크 : https://www.edwith.org/boostcourse-mo-kotlin-basic1/joinLectures/28611

람다식과 고차함수 요약

  • 람다식 : {인자 -> 본문}
val sum : (Int, Int) -> Int = {x, y -> x+y} val mul = {x:Int, y:Int -> x * y} val add : (Int) -> Int = {it + 1} //it은 전달받은 인자를 의미 (함수 인자가 하나인 경우)
  • 고차 함수 : 리턴값이나 인자가 함수인 함수
fun high(name : String, body : (Int)->Int) : Int { prinln("name : $name") val x=0 return body(x) } //함수 호출 val res1 = high("TxT", {x->inc(x+3)}) //인자로 전달되는함수 인자가 하나인 경우 : it으로 대체 가능 val res2 = high("TxT") {inc(it+3)} //매개변수가 없을 때 함수 이름만 사용 val res3 = high("TxT", ::inc) //inc는 람다식으로 변환됨 // 매개변수가 하나인 경우 + 람다식 전달 val res4 = high("TxT") {it+3}

클로저

  • 람다식 함수에서 외부 변수에 접근할 수 있는 방법
  • 외부 변수를 capture하여 사용
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) } }

코틀린 표준 라이브러리

  • 코틀린 표준 함수는 확장 함수 형태의 람다식으로 제공
  • let() : 객체를 인자로 넘기고 결과값 반환
//main문 내 val score : Int?=32 // 기존 null검사 fun chkScore() { if (score != null) println("Score : $Score") } //let을 이용한 null검사 - null이면 {...}이 실행되지 않음 fun letChkScore() { score?.let{println("Score:$it)} }
  • also() : let은 결과값 반환, also는 함수에 전달한 객체를 반환
    • 함수 블록 {...}의 마지막 문장을 let은 결과로 반환
    • also를 사용 시 마지막 문장을 반환하지 않음 (=대입이 안됨)
var m=1 m = m.also{it+3} //m은 1 - 연산한 결과가 m에 대입되지 않음
  • apply(): also와 같이 객체를 전달하고 반환받음
    • also와 달리 확장 함수로 처리되므로 클래스 인자 접근 시 it을 사용하지 않아도 됨
val person = Person("", 0) //apply val result = person.apply { name = "James" age = 56 } //also val result = person.also { it.name = "James" it.age = 56 }
  • run() : 익명 함수 / 객체 호출 두가지로 활용
    • block 내용 수행 후 결과값을 반환
    • 조건부 메소드 사용 가능
    • apply와 다르게 객체에 접근하면서 함수 블록{...}의 마지막 결과가 실행됨
run { if (firstTimeView) introView else normalView }.show()
  • with() : 전달받은 객체를 처리
    • safe call(?.)이 없으므로 let과 함께 쓰임
supportActionBar?.let { with(it) { setDisplayHomeAsUpEnabled(true) setHomeAsUpIndicator(R.drawable.ic_clear_white) } }
  • use() : 객체 사용 후 호출한 객체를 닫아줌(close())
    • 파일을 사용할 때 유용
private fun readFirstLine() : String { BufferedReader(FileReader("text.txt")).use{ return it.readline() } }
728x90

+ Recent posts