1) 람다식

객체지향 토대로 공부를 했다면, ”람다” 가 생소하게 다가올 수 있다.

코틀린은 객체지향 언어의 특징도 가지고 있고 함수형 언어의 특징도 가지고 있음

람다식은 함수형 프로그래밍에서 사용되는 대표적인 익명함수 익명함수 : 함수의 이름이 없음

람다식으로 선언을 하면, 하나의 변수처럼 사용 가능 함수의 argument 가 될 수 있고 함수의 return 값이 될 수 있음

package com.example.kotlin

fun main() {
    // 1. 익명함수
    // 2. 변수처럼 사용돼서, 함수의 argument, return 값
    // 3. 한 번 사용되고, 재사용되지 않는 함수
    
    val a = fun() { print("hello") 

    // ( argument type, ), -> return type = { 구현부 }
    // 코드 구현부의 가장 마지막 부분이 리턴값
    val b : (Int) -> Int = {
        // print(it)
        it * 10 // 리턴값
    }

    println(b) // Function1<java.lang.Integer, java.lang.Integer>
    println(b(3)) // 30

    // 어떤 입력값을 받을 지, 함수 구현부 내에 구현 가능
    val c = { i : Int , k : Int -> i * k }

    // 함수의 argument 는 여러 개일 수 있음
    // val d : (Int, String, Boolean) -> String = { a, b, c -> b }
    // a 와 c 를 사용하지 않을 것이면, 언더스코어(_)로 생략 가능
    val d : (Int, String, Boolean) -> String = { _, b, _ -> b }

    val result = hello(10, b) // 10 200
    println(result)
}

// b 는 Int 를 argument로 받고, Int 를 반환하는 익명함수
fun hello(a:Int, b:(Int)->Int) : (Int) -> Int {
    println(a)
    println(b(20))
    return b
}

부분으로 다시 보기

 

 

1-1) 람다식 (1)

   	// 1. 익명함수
    // 2. 변수처럼 사용돼서, 함수의 argument, return 값
    // 3. 한 번 사용되고, 재사용되지 않는 함수
    
    val a = fun() { print("hello") 
    val 변수명 = fun() { 함수 구현부 }

 

 

1-2) 람다식 (2)

    // 코드 구현부의 가장 마지막 부분이 리턴값
    val b : (Int) -> Int = { it * 10 }

    println(b)     // Function1<java.lang.Integer, java.lang.Integer>
    println(b(3))  // 30
val 변수명 : ( 아규먼트 타입, ) -> 리턴 타입 = { 구현부 }
    // 함수의 argument 는 여러 개일 수 있음
    // val d : (Int, String, Boolean) -> String = { a, b, c -> b }
    // a 와 c 를 사용하지 않을 것이면, 언더스코어(_)로 생략 가능
    val d : (Int, String, Boolean) -> String = { _, b, _ -> b }
   

 

 

1-3) 람다식 (3)

    // 어떤 입력값을 받을 지, 함수 구현부 내에 구현 가능
    val c = { i : Int , k : Int -> i * k }
    val 변수명 = { 아규먼트 : 아규먼트 타입  -> 함수 구현부 }

 

 

1-4) 람다식 (4)

val result = hello(10, b) // 10 200
println(result)

// b 는 Int 를 argument로 받고, Int 를 반환하는 익명함수
fun hello(a:Int, b:(Int)->Int) : (Int) -> Int {
    println(a)
    println(b(20))
    return b
}

b는 값을 10배하는 함수 함수를 인자로 받고, 함수를 반환할 수도 있다.

 

 

2) SAM ( Single Abastract Method, 단위 추상 메서드)

MainActivity.kt

가장 많이 사용할 함수 호출 중 하나는 View 에서 세돈클린리스너를 다는 것

자바 함수형 인터페이스 관계에서 나온 것 코틀린에서 함수형 인터페이스를 인자로 받는 것

자바 함수를 호출 할 때, 인터페이스 객체를 람다로 넘길 수 있음 함수형 인터페이스 : 추상 메소드가 오직 하나 뿐인 인터페이스

자바였다면?

val view = View(this)

    view.setOnClickListener(){
        new View.onClickListener(){
            @Override
            public void onClick(View: view) {
                //
            }
        }
    }

코틀린이면?

val view = View(this)

view.setOnClickListener( { println("안녕") })

또는

view.setOnClickListener { println("안녕") }

단 한 줄로 표현 가능.

함수형 인터페이스를 인자로 받는 자바함수를 람다식으로 대체할 수 있다.

+ Recent posts