달나라 노트

Kotlin - lambda function (한줄로 함수쓰고 initialize 하기) 본문

Kotlin

Kotlin - lambda function (한줄로 함수쓰고 initialize 하기)

CosmosProject 2021. 3. 16. 01:18
728x90
반응형

 

 

 

Original source = play.kotlinlang.org/byExample/01_introduction/01_Hello%20world

 

 

 

 

Kotlin에는 lambda function이라는 것을 제공합니다.

무엇인지부터 말씀드리면 일반적으로 함수를 생성하고 사용하는 단계인

1. 변수를 생성

2. 어떤 parameter 값을 받아 특정 로직을 적용하는 함수 구현

3. 함수의 reutrn 값을 변수에 assign

 

위 세 단계를 단 한줄로 적을 수 있는 기능입니다.

 

fun main() {
    var plus2: (Int) -> Int = {x: Int -> x * 2} // 1
    println(plus2(2))

    var multiply3: (Int) -> Int = {y: Int -> y * 3} // 2
    println(multiply3(3))

    var plus2_ = {x: Int -> x * 2} // 3
    println(plus2_(2))

    var multiply3_: (Int) -> Int = {y -> y * 3} // 4
    println(multiply3_(3))

    var multiply3__: (Int) -> Int = {it * 3} // 4-1
    println(multiply3__(3))

//    var plus2__ = {x -> x * 2} // 5 // Error
//    var multiply3__ = {y -> y * 3} // 5 // Error

    var add_prefix: (String, String) -> String = {prefix: String, value: String -> prefix + "_" + value} // 6
    println(add_prefix("Red", "Apple"))


    var test1: (String) -> String = {it.toUpperCase()} // 7
    println(test1("apple"))

    var test2: (String) -> String = String::toUpperCase // 8
    println(test2("apple"))
}



-- Result
4
9
4
9
9
Red_Apple
APPLE
APPLE

1. 이 구문의 의미를 하나하나 살펴봅시다.

var plus2 = plus2라는 이름의 변수 생성

:(Int) -> Int = lambda 함수에 사용되는 paramter는 Int이고 output이 Int라는 뜻(= input type이 int이며, output type이 int라는 뜻)

= {x: Int -> x * 2} = Int type인 parameter x를 input으로 받아 x * 2의 결과를 return하여 변수 plus2에 저장하라는 뜻.

따라서 plus2(2)는 2 * 2 = 4가 assign 됩니다.

 

2. 이것도 마찬가지이며 중괄호{} 안에 적힌 함수의 내용이 달라졌습니다.

(parameter 이름은 맘대로 해도 상관없고 화살표 전/후로 통일만 시켜주면 됩니다.)

 

3. 1번과 완전히 동일한 구문입니다.

다만 변수명 옆에 input, output의 자료형을 적지 않았습니다.

 

4. 2번과 동일한 구문입니다.

다만 중괄호{} 내의 parameter 부분에 parameter의 data type을 적지 않았습니다.

 

4-1. 다른 함수들(map, filter 등)과 마찬가지로 parameter 대신 parameter를 나타내는 it 키워드를 사용할 수 있습니다.

 

5. 3번과 4번처럼 input, output의 data type 또는 중괄호 내의 parameter data type 둘 중 하나를 적지 않는 것은 가능합니다.

다만 5번의 2개 예시처럼 2 개의 data type 명시 부분을 모두 적지 않으면 Error가 발생합니다.

 

6. lambda 함수를 이용하면 parameter도 2개 이상(또는 더 여러 개도 가능합니다.) 받을 수 있습니다.

6번 예시에선 prefix, value라는 2개의 String parameter를 받습니다. 즉, input이 2개이죠.

따라서 변수명(add_prefix) 오른쪽에 (String, String)으로 input data type 2개에 대한 data type을 모두 적어줘야 합니다.

 

7. it 키워드를 이용해서 좀 더 간단하게 lambda 함수를 사용할 수 있습니다.

 

8, 이 경우는 아예 Parameter를 적지 않고, parameter 대신 input data type에 함수를 적용시킨 형태입니다.

이 경우는 lambda 식의 함수 부분이 어떤 다른 1개의 함수만을 불러오는 구조라면 function pointer(::)를 사용하여 표시하는 방식으로 대체할 수 있습니다.

 

 

728x90
반응형
Comments