본문 바로가기
Kotlin

[Kotlin 강의] Lambda 함수 Return Type 표현 방법

by 뷰티풀스택 2025. 1. 22.
반응형

Lambda 에 Type 추가하는 방법

기본적으로 함수는 입력과 출력값을 통해 Type Inference를 수행하지만 명시적으로 Type을 정해야할 때에는 아래의 표현식으로 나타낸다.

Kotlin Lambda Return Type

 

1. 기본 표현식

입력 타입 -> 출력타입 형식으로 작성한다. 이러한 규칙이 생긴 이유는 Lambda 함수도 하나의 변수로 인식시키기 때문에 변수에 입력과 출력에 대한 타입 모두를 표현해야되서 나온 규칙이라고 생각하면 이해가 쉽다.

  • 함수이름이나 변수에 타입을 붙이는 것과 같이 이름뒤에 : 콤마를 붙인 후 아래와 같이 표현한다.
  • 입력 파라미터 타입은 ( ..., ..., ...) 괄호안에 콤마로 표현한다.
  • 출력은 -> 화살표 이후에 표현한다.

 

기존 함수 에서 타입 사용 예시

fun sayBye(name: String): String = "Goodbye, $name!"

fun main() {
    println(sayBye("수진"))
}
---
Goodbye, 수진!

 

Lambda 에서 타입 사용 예시

val sayHello: (String) -> String = { name -> "Hello, $name!" }
println(sayHello("유진"))

--
Hello, 유진!

 

2. 함수에서 람다 표현식을 Return 할때

이 부분이 제일 헷갈릴 수 있는데 천천히 개념을 생각해보면 쉽게 이해가 될 수 있다.

먼저, 단순히 문자열을 return 하는 함수를 정의해본다.

fun secondsConvert(unit: String): String {
    when (unit) {
        "minute" -> return "it is minute"
        "hour" -> return "it is hour"
        "day" -> return "it is day"
        else -> return "No conversion"
    }
}

fun main() {
    val convertedTime = secondsConvert("minute")
    println(convertedTime)
}

--
it is minute

위의 예제와 같이 쓸일은 없을 것이다. 이제, 본격적으로 유용한 기능을 가지도록 업데이트 해보도록 하겠다. 특히, 주목할 부분은 (unit: String) 뒤에 붙어있는 (unit: String): String 부분이다.

현재는 String 타입이 return 된다고 표현되어 있는데, 이제부터 String이 아닌 Lambda Expression이 return 된다고 표현하는 것으로 바꾸어 줄 것이다. 함수와 람다 타입을 결합하기 전에 람다 함수를 만들어 보겠다.

분을 초로 바꾸는 람다 함수를 정의한다.

val minuteToSecond: (Int) -> Int = { time -> time * 60}
val convertedSecond = minuteToSecond(5)
println(convertedSecond)

--
300

그런데, 다들 느꼈다시피 이런식으로 함수를 만들게 되면 hourToSecond, dayToSecond, ... 이렇게 많은 함수를 불필요하게 만들게 되어 효율이 떨어짐을 느꼈을 것이다. 그렇기 때문에 필요한 람다 함수를 동적으로 갖고 올 수 있는 또 다른 함수를 만들어 사용하는 것이 효율적이다. 이것이 함수에서 람다를 Return하는 것이 필요한 이유이다.

그리고, 함수를 return 하기 때문에 어떤 타입이 만들어질지 type inference 하기 어렵기 때문에 명시적으로 Type을 지정해주어야 하는 것이다. 여기서 주목할 부분은 변수뒤의 (입력) -> 출력을 표현하는 람다 타입 표현식이다. 기억이 안나면 이전 블로그를 참조하면 도움이 될 것이다. [Kotlin 강의] 함수 표현식 총정리 fun, lambda

: (Int) -> Int

 

이제, 모든 준비가 되었고 when을 사용해서 필요한 람다 함수를 교체하며 쓸 수 있는 편리한 함수를 만들어 보겠다.

fun anyToSecond(unit: String): (Int) -> Int = when(unit) {
    "minute" -> { time -> time * 60 }
    "hour" -> { time -> time * 60 * 60 }
    else -> { time -> time }
}

fun main() {
    val timeList = (1..10).toList()
    val minuteToSecondList = timeList.map(anyToSecond("minute"))
    println("times: $timeList")
    println("converted seconds: $minuteToSecondList")

    val hourToSecondList = timeList.map(anyToSecond("hour"))
    println("converted hours: $hourToSecondList")
}

--
times: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
converted seconds: [60, 120, 180, 240, 300, 360, 420, 480, 540, 600]
converted hours: [3600, 7200, 10800, 14400, 18000, 21600, 25200, 28800, 32400, 36000]

 

하나의 함수로 다양한 람다 함수를 사용할 수 있어서 코드가 매우 간결하고 효율적으로 리팩토링 되었다.
이 부분은 처음에는 많이 헷갈리니 여러번 블로그를 따라하며 완벽히 익혀두기를 바란다.

반응형

댓글