Java에서는 자원을 close를 해야 할 떄 try-with-resources문으로 자원이 일을 한 후 자동으로 close()를 호출해주는 구문이 있다.

... 생략
private boolean isRunning(Process process) throw Exception {
    String line;
    StringBuilder pidInfo = new StringBuilder();

    try (BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
        while ((line = input.readLine()) != null) {
            pidInfo.append(line);
        }
    } 
    return !StringUtils.isEmpty(pidInfo.toString());
}

그렇다면 이를 어떻게 kotlin으로 사용할 수 있을까? 바로 표준 함수인 use함수를 이용해 가능하다.

private fun isRunning(process: Process): Boolean {
    var line: String?
    val pidInfo = StringBuilder()
    BufferedReader(InputStreamReader(process.inputStream)).use { input ->
        while (input.readLine().also { line = it } != null) {
            pidInfo.append(line)
            return pidInfo.isNotEmpty() // 여기서도 가능하다!
        }
        // return pidInfo.isNotEmpty() 
    }
}

여기서 주의해야 하는점은 “람다 본문에서 사용한 return은 비지역 반환“이다. 즉, return문은 람다가 아닌 isRunning함수를 끝내며 값을 반환한다.

좀 더 자세히

use함수는 kotlin.io패키지에서 확인할 수 있다.

inline fun <T : Closeable?, R> T.use(block: (T) -> R): R

use함수의 body를 보면 Closeable를 상속한 클레스에서만 사용할 수 있고, 함수 시그니처의 block은 24 ~ 30줄에 작성한 람다를 의미한다.

코드: https://github.com/JetBrains/kotlin/blob/6a670dc5f38fc73eb01d754d8f7c158ae0176ceb/libraries/stdlib/jvm/src/kotlin/io/Closeable.kt#L22

Reference

https://shinjekim.github.io/kotlin/2019/11/01/Kotlin-%EC%9E%90%EB%B0%94%EC%9D%98-try-with-resource-%EA%B5%AC%EB%AC%B8%EA%B3%BC-%EC%BD%94%ED%8B%80%EB%A6%B0%EC%9D%98-use-%ED%95%A8%EC%88%98/