๐ ์ปฌ๋ ์ ํจ์๋ฅผ ์ฐ์ํ๋ ๊ฒฝ์ฐ ์์ ์ปฌ๋ ์ ์ด ์์ฑ๋๋ค.
map์ด๋ค filter๊ฐ์ ์ปฌ๋ ์ ํจ์๋ฅผ ์ฐ์ํ๋ฉด ๋งค ๋จ๊ณ๋ง๋ค ์ค๊ฐ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์๋ก์ด ์์ ์ปฌ๋ ์ ์ ์ ์ฅ๋๋ค. ์ฆ, ๋งค ๋จ๊ณ ๋ง๋ค ๋ถํ์ํ ์ปฌ๋ ์ ์ด ์์ฑ๋๋ค.
๐ ๋์ ๊ณผ์
val resultList = people.map(Person::name).filter { it.startsWith("A") }
- ์ ์์ ์์ map์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ์์ ์ปฌ๋ ์ ์ด ์์ฑ๋๊ณ
- ๊ทธ ์์ ์ปฌ๋ ์ ์ ๋ํ filter ์คํ ๊ฒฐ๊ณผ๋ฅผ resultList๋ก ์ ์ฅํ๋ค.
๐ sequence๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ปฌ๋ ์ ์ด ์์ฑ๋์ง ์๋๋ค.
์ฝํ๋ฆฐ์์ ์ ๊ณตํ๋ ์ํ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๊ฐ ์์ ์ปฌ๋ ์ ์ ์ฌ์ฉํ์ง ์๊ณ , ์ปฌ๋ ์ ์ฐ์ฐ์ ์ฐ์ํ ์ ์๋ค.
๐ ๋์ ๊ณผ์
people.asSequence().map(Person::name).filter { it.startsWith("A") }.toList()
- ์ค๊ฐ ์ฐ์ฐ (map)์ ์ฒ๋ฆฌ๋ ์ฐ๊ธฐ๋๋ค.
- ์ต์ข ์ฐ์ฐ์ ํธ์ถํ์ ๋ ์ฐ๊ธฐ๋๋ ๋ชจ๋ ๊ณ์ฐ์ด ์ํ๋๋ค.
๊ฒฐ๊ณผ๋ฅผ ์ป์ ํ์๊ฐ ์๊ธฐ๋ฉด(์ต์ข ์ฐ์ฐ ํธ์ถ), ๊ทธ ๋ ์ค๊ฐ ์ฐ์ฐ์ ์ ์ฉํ๋ค.
(java์์ Stream๊ฐ์ฒด์ ๋์๊ณผ ๊ฐ๋ค.)
๐์ฌ์ฉ ๋ฐฉ๋ฒ
โ asSequence
val resultListFromSequence =
people.asSequence().map(Person::name).filter { it.startsWith("A") }.toList()
์ปฌ๋ ์ ์ ๋ํ์ฌ asSequence๋ฅผ ํธ์ถํ๋ฉด ์ด๋ค ์ปฌ๋ ์ ์ด๋ ์ํ์ค๋ก ๋ฐ๊ฟ ์ ์๋ค.
โ generateSequence
generageSquence๋ ์ผ๋ฐ ํจ์์ฒ๋ผ ํธ์ถํ๋ค. ์ด์ ์์๋ฅผ ์ธ์๋ก ๋ฐ์ ๋ค์ ์์๋ฅผ ๊ณ์ฐํ๋ค.
val naturalNumbers = generateSequence(0) { it + 1 }
val numbersTo100 = naturalNumbers.takeWhile { it <= 100 }
println(naturalNumbers) // kotlin.sequences.GeneratorSequence@5034c75a
println(numbersTo100) // kotlin.sequences.TakeWhileSequence@396a51ab
println(numbersTo100.sum()) // 5050
์ค๊ฐ์ generateSequence๊ฐ ๋ฆฌํดํ ๊ฐ์ฒด๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ์๊ฒ ์ง๋ง, ์ปฌ๋ ์ ์ด ์๋๋ผ sequence ์์ฒด๋ฅผ ๋ฐํํ๋ค.
์ฆ, ๊ฒฐ๊ณผ ์ค๊ฐ์๋ ์ปฌ๋ ์ ์ด ์์ฑ๋์ง ์๊ณ , ์ต์ข ์ฐ์ฐ์ ํด๋นํ๋ sum์ ํธ์ถํ์ ๋ ๊ฒฐ๊ณผ ์ปฌ๋ ์ ์ ๋ฐํํ๋ค.
๐ sequence์ ์ฅ์
- ์์ ๋งํ๋ฏ์ด ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์์ ์ปฌ๋ ์ ์ ์์ฑํ์ง ์๋๋ค.
- ์์์ ์ฐ์ฐ์ ์ฐจ๋ก๋๋ก ์ ์ฉํ๋ค๊ฐ ๊ฒฐ๊ณผ๊ฐ ์ป์ด์ง๋ฉด ๊ทธ ์ดํ ์์์ ๋ํด์๋ ์ฐ์ฐ์ ํ์ง ์๋๋ค.
println(listOf(1, 2, 3, 4, 5, 6).map { it * it }.find { it > 10 })
์์ ๊ฐ์ ๊ณ์ฐ์ด ์์ ๋, ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ๋ ๊ฒฐ๊ณผ๋ 4์ด๋ค. (find๋ ๋๋ค๋ก ์ง์ ํ ์ฐ์ฐ์ ํด๋นํ๋ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๋ฐํํจ)
โ sequence๋ฅผ ์ฌ์ฉํ์ง ์์ ๋
- ์ ์ฒด ์ปฌ๋ ์ ์์๋ค์ ๋ํ์ฌ map์ฐ์ฐ ์คํ
- map์ฐ์ฐ ๊ฒฐ๊ณผ์ ๋ํ์ฌ find์คํ ( > 10 ์ธ ์ฒซ ๋ฒ์งธ ์์ ์ฐพ๊ธฐ)
โ sequence๋ฅผ ์ฌ์ฉํ ๋
- ๊ฐ ์์์ ๋ํ์ฌ ์์ฐจ์ ์ผ๋ก map ์ฐ์ฐ์ ์คํํ ๋ค์ -> find ์ฐ์ฐ์ ์คํํ๋ค.
- 4๋ฒ์งธ ์์๊ฐ ์ํ๋ ๊ฒฐ๊ณผ์ด๊ธฐ ๋๋ฌธ์ ๋ค ์์ 5, 6์ ๋ํด์๋ ์๋ฌด ์ฐ์ฐ๋ ์คํํ์ง ์๋๋ค.
๐ค ๊ทธ๋ผ ํญ์ sequence๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ ์๋๊ฐ?
์ด ์ง๋ฌธ์ ๋ํ ๋ต์ NO!
๐ ์ฝํ๋ฆฐ ๋๋ค์ ์ฃผ์ํ ํน์ง
์ฝํ๋ฆฐ์์ ๋๋ค๋ฅผ ์ธ์๋ก ์ ๋ฌํ ๋ ์ฃผ์ํด์ผ ํ๋ ํน์ง์ด ์๋ค.
void postponeComputation(int delay, Runnable computation)
์๋ฅผ ๋ค์ด ์์ ๊ฐ์ ์๋ฐ ๋ฉ์๋๊ฐ ์์ ๋, Runnable ํ์ ์ Runnable์ ๊ตฌํํ ๋ฌด๋ช ํด๋์ค์ ์ธ์คํด์ค์ด๊ณ ์ด ๋ถ๋ถ์ ๋๋ค๋ฅผ ์ ๋ฌํ ์ ์๋ค.
๋ง์ฝ ์ ๋ถ๋ถ์ ๋๋ค๊ฐ ์๋ object๋ก ์ ๋ฌํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
postponeComputation(1000, object :Runnable{
override fun run(){
println(42)
}
}
์์ ๊ฐ์ด object๋ก Runnable์ ์ ๋ฌํ๋ฉด ๋งค๋ฒ postponeComputation ํธ์ถํ ๋๋ง๋ค ์๋ก์ object๊ฐ ์์ฑ๋๋ค!
๋์ผํ ๊ตฌํ์ ๋๋ค๋ก ํ๋ค๋ฉด
postponeComputation(1000) { println(42) }
๋งค๋ฒ postponeComputation๋ฅผ ํธ์ถํ ์๋ก์ด object๋ฅผ ์์ฑํ์ง ์๋๋ค. ์ฆ, ์๋์ ๊ฐ์ด ๊ตฌํํ ๊ฒ๊ณผ ๋์ผํ ์๋ฏธ์ด๋ค. ๋งค๋ฒ ์ด๋ฏธ ์์ฑ๋ runnable๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. (์ฑ๊ธํค์ผ๋ก ์ ์ง)
val runnable = Runnable { println(42) }
fun handleComputation() {
postponeComputation(1000, runnable)
}
โ ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋ค!
๋๋ค๊ฐ ๋๋ค ์ธ๋ถ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋งค๋ฒ ํธ์ถํ ๋๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค. (object๋ก ๊ตฌํํ์ ๋ ์ฒ๋ผ)
์ด๋ ๊ฒ ๋๋ค์์ ์ธ๋ถ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ '๋ณ์ ์บก์ณ'๋ผ๊ณ ํ๋ค.
fun handleComputation(id: String) { // ๋๋ค ์์์ id ๋ณ์ ์ฌ์ฉ
postponeComputation(1000) { println(id) } // ๋๋ค ํธ์ถ ์ ๋ง๋ค ๋งค๋ฒ ์๋ก์ด Runnable ์ธ์คํด์ค ์์ฑ
}
โ ์ธ๋ผ์ด๋์ ํตํด ๋ณ์ ์บก์ณ์ ๋ถ๊ฐ๋น์ฉ ์์ ๊ธฐ
์๋ ์ฒ๋ผ inlineํค์๋๋ฅผ ๋ถ์ด๋ฉด ํธ์ถํ ๋๋ง๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์๊ณ , ์คํํ ๋ ๋๋ค๋ก ์ ๋ฌํ ํจ์๊ฐ ๋ณธ๋ฌธ์ ์ฝ๋๋ก ์ปดํ์ผ๋๋ค.
์ฆ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด sum์ ํธ์ถํ๋ ๋ถ๋ถ์์ sum์ ๊ตฌํํ ์ฝ๋๊ฐ ๋ค์ด๊ฐ๋ค.
inline fun sum(a: Int, b: Int) = a + b
fun main() {
val a = 1
val b = 2
val result = sum(a, b)
}
์์ฑํ ์ฝ๋
inline fun sum(a: Int, b: Int) = a + b
fun main() {
val a = 1
val b = 2
val result = a + b
}
์ปดํ์ผ๋ ์ฝ๋
๐ ๊ทธ๋์ sequence๋์ ๋ฌด์จ ์๊ด์ธ๋ฐ?
๋๊ณ ๋์.. ๋ค์ sequence!
์ฝํ๋ฆฐ์์ ์ปฌ๋ ์ ์ ํจ์๋ ์ธ๋ผ์ธ ํจ์์ด๋ค. ์ธ๋ผ์ธ ํจ์์ด๊ธฐ ๋๋ฌธ์ ํธ์ถํ์ ๋ ์ถ๊ฐ ๊ฐ์ฒด๋ ํด๋์ค ์์ฑ์ ์๋ค.
์ปฌ๋ ์ ์ผ๋ฐ ํธ์ถ | ์ํ์ค |
์ปฌ๋ ์ ์ ์ค๊ฐ ๊ฒฐ๊ณผ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ์์ ์ปฌ๋ ์ ์ ๋ง๋ ๋ค. | ์ค๊ฐ ์์ ์ปฌ๋ ์ ์ ๋ง๋ค์ง ์๋๋ค. |
๋๋ค๊ฐ ์ธ๋ผ์ด๋ ๋๋ค. → ํธ์ถ ์ ์ถ๊ฐ ๊ฐ์ฒด๋ ํด๋์ค ์์ฑ์ ์๋ค | ๋๋ค๊ฐ ์ธ๋ผ์ด๋ ๋์ง ์๋๋ค → ํธ์ถ ์ ๋ณ๋ ๊ฐ์ฒด ์์ฑ |
๊ทธ๋ฌ๋๊น ์ํ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๊ฐ ์์ ์ปฌ๋ ์ ์ ๋ง๋ค์ง ์์ง๋ง, ํธ์ถํ ๋๋ง๋ค ๋ณ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค๋ ์๋ฆฌ๋ค.
๐ ๊ทธ๋ผ sequence๋ ์ธ์ ์ธ๊น?
์์ ๊ฐ์ ์ด์ ๋ก ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ๋ชจ๋ ์ปฌ๋ ์ ์ฐ์ฐ์ asSequence๋ฅผ ๋ถ์ฌ์๋ ์๋๋ค.
์ํ์ค ์ฐ์ฐ์์๋ ๋๋ค๊ฐ ์ธ๋ผ์ด๋๋์ง ์๊ธฐ ๋๋ฌธ์ ํฌ๊ธฐ๊ฐ ์์ ์ปฌ๋ ์ ์ ์คํ๋ ค ์ผ๋ฐ ์ปฌ๋ ์ ์ฐ์ฐ์ด ๋ ์ฑ๋ฅ์ด ๋์ ์๋ ์๋ค. ์ํ์ค๋ฅผ ํตํด ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ๊ฒฝ์ฐ๋ ์ปฌ๋ ์ ํฌ๊ธฐ๊ฐ ํฐ ๊ฒฝ์ฐ ๋ฟ์ด๋ค.
์ถ์ฒ : Kotlin in action