๋๋ค ์๊ณผ ๋ฉค๋ฒ์ฐธ์กฐ
๋๋ค์ ์๋ฏธ๋ฅผ ๋ณด๋ฉด ๋ค๋ฅธ ํจ์์ ๋๊ธธ ์ ์๋ ์์ ์ฝ๋ ์กฐ๊ฐ์ด๋ผ๊ณ ๋์ด์๋ค. ๋๋ค ์์ด๋ผ๊ณ ๋ํ๊ณ ํด๋ก์ , ๋ฌด๋ช ํจ์, ํจ์๋ฆฌํฐ๋ด ๋ฑ ๋ถ๋ฅด๋ ์ด๋ฆ์ด ๋ง์๋ฐ, ์๋๋ก์ด๋๋ฅผ ๊ณต๋ถํ๋ฉด์ ์๋๋๋ ์์ด ์ถ๋ชฐํ๋ค. ์ผ์ข ์ ํจ์๊ฐ์ ๋๊ธด๋ค๊ณ ๋ณผ ์๋ ์๋๋ฐ, ์ฝํ๋ฆฐ์ด ํจ์๋ ํ์ ์ผ๋ก ๋ฐ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ผ ๋๋ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋๋ค๋ ์๋ฐ์ ๋ฌด๋ช ๋ด๋ถ ํด๋์ค, ๋จ์ผ ๋ฌด๋ช ๊ฐ์ฒด๋ฅผ ๋์ฒดํ ์ ์๋๋ฐ, ์ด๋ setOnClickListener๋ง ๋ด๋ ์ ์ ์๋ค.
๋๋ค์์ ์ปฌ๋ ์ ์ด๋ String๊ฐ์ฒด ๊ฐ์ ๊ณณ์๋ ์ ์ฌ์ฉ๋๋ค.
people.maxBy{it.age}
people์ age, name ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ๊ฐ์ฒด์ธ๋ฐ, age๋ฅผ ๊ธฐ์ค์ผ๋ก ์ต๋๊ฐ์ ์ฐพ๋ ์ฝ๋๋ค. it์ด ๊ฐ๋ฆฌํค๋๊ฑด ์ปฌ๋ ์ ์ ์์๋ค. ์ฝํ๋ฆฐ์ ๋๋ค ์์ ํญ์ ์ค๊ดํธ๋ก ๋ฌถ์ฌ์๋ค.
๋๋ค ์
val sum = {x: Int, y: Int -> x + y}
x,y๋ฅผ ์ธ์๋ก ํ๋ ํจ์๋ค. sum(1, 2)๋ก ํธ์ถํ๋ฉด 3์ด ๋ฐํ๋๋ค. ๋๋ค ์์ด ์ผ๋ฐํจ์๊ฐ ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค. ๋๋ค ์์ {์ ๋ด์ฉ}()ํํ๋ก ํธ์ถ ํ ์๋ ์๋๋ฐ, ๊ทธ๋ฅ run๋ธ๋ก์ผ๋ก ๋๋ฌ์์์ ๋๋ค์์ ์ ์ธํ๋ฉด ๋ฐ๋ก ์คํ๊ฐ๋ฅํ๋ค. ์ผ๋ฐ ํจ์๊ฐ ํธ์ถ์ ์คํ์ ์๋ ๋ฐ ๋นํด ๋๋ค ํธ์ถ์ ๋ถ๊ฐ๋น์ฉ์ด ๋ค์ง ์๋๋ค. ๋ค์ maxBy๋ก ๋์๊ฐ์,
people.maxBy{it.age}
people.maxBy{one: Person -> one.age}
people.maxBy({one -> one.age})
people.maxBy(){it.age}
๋ชจ๋ ๋์ผํ ๋์์ ํ๋ค. ํจ์ ๋ง์ง๋ง ํ๋ผ๋ฏธํฐ๊ฐ ๋๋ค์์ด๋ผ๋ฉด ๊ดํธ ๋ฐ์ผ๋ก ๋บ ์ ์๋ ๊ด์ต์ด ์๊ณ , ๋๋ค ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ ๋ถ์ฌ์ ์ฌ์ฉํ ์๋ ์๋ค. ๋จ์ผ ํ๋ผ๋ฏธํฐ๋ผ๋ฉด ๊ดํธ๋ฅผ ์ญ์ ํ ์ ์๊ณ , ๋๋ค ์ธ์๋ ํ์ ์ถ๋ก ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ it์ด ๊ธฐ๋ณธ์ด๋ค. ๋ ์ฌ๋ฌ์ค๋ก ์ด๋ค์ง ๋๋ค์์ ๋ฐํ ๊ฐ์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์๋ ์์ด๋ค.
fun printMessagesWithPrefix(messages: Collection<String>, prefix: String) {
messages.forEach {
println("$prefix $it")
}
}
๋ฉ์๋์ ๋ก์ปฌ ๋ณ์๋ฅผ ๋๋ค ์์์ ์ฌ์ฉํ ์ ์๋ค. ๋๋ค ์์์ ๋๋ค ๋ฐ๊นฅ์ ๋ณ์๊ฐ์ ๋ฐ๊ฟ ์๋ ์์ด์ ํ์ด๋์ธ ์ธ๋ถ ๊ฐ์๋ง ์ ๊ทผ ํ ์ ์๋ ์๋ฐ์ ๋ฌด๋ช ๋ด๋ถ ํด๋์ค ๋ณด๋ค ์์ ๋กญ๋ค. ์ด์ ๊ฐ์ด ๋๋ค ๋ด๋ถ์์ ์ฌ์ฉํ๋ ์ธ๋ถ ๋ณ์๋ฅผ ํฌํํ ๋ณ์๋ผ๊ณ ํ๋๋ฐ, ํฌํ๋ ๋ณ์๋ ํจ์ ์ฌ์ฉ์ด ๋๋๋ ๋๋ค๋ฅผ ๋ฐ๋ก ์ ์ฅํด๋๋ค๋ฉด ํด๋น ๋ณ์์ ์ ๊ทผํ ์์๋ค. ๊ทธ ์ด์ ๋ ๋๋ค๋ฅผ ์ ์ฅํ ๋ ํฌํํ ๋ณ์์ ๊ฐ์ด ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ ํํ๋ ์ปดํ์ผ๋ฌ๊ฐ ํฌํํ ๋ณ์๋ง๋ค ๊ทธ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ํ๋๋ฅผ ๋ง๋ ๋ค.
๋ฉค๋ฒ ์ฐธ์กฐ
๋๋ค๋ ํจ์์ ๋ฐ๋๋ง ๋ผ์ ๋ณด๋๊ฑฐ๋ผ๊ณ ์๊ฐํ ์ ์๋ค. ๊ทธ๋ผ ์ด๋ฏธ ์ ์ ๋ ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ๋ ๊น? ์ด๋ :: ๋ฅผ ์ฌ์ฉํ๋ค. ์ด ๋ฐฉ์์ ๋ฉค๋ฒ ์ฐธ์กฐ๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ํด๋์ค์ ์๋ ํ๋กํผํฐ๋ ๋ฉ์๋(ํ์ฅํจ์ ํฌํจ) ๋จ ํ๋๋ฅผ ํธ์ถํ๋ ํจ์๊ฐ์ ๋ง๋ค์ด์ค๋ค.
people.maxBy{person: Person -> person.age}
people.maxBy(Person::age)
run(::superior)
๊ฐ์ ๋ด์ฉ์ ๋ฉค๋ฒ ์ฐธ์กฐ๋ก ๋ฐ๊พผ ๋ชจ์ต์ด๋ค. ๋ฉค๋ฒ ์ฐธ์กฐ ๋ค์ ๊ดํธ๊ฐ ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๊ณ , ํ์ ์ด ํด๋น ๋ฉค๋ฒ๋ฅผ ํธ์ถํ๋ ๋๋ค์ ๊ฐ์์ ๋์ผํ๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ค(ETA ๋ณํ). ์ต์์ ๋ฉค๋ฒ๋ ํธ์ถ๊ฐ๋ฅํ๋ฐ ํด๋์ค๋ฅผ ์ฐธ์กฐ ํ์ง ์๊ณ ๋ฐ๋ก ๋ฉค๋ฒ๋ฅผ ํธ์ถํ๋ค. ์ด ๋ฐฉ์์ผ๋ก ์์ฑ์ ์ฐธ์กฐ๋ ๊ฐ๋ฅํ๋ฐ, ::ํด๋์ค์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์ฝ๋๊ฐ ๋๋ค.
๋ฐ์ด๋ ๋ฉค๋ฒ ์ฐธ์กฐ
์ด๊ฑฐ๋ ์ฝ๊ฐ ์ ๊ธฐํ ๊ธฐ๋ฅ์ด๋ค. ์ด์ ์ธ์คํด์ค๋ฅผ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ธ๋ฐ,
fun main(args: Array<String>) {
val createPerson = ::Person
var p = createPerson("Alice", 29)
val getAge = Person::age
println(getAge(p))
p = p.copy(name = "Bob", age = 40)
val bounded = p::age
println(bounded())
}
์ด๋ฏธ ์์ฑํ p์ธ์คํด์ค๋ฅผ bounded๊ฐ ์ฌ์ฌ์ฉํ๋ค.
์ปฌ๋ ์ API
์ง๊ธ๊น์ง ์ ๋ชจ๋ฅด๊ณ ์ฌ์ฉํ๋ ์ปฌ๋ ์ ์ ํจ์ํ API๋ค์ ์ดํด๋ณด๊ฒ ๋ค.
filter, map
val list = listOf(1, 2, 3, 4)
println(list.filter { it % 2 == 0 })
println(list.map { it * it })
val numbers = mapOf(0 to "zero", 1 to "one")
println(numbers.mapValues { it.value.toUpperCase() })
filter๋ ์ปฌ๋ ์ ์ ๋๋ฉด์ ๋๋ค๊ฐ true๋ฅผ ๋ฐํํ๋ ์์๋ง ๊ณ ๋ฅธ๋ค. ์ฐธ/๊ฑฐ์ง์ ๋ฐํํ๋ ํจ์๋ฅผ ์ ์ด(predicate)๋ผ๊ณ ํ๋๋ฐ ์ ์ฝ๋์์๋ {it%2==0}์ด ์ ์ด๋ค. filter๊ฐํ๋ ์ญํ ์ ๋จ์ง ์กฐ๊ฑด์ ๋ง์ถฐ ๊ฑธ๋ฌ๋ด๋ ๊ฒ์ด๊ณ , ๊ฑธ๋ฌ๋ธ๊ฐ/ ๋๋ ์ดํฐ๋ ์ด์ ํ๋ฉด์ ๊ฐ์ ์ผ๊ด์ ์ผ๋ก ๋ญ๊ฐ ์กฐ์์ ํ๊ณ ์ถ๋ค๋ฉด map์ ์ฌ์ฉํด์ผํ๋ค.
map์ ๊ฐ ์์์ ํ๊ณ ์ํ๋ ์ฐ์ฐ์ ์ ์ฉํด ์ ์ปฌ๋ ์ ์ ๋ง๋ ๋ค.
println(numbers.mapValues { it.value.toUpperCase() }.hashCode())
println(numbers.hashCode())
ํด์์ฝ๋๋ฅผ ์ฐ์ด๋ณด๋ฉด ๋ค๋ฅธ ์ปฌ๋ ์ ์์ ์ ์ ์๋ค. mapValues, mapKeys, filterKeys, filterValues์ ๊ฐ์ api๋ ์กด์ฌํด์, key-value ์์ธ ๋งต ์๋ฃ๊ตฌ์กฐ์๋ ์ฝ๊ฒ ์ ์ฉํ ์ ์๋ค.
all, any, count, find
all๊ณผ any๋ ์ปฌ๋ ์ ์ ๋ชจ๋ ์์์ ๋ํ ์กฐ๊ฑด์ ๊ฒ์ฌํ ์ ์๋ค. all์ ๋ชจ๋ ์์๊ฐ ๋ง์กฑํ๋์ง, any๋ ํ๋๋ผ๋ ์ํ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ง ๊ฒ์ฌ ํ ์์๋ค. ๊ฐ๋ ์ฑ์ ๋์ด๋ ค๋ฉด any๋ all์ !๋ฅผ ๋ถ์ด๋ ํ์๋ฅผ ์ง์ํ๋ฉด ๋ ์ข๋ค. count๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์ ๊ฐ์, find๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฒซ๋ฒ์งธ ์์๋ฅผ ๋ฐํํ๋ค(null์ด ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ฉด firstOnNull()์ด ๊ฐ๋ ์ฑ ์ธก๋ฉด์์ ๋ ์ข์ ๋ฐฉ๋ฒ์ผ ์ ์๋ค.). ํนํ count๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์ ๊ฐ์๋ง์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ filter์ size๋ฅผ ๋ถ์ด๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋ณ๊ฒ ๋์ํ๋ค.
println(!list.all { it == 3 })
println(list.any { it != 3 })
println(list.count { it != 3 })
val numberThree = { it == 3 }
println(list.find(numberThree))
์ ํจ์๋ค์ด ๊ณ ์ฐจํจ์์ด๊ธฐ ๋๋ฌธ์ ์ ์ด๋ฅผ ๋๋ค ๋ณ์๋ก ์ ์ฅํด์ ์ฌ์ฉํ ์๋ ์๋ค.
groupBy
์ปฌ๋ ์ ์ ๋ชจ๋ ์์๋ฅผ ์ด๋ค ๊ธฐ์ค์ ๋ฐ๋ผ ๊ทธ๋ฃนํ ํด์ผํ ๋ ์ฌ์ฉํ๋ค.
val list = listOf("a", "ab", "b")
println(list.groupBy(String::first))
๋ฐํ๋ ์ปฌ๋ ์ ์ Map์ด๋ค.
flatMap, flatten
์ด ๋ ํจ์๋ ์ค์ฒฉ๋ ์ปฌ๋ ์ ๋ด๋ถ์ ์์๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ค. flat์ผ๋ก ๊ฐ์ ๋ค ๋ถ๋ฆฌํด ๋จ์ผ ๋ฆฌ์คํธ๋ก ๋ฐํํด์ฃผ๋๋ฐ, ์์์ ์ฌ์ฉ๋ map{}๊ณผ ์ค์ฒฉ๋ ์ปฌ๋ ์ ์ ํผ๋ flat์ด ๊ฐ์ด ์๋ค๊ณ ์ดํดํ๋ฉด ๋๊ฒ ๋ค. map์ผ๋ก ๋ณํํ ๋ด์ฉ์ด ์๋ค๋ฉด ๊ทธ๋ฅ flatten์ผ๋ก ์ค์ฒฉ๋ ๊ฑธ ํผ์น ์ ์๋ค.
println(books.flatMap { it.authors }.toSet())
println(books.flatten())
list๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ค๋ณต๊ฐ์ ์ ๊ฑฐํ๊ณ ์ถ๋ค๋ฉด ์ ์ฝ๋์ ๊ฐ์ด toSet()๊ฐ์ ์กฐ์์ ํ ์ ์๋ค.
์ด๋ฒ ์ ์์๋ ์ ๋งคํ๋ ๊ฐ๋ ์ ์ก์ ๊ฒ๋ ์์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก๋ ์ฝ๋ฉํ ์คํธ ์ค๋น ํ ๋ ์์ฃผ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ํจ์๋ชฉ๋ก์ ์๊ฒ ๋ผ์ ์ข์๋ค.
์ํ์ค์ ์ง์ฐ ์ฐ์ฐ
์์์ ์๋ ์ปฌ๋ ์ ํจ์๋ค์ ์ฆ์ ์ฐ์ฐ๋๋ค. ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ ๋๋ ๋งค ๋จ๊ณ๋ง๋ค ์ค๊ฐ ์ฐ์ฐ๊ฒฐ๊ณผ๋ฅผ ์์ ์ ์ฅํ๋ ๋ฐ, ์ํ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๊ฑธ ๋ง์ ์ ์๋ค.
listOf(1, 2, 3, 4).asSequence()
.map { print("map($it) "); it * it }
.filter { print("filter($it) "); it % 2 == 0 }
.toList()
asSequence()๋ฅผ ์ฌ์ฉํด ์ํ์ค๋ก ๋ฆฌ์คํธ๋ฅผ ๋ฌถ์ด์ ์ฌ์ฉํ๋ฉด ํจ์จ์ด ์ฌ๋ผ๊ฐ๋ค. ์ํ์ค๋ ์ปฌ๋ ์ ๊ณผ ๋์ผํ API๋ฅผ ์ ๊ณตํด์ ์ฌ์ฉ์ ๋ฌ๋ผ์ง๋ ๊ฑด ์๋ค. ๋ค๋ง ์ํ์ค์์๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ด์ฉํด ์ฐจ๋ก๋๋ก ์กฐ์ํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๋ก ์ง์ ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ List๋ก ๋ค์ ๋ฐ๊ฟ์ค์ผ ํ๋ค. ์ ์ฝ๋์์ toList()๊ฐ ์ต์ข ์ฐ์ฐ, ๊ทธ ์ฌ์ด์ ์๋ ๊ฒ ์ค๊ฐ์ฐ์ฐ์ด๋ค. ์ํ์ค๋ฅผ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ง๋ค ์๋ ์๋๋ฐ, ํน์ ์ฐ์ฐ์ ๋ฐํํ๋ ์ํ์ค๋ฅผ ๋ง๋ค๋ generateSequence๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
fun File.isInsideHiddenDirectory() =
generateSequence(this) { it.parentFile }.find { it.isHidden }
fun main(args: Array<String>) {
val file = File("/Users/username/.HiddenDir/a.txt")
println(file.isInsideHiddenDirectory())
}
์์ ๊ฐ์ด ์ด๋ค ๊ฐ์ฒด์ ์กฐ์์ด ์ง๊ธ ์ฐพ์ ๊ฐ๊ณผ ๊ฐ์ ํ์ ์ด๊ณ , ๋ชจ๋ ์กฐ์์ ์ํ์ค์์ ์ด๋ค ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฐ๊ณผ ๊ฐ์ด ํ์ํ ๋๊ฐ ์ผ๋ฐ์ ์ธ ์ฉ๋ก๋ค.
ํจ์ํ ์ธํฐํ์ด์ค - SAM
setOnClickListener๊ฐ ์ด๋ฒ์๋ ์์๋ก ๋์จ๋ค. ์๋ฐ์์๋ ๋ฌด๋ช ์ธ์คํด์ค๋ฅผ ์ด์ฉํด onClick(View v )๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํด์ ์ฌ์ฉํ์ง๋ง, ์ฝํ๋ฆฐ์์๋ ๊ทธ๋ฅ ๋๋ค๋ก ์ฌ์ฉํ๋ฉด ๋๋ค์ ํ๋ผ๋ฏธํฐ๊ฐ view๋ก ๊ทธ๋ฅ ์กํ๊ฒ ๋๋๋ฐ, ์ด๊ฑด OnClickListener์ ์ถ์๋ฉ์๋๊ฐ ๋จ ํ๋๋ง ์๋ ํจ์ํ ์ธํฐํ์ด์ค ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ค๋ฅธ๋ง๋ก SAM ์ธํฐํ์ด์ค(๋จ์ผ ์ถ์ ์ธํฐํ์ด์ค, Single Abstract Method)๋ผ๊ณ ํ๋ค. Runnable, Callable ํ์ ์ด SAM์ ํด๋นํ๋๋ฐ ์ฝํ๋ฆฐ์ ์ฌ๊ธฐ์ ๋๋ค๋ฅผ ๋ฃ์ด ์ฒ๋ฆฌํ ์ ์๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๋๋ค๋ฅผ ๋ฌด๋ช ํด๋์ค์ ์ธ์คํด์ค๋ก ๋ง๋ค์ด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ด๊ฑด ์๋ฐ์ ๊ฒฝ์ฐ๊ณ , ์ฝํ๋ฆฐ inline์ผ๋ก ํ์๋ ํจ์์ ๋๋ค๋ฅผ ๋๊ธฐ๋ฉด ๋ฌด๋ช ํด๋์ค๋ฅผ ๋ง๋ค์ง์๊ณ ์ฒ๋ฆฌ๋๋ค.
SAM ์์ฑ์
fun createAllDoneRunnable(): Runnable {
return Runnable { println("All done!") }
}
fun main(args: Array<String>) {
createAllDoneRunnable().run()
}
SAM ์์ฑ์๋ ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ๋ ํจ์๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ๋ฌด๋ช ํด๋์ค๋ก ๋๋ค๋ฅผ ๋ฐ๊ฟ์ ์๋ ๊ฒฝ์ฐ๋ ์ด๋ค ํ์ ์ ๋ฉ์๋๋ฅผ ์ ํํด ๋๋ค๋ฅผ ๋๊ธธ์ง ๋ชจํธํ ๊ฒฝ์ฐ์ ๋ช ์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ์ ์ฝ๋๋ ์ฌ์ฉํ ๋๋ค๋ฅผ SAM ์์ฑ์๋ก ๊ฐ์ผ ๊ฒ์ด๋ค.
์์ ๊ฐ์ฒด ์ง์ ๋๋ค: with, apply
์์ ๊ฐ์ฒด๋ฅผ ๋ช ์ํ์ง์๊ณ ๋๋ค ๋ธ๋ญ์์์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถ ํ ์ ์๊ฒํ๋ ํจ์๋ค์ด๋ค.
with
fun alphabet() = with(StringBuilder()) {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know the alphabet!")
toString()
}
with()์ ์ฌ์ฉํ ์์ ๊ฐ์ฒด๋ฅผ ์ง์ ํ๋ฉด ํด๋น ์ค์ฝํ ์์์๋ ๋ฐ๋ก ์์ ๊ฐ์ฒด๋ฅผ ์ง์ ํ์ง์์๋ ์ ํด์ง ์์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ฅธ๋ค. ์ ์ฝ๋์์๋ StringBuilder์ธ์คํด์ค๋ฅผ ์์ ๊ฐ์ฒด๋ก ๋ฃ์๋ค. ์ค๋ณต๋ ์ด๋ฆ์ด ์๋ค๋ฉด this๋ก ์ง์ ํ๋ ๋ฒ๋ ์๋ค. ์ค์ฒฉ๋ with์ด ์๋ค๋ฉด this@์์นํํด๋์ค.์ฌ์ฉํ ํจ์()๋ก ์ง์ ํ๋ฉด ๋๋ค.
with์ ์ด๋ ๊ฒ ๋๋ค์ฝ๋๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ , with ๋ง์ง๋ง ์ค์ ์๋ ๊ฐ์ ๋ฐํํ๋ค. ๋๋ค์ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ ์์ ๊ฐ์ฒด๊ฐ ํ์ํ ๊ฒฝ์ฐ applyํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
apply
apply๊ฐ with๊ณผ ๋ค๋ฅธ์ ์ ์์ ์๊ฒ ์ ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์ด๋ค.
fun alphabet() = StringBuilder().apply {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know the alphabet!")
}.toString()
apply๋ฅผ ์คํํ ๊ฒฐ๊ณผ๊ฐ StringBuilder๊ฐ์ฒด๊ฐ ๋๊ธฐ ๋๋ฌธ์ toString์ ๋ฐ์ผ๋ก ๋นผ์ผํ๋ค. ์ด์ฒ๋ผ apply๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ํ๋กํผํฐ ์ค ์ผ๋ถ๋ฅผ ์ด๊ธฐํํด์ผํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๋ค. ์๋๋ก์ด๋์ ๋์ ํด๋ณด๋ฉด RecyclerView์ข ๋ฅ๊ฐ ์ฌ์ฉ๋ ๋ Adapter๋ฅผ ์ด๊ธฐํํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒ ๋ค.
StringBuilder()์ toString()์ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ ๊ฐ์ฒด๋ฅผ StringBuilder๋ก ์ง์ ํด์ค buildString ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
fun alphabet() = buildString {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know the alphabet!")
}โ
"๋๊ธ, ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์๋ฉด ํฐ ํ์ด ๋ฉ๋๋ค"
'๐๐๏ธ > ์ฝํ๋ฆฐ ์ธ ์ก์ ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Kotlin in action(7) (0) | 2023.10.10 |
---|---|
Kotlin in action(6) (0) | 2023.10.10 |
Kotlin in action(4) (0) | 2023.10.10 |
Kotlin in action(3) (0) | 2023.10.10 |
Kotlin in action(2) (0) | 2023.10.10 |