10
10

๊ณ ์ฐจ ํ•จ์ˆ˜ ์ •์˜

์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ๋žŒ๋‹ค๋‚˜ ํ•จ์ˆ˜ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด ํ•จ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ณ ์ฐจ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. filter, map๋„ ๊ณ ์ฐจํ•จ์ˆ˜์— ์†ํ•œ๋‹ค.

ํ•จ์ˆ˜ ํƒ€์ž… - ๋žŒ๋‹ค๋กœ ์ธ์ž ๋ฐ›๊ธฐ

ํ•จ์ˆ˜ ํƒ€์ž…์„ ์ •์˜ํ•˜๋ ค๋ฉด ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…์„ ๊ด„ํ˜ธ ์•ˆ์— ๋„ฃ๊ณ , ๊ทธ ๋’ค์— ํ™”์‚ดํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ, ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค. Unit ํƒ€์ž…์€ ์˜๋ฏธ ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์— ์“ฐ๋Š” ํŠน๋ณ„ํ•œ ํƒ€์ž…์ด๋‹ค. ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชฉ๋ก ๋’ค์— ์˜ค๋Š” Unit ๋ฐ˜ํ™˜ ํƒ€์ž… ์ง€์ •์„ ์ƒ๋žตํ•ด๋„ ๋˜์ง€๋งŒ, ํ•จ์ˆ˜ ํƒ€์ž…์„ ์„ ์–ธํ•  ๋•Œ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•˜๋ฏ€๋กœ Unit์„ ๋นผ๋จน์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

val action: () -> Unit = { println(42) }        
 

์ธ์ž๋กœ ๋ฐ›์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ

์ธ์ž๋กœ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ทธ๋ƒฅ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๊ฐ™๋‹ค.

fun twoAndThree(operation: (op1: Int, Int) -> Int) {
	  val result = operation(2, 3)
    println("The result is $result")
}
 

๋ฐ˜ํ™˜ํƒ€์ž…์— ๋‹น์—ฐํžˆ Nullable ํ•˜๊ฒŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ ์“ฐ๋ฉด ๊ฐ€๋…์„ฑ์ด ๋” ์ข‹์•„์ง€๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

๋””ํดํŠธ ๊ฐ’์„ ์ง€์ •ํ•œ ํ•จ์ˆ˜ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๋„์ด ๋  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•จ์ˆ˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•  ๋•Œ๋„ ๋””ํดํŠธ ๊ฐ’์„ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

fun <T> Collection<T>.joinToString(
        separator: String = ", ",
        prefix: String = "",
        postfix: String = "",
        transform: (T) -> String = { it.toString() } 
): String {
    ...
}
 

๋ณด๋‹ค์‹œํ”ผ ๋””ํดํŠธ ๊ฐ’์„ ๋žŒ๋‹ค๋กœ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

ํ•จ์ˆ˜ ํƒ€์ž…์€ invoke ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋Š” ๊ฒŒ ์ด์ œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ดํ•ด๋˜๋Š”๋ฐ, ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ invoke๋ฉ”์„œ๋“œ๋ฅผ safe call๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋” null safeํ•œ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค. ํ˜ธ์ถœ ๋ถ€๋ถ„๋งŒ ์‚ดํŽด๋ณด์ž.

transform?.invoke(element) ?: element.toString()// ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•˜๋‚˜๋‹ค
 

์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•จ์ˆ˜ํƒ€์ž…๋„ nullableํ•˜๊ฒŒ ๊ณ ์ณ์ค˜์•ผํ•œ๋‹ค.

transform: ((T) -> String)? = null
 

ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜

ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด return ์‹์— ๋žŒ๋‹ค๋‚˜ ๋ฉค๋ฒ„ ์ฐธ์กฐ๋‚˜ ํ•จ์ˆ˜ ํƒ€์ž…์˜ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ์‹์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

fun getPredicate(): (Person) -> Boolean {
        val startsWithPrefix = { p: Person ->
            p.firstName.startsWith(prefix) || p.lastName.startsWith(prefix)
        }
        if (!onlyWithPhoneNumber) {
            return startsWithPrefix
        }
        return { startsWithPrefix(it)
                    && it.phoneNumber != null }
    }
 

์ต์ˆ™ํ•˜์ง€์•Š์€ ๋ชจ์Šต์ด์ง€๋งŒ ๋ฐ˜ํ™˜๊ฐ’์ด ํ•จ์ˆ˜ํƒ€์ž…์ด๋‹ค. return์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ๋„, ๋ณ€์ˆ˜๋กœ ์ •์˜๋œ ๋žŒ๋‹ค์™€ ๊ทธ๋ƒฅ ๋žŒ๋‹ค ์‹์ด๋‹ค.

์™œ ํ•จ์ˆ˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ• ๊นŒ? ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์ข€ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ๋„˜๊ธฐ๋ฉด์„œ ๊ทธ ์ „์— ์‚ฌ์šฉํ•˜๋˜ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋“ค์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ค‘๋ณต์ œ๊ฑฐ ๋จผ์ € ์‚ดํŽด๋ณด์ž.

๋žŒ๋‹ค๋ฅผ ํ™œ์šฉํ•œ ์ค‘๋ณต ์ œ๊ฑฐ

์‚ฌ์‹ค ์ด๊ฑด filter, map์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฏธ๋ฆฌ ์ฒด๊ฐํ–ˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ๋ณธ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ์ค„๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

val input = br.readLine().split(" ").map{ it.toInt }.toIntArray()
 

ํ•จ์ˆ˜ํƒ€์ž…์ด ๋ฐ˜ํ™˜๋˜๋Š”๊ฑธ ๋ฐ›์•„์„œ split, map, toIntArray๋กœ ์ฐจ๋ก€๋กœ ๋ณ€ํ™˜๋˜๋Š” ๋ชจ์Šต์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฑด ๋””์ž์ธํŒจํ„ด ์ค‘ ์ „๋žตํŒจํ„ด์— ๋Œ€์‘ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ „๋žต์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋žŒ๋‹ค๋ฅผ ๋„˜๊ธฐ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ” ๊ตฌ๋ฒ„์ „์ฒ˜๋Ÿผ ์ „๋žต๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

์ธ๋ผ์ธ ํ•จ์ˆ˜: ๋žŒ๋‹ค์˜ ๋ถ€๊ฐ€ ๋น„์šฉ ์—†์• ๊ธฐ inline

inline ๋ณ€๊ฒฝ์ž๋ฅผ ์–ด๋–ค ํ•จ์ˆ˜์— ๋ถ™์ด๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์žฅ์„ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•ด์ค€๋‹ค. ์ฆ‰ ๋‚ด๊ฐ€ ๋ณผ ๋•Œ๋Š” ๋ณ„๋„์˜ ํ•จ์ˆ˜์ง€๋งŒ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ณผ ๋•Œ๋Š” ๋ณธ๋ฌธ์— ๋“ค์–ด๊ฐ€ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ํ˜ธ์ถœ ๋น„์šฉ์„ ์—†์• ์ค€๋‹ค๋Š” ๋ง์ด๋‹ค

์ธ๋ผ์ด๋‹์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹

์–ด๋–ค ํ•จ์ˆ˜๋ฅผ inline์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ๊ทธ ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์ด ์ธ๋ผ์ธ๋œ๋‹ค. ๋‹ค๋ฅธ ๋ง๋กœ ํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋Œ€์‹ ์— ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ๋ฒˆ์—ญํ•œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

inline fun foo(): Person -> Boolean { }

 

์ธ๋ผ์ธ ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ ์ฝ”๋“œ๊ฐ€ ํ˜ธ์ถœ ์ง€์ ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ , ์ธ๋ผ์ธ ํ•จ์ˆ˜ ์•ˆ์— ์žˆ๋Š” ๋žŒ๋‹ค ๋ณธ๋ฌธ์€ ๊ทธ๋ƒฅ ์ผ๋ฐ˜์ ์ธ ๋žŒ๋‹ค ํ˜ธ์ถœ๋กœ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ฌด๋ช… ํด๋ž˜์Šค๋กœ ๊ฐ์‹ธ์ง€ ์•Š๊ณ  ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋†”๋‘”๋‹ค.

์ธ๋ผ์ธ ํ•จ์ˆ˜์˜ ํ•œ๊ณ„์ 

์ธ๋ผ์ธ์œผ๋กœ ์‚ฌ์šฉํ•œ ๋žŒ๋‹ค๊ฐ€ ๋ณธ๋ฌธ์— ํŽผ์ณ์ง€๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๋žŒ๋‹ค๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•ด์•ผ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ธ๋ผ์ด๋‹์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๊ฒฝ์šฐ ์ธ๋ผ์ธ ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด

Illegal usage of inline-parameter ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— noinline ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์„œ ๋ฏธ๋ฆฌ ์ธ๋ผ์ด๋‹์„ ๊ธˆ์ง€์‹œ์ผœ์•ผํ•œ๋‹ค.

fillter์™€ map์€ ์ธ๋ผ์ธ ํ•จ์ˆ˜๋กœ ์ปฌ๋ ‰์…˜์—์„œ ์•„์ฃผ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ๊ณผ์ •์—์„œ ์ค‘๊ฐ„๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปฌ๋ ‰์…˜์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ๋ถ€๊ฐ€๋น„์šฉ๋„ ๊ฐ™์ด ์ปค์ง„๋‹ค. ์ด๋•Œ๋Š” asSequence๋ฅผ ๋ถ™์—ฌ ์‹œํ€€์Šค๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๋‹ค๋งŒ ๋žŒ๋‹ค๋ฅผ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์‹œํ€€์Šค๋Š” ๋žŒ๋‹ค๋ฅผ ์ธ๋ผ์ธํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€์•Š๋Š”๋‹ค.

ํ•จ์ˆ˜๋ฅผ ์ธ๋ผ์ธ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

inline ํ‚ค์›Œ๋“œ์˜ ์ด์ ์„ ๋ฐฐ์šฐ๊ณ  ๋‚˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ์—ฌ๊ธฐ์ €๊ธฐ์—์„œ inline์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ด์งˆ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ์ด๋Š” ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋‹ค. inline ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋žŒ๋‹ค๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜๋งŒ ์„ฑ๋Šฅ์ด ์ข‹์•„์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค(์ „์ฒด๋กœ ๋ณด๋ฉด ์„ฑ๋Šฅ์ด ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ).

์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ฒฝ์šฐ JVM์€ ์ด๋ฏธ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ธ๋ผ์ด๋‹์„ ์ง€์›ํ•œ๋‹ค. JVM์€ ์ฝ”๋“œ ์‹คํ–‰์„ ๋ถ„์„ํ•ด์„œ ๊ฐ€์žฅ ์ด์ต์ด ๋˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํ˜ธ์ถœ์„ ์ธ๋ผ์ด๋‹ํ•œ๋‹ค. ์ด๋Ÿฐ ๊ณผ์ •์€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ณผ์ •(JIT)์—์„œ ์ผ์–ด๋‚œ๋‹ค. ์ด๋Ÿฐ JVM์˜ ์ตœ์ ํ™”๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋ฉด ๋ฐ”์ดํŠธ์ฝ”๋“œ์—์„œ๋Š” ๊ฐ ํ•จ์ˆ˜ ๊ตฌํ˜„์ด ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ๋งŒ ์žˆ์œผ๋ฉด ๋˜๊ณ , ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๋”ฐ๋กœ ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ์ค‘๋ณตํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ฐ˜๋ฉด ์ฝ”ํ‹€๋ฆฐ ์ธ๋ผ์ธ ํ•จ์ˆ˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ์—์„œ ๊ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ง€์ ์„ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์œผ๋กœ ๋Œ€์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์ค‘๋ณต์ด ์ƒ๊ธด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด ์Šคํƒ ํŠธ๋ ˆ์ด์Šค๊ฐ€ ๋” ๊น”๋”ํ•ด์ง„๋‹ค.

inline ๋ณ€๊ฒฝ์ž๋ฅผ ํ•จ์ˆ˜์— ๋ถ™์ผ ๋•Œ๋Š” ์ฝ”๋“œ ํฌ๊ธฐ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค. ์ธ๋ผ์ด๋‹ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํฐ ๊ฒฝ์šฐ ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ชจ๋“  ํ˜ธ์ถœ ์ง€์ ์— ๋ณต์‚ฌํ•ด ๋„ฃ๊ณ  ๋‚˜๋ฉด ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์ „์ฒด์ ์œผ๋กœ ์•„์ฃผ ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ž์› ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ธ๋ผ์ธ๋œ ๋žŒ๋‹ค ์‚ฌ์šฉ

์ž๋ฐ” 7๋ถ€ํ„ฐ๋Š” ์ž์›์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์ธ try-with-resource๋ฌธ์ด ์ƒ๊ฒผ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ๋Š” useํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ closable ์ž์›์— ๋Œ€ํ•œ ํ™•์žฅํ•จ์ˆ˜๋ฉฐ, ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋žŒ๋‹ค๋‹ค. ์ž‘๋™๋ฐฉ์‹์€ ๋žŒ๋‹ค๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ž์›์„ ๋‹ซ๋Š”๋‹ค.

BufferedReader(FileReader(path)).use { br ->
        return br.readLine()
    }
 

๋žŒ๋‹ค๋ฅผ ์‹คํ–‰ํ•˜๊ณ , FileReader๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” BufferedReader๋ฅผ closeํ•œ๋‹ค.

๊ณ ์ฐจ ํ•จ์ˆ˜ ์•ˆ์—์„œ ํ๋ฆ„ ์ œ์–ด

๋žŒ๋‹ค ์•ˆ์˜ return๋ฌธ: ๋žŒ๋‹ค๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ํ•จ์ˆ˜๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜

for์™€ forEach์˜ ์ฐจ์ด๋ฅผ ๋ณด๊ฒ ๋‹ค.

fun lookForAlice(people: List<Person>) {
    people.forEach {
        if (it.name == "Alice") {
            println("Found!")
            return
        }
    }
    println("Alice is not found")
}
 

๋žŒ๋‹ค ์•ˆ์—์„œ return์„ ์‚ฌ์šฉํ•˜๋ฉด ๋žŒ๋‹ค๋กœ๋ถ€ํ„ฐ๋งŒ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ทธ ๋žŒ๋‹ค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์„ ๋๋‚ด๊ณ  ๋ฐ˜ํ™˜๋œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ž์‹ ์„ ๋‘˜๋Ÿฌ์‹ธ๊ณ  ์žˆ๋Š” ๋ธ”๋ก๋ณด๋‹ค ๋” ๋ฐ”๊นฅ์— ์žˆ๋Š” ๋‹ค๋ฅธ ๋ธ”๋ก์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒํ•˜๋Š” ๋ฐฉ์‹์„ non-local return์ด๋ผ ๋ถ€๋ฅธ๋‹ค. ์˜ˆ์ œ์—์„œ forEach๋Š” ์ธ๋ผ์ธ ํ•จ์ˆ˜์ด๋ฏ€๋กœ ๋žŒ๋‹ค ๋ณธ๋ฌธ๊ณผ ํ•จ๊ป˜ ์ธ๋ผ์ด๋‹๋œ๋‹ค. ๋”ฐ๋ผ์„œ return ์‹์ด ๋ฐ”๊นฅ์ชฝ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜์‹œํ‚ค๋„๋ก ์‰ฝ๊ฒŒ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋žŒ๋‹ค๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜: ๋ ˆ์ด๋ธ”(label)์„ ์‚ฌ์šฉํ•œ return

๋žŒ๋‹ค ์‹์—์„œ๋„ ๋กœ์ปฌ return์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ ํ•  ๋•Œ break์ง€์  ์ง€์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ๋ฐ. ๋กœ์ปฌ return๊ณผ ๋„Œ๋กœ์ปฌ return์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ด๋ธ”(label)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

fun lookForAlice(people: List<Person>) {
    people.forEach label@{
        if (it.name == "Alice") return@label
    }
    println("Alice might be somewhere")
}โ€‹

๋žŒ๋‹ค์— ๋ ˆ์ด๋ธ”์„ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋žŒ๋‹ค๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ์ธ๋ผ์ธ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ return ๋’ค์— ๋ ˆ์ด๋ธ”๋กœ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. ๋žŒ๋‹ค ์‹์˜ ๋ ˆ์ด๋ธ”์„ ๋ช…์‹œํ•˜๋ฉด ๋žŒ๋‹ค์‹์— ๋ ˆ์ด๋ธ”์„ 2๊ฐœ ์ด์ƒ ๋„ฃ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์ด๋ฆ„์„ ๋ ˆ์ด๋ธ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

people.forEach {
        if (it.name == "Alice") return@forEach
    }
 

๋ฌด๋ช… ํ•จ์ˆ˜: ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ์ปฌ return

๋ฌด๋ช… ํ•จ์ˆ˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ํ•จ์ˆ˜์— ๋„˜๊ธธ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋žŒ๋‹ค ์•ˆ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ return@label์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜๋ฉด ๋ณด๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿด ๋•Œ๋Š” ๋ฌด๋ช…ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

fun (person) {
        if (person.name == "Alice") return
        println("${person.name} is not Alice")
    }
 

์ด๋ ‡๊ฒŒ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์—†๋Š”๊ฒŒ ๋ฌด๋ช…ํ•จ์ˆ˜์ธ๋ฐ

fun lookForAlice(people: List<Person>) {
    people.forEach(fun (person) {
        if (person.name == "Alice") return
        println("${person.name} is not Alice")
    })
}
 

๋ฌด๋ช… ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ ˆ์ด๋ธ”์ด ๋ถ™์ง€ ์•Š์€ return ์‹์€ ๋ฌด๋ช… ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜์‹œํ‚จ๋‹ค. ์‹์„ ๋ณธ๋ฌธ์œผ๋กœ ํ•˜๋ฉด ๋ฐ˜ํ™˜ํƒ€์ž…๋„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ๋ฌด๋ช…ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด๋ช…ํ•จ์ˆ˜ ๋ณธ์ธ์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ปฌ ๋ฆฌํ„ด ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ๋œ๋‹ค. ๋žŒ๋‹ค ์‹์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด๋‚˜ ๋žŒ๋‹ค ์‹์„ ์ธ๋ผ์ธ ํ•จ์ˆ˜์— ๋„˜๊ธธ ๋•Œ ์–ด๋–ป๊ฒŒ ๋ณธ๋ฌธ์ด ์ธ๋ผ์ด๋‹ ๋˜๋Š”์ง€ ๋“ฑ์˜ ๊ทœ์น™์„ ๋ฌด๋ช… ํ•จ์ˆ˜์—๋„ ๋ชจ๋‘ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด return์„ ์ดํ•ดํ• ๋•Œ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด fun์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๋ณด๋Š”๊ฒŒ ํŽธํ•˜๋‹ค.

"๋Œ“๊ธ€, ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์‹œ๋ฉด ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค"
๋ฐ˜์‘ํ˜•

'๐Ÿ“– > ์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜๐Ÿ“–' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Kotlin in action - ๋ถ€๋ก E. ์ฝ”๋ฃจํ‹ด๊ณผ Async/Await  (0) 2023.10.13
Kotlin in action(7)  (0) 2023.10.10
Kotlin in action(6)  (0) 2023.10.10
Kotlin in action(5)  (0) 2023.10.10
Kotlin in action(4)  (0) 2023.10.10
COMMENT