- λλ€μ/λλ€: λ€λ₯Έ ν¨μμ λκΈΈ μ μλ μμ μ½λ μ‘°κ°
#1. λλ€μκ³Ό λ©€λ² μ°Έμ‘°
λλ€: μ½λ λΈλμ ν¨μ μΈμλ‘ λκΈ°κΈ°
λλ€ μμ μ¬μ©νλ©΄ ν¨μλ₯Ό μ μΈν νμκ° μκ³ , μ½λ λΈλμ μ§μ ν¨μμ μΈμλ‘ μ λ¬ν μ μλ€.
button.setOnClickListener { /* actions on click */ }
-> λλ€λ₯Ό λ©μλκ° νλλΏμΈ 무λͺ κ°μ²΄ λμ μ¬μ©ν μ μλ€.
λλ€μ 컬λ μ
- μμ) maxBy: 컬λ μ μμ νΉμ 쑰건μ κΈ°μ€μΌλ‘ κ°μ₯ ν° μμλ₯Ό μ°Ύμ λ°ννλ ν¨μ
val people = listOf(Person("Alice", 29), Person("Bob", 31))
println(people.maxBy { it.age }) //λΉκ΅μ κΈ°μ€μ΄ λ κ°μ λλ€λ‘ μ λ¬νλ€.
ν¨μλ νλ‘νΌν°λ₯Ό λ°ννλ μν μ μννλ λλ€λ λ©€λ² μ°Έμ‘°λ‘ λμΉν μ μλ€.
people.maxBy(Person::age)
λλ€ μμ λ¬Έλ²
λλ€λ κ°μ²λΌ μ¬κΈ°μ κΈ° μ λ¬ν μ μλ λμμ λͺ¨μμ΄λ€.
λ³μμ μ μ₯ν μλ μλ€.
ν¨μμ μΈμλ‘ λκΈ°λ©΄μ λ°λ‘ λλ€λ₯Ό μ μνλ κ²½μ°κ° λλΆλΆμ΄λ€.
μ½νλ¦°μμλ ν¨μ νΈμΆ μ 맨 λ€μ μλ μΈμκ° λλ€ μμ΄λ©΄ κ·Έ λλ€λ₯Ό κ΄νΈ λ°μΌλ‘ λΉΌλΌ μ μλ€.
λλ€κ° μ΄λ€ ν¨μμ μ μΌν μΈμμ΄κ³ κ΄νΈ λ€μ λλ€λ₯Ό μΌλ€λ©΄, νΈμΆ μ λΉ κ΄νΈλ₯Ό μμ λ λλ€.
people.maxBy { p: Person -> p.age }
μΈμκ° μ¬λΏ μλ κ²½μ°μλ λλ€λ₯Ό λ°μΌλ‘ λΉΌλΌ μλ μκ³ λλ€λ₯Ό κ΄νΈ μμ μ μ§ν΄μ ν¨μμ μΈμμμ λΆλͺ ν ν μλ μλ€. λ μ΄μμ λλ€λ₯Ό μΈμλ‘ λ°λ κ²½μ° κ΄νΈλ₯Ό μ¬μ©νλ μΌλ°μ μΈ ν¨μ νΈμΆ ꡬ문μ μ¬μ©νλ νΈμ΄ λ«λ€.
λλ€μ νλΌλ―Έν°κ° νλλΏμ΄κ³ κ·Έ νμ μ μ»΄νμΌλ¬κ° μΆλ‘ ν μ μλ κ²½μ° itμ λ°λ‘ μΈ μ μλ€.
people.maxBy { it.age }
λλ€ μμ λλ€κ° μ€μ²©λλ κ²½μ° κ° λλ€μ νλΌλ―Έν°λ₯Ό λͺ μνλ νΈμ΄ λ«λ€.
λλ€λ₯Ό λ³μμ μ μ₯ν λλ νλΌλ―Έν° νμ μ λͺ μν΄μΌ νλ€.
val getAge = { p: Person -> p.age }
λ³Έλ¬Έμ΄ μ¬λ¬ μ€λ‘ μ΄λ€μ§ κ²½μ° λ³Έλ¬Έμ 맨 λ§μ§λ§μ μλ κ°μ΄ λλ€μ κ²°κ³Ό κ°μ΄ λλ€.
val sum = { x: Int, y: Int ->
println("Computing the sum of $x and $y...")
x+y
}
νμ¬ μμμ μλ λ³μμ μ κ·Ό
λλ€λ₯Ό ν¨μ μμμ μ μνλ©΄ ν¨μμ νλΌλ―Έν°λΏ μλλΌ λλ€ μ μμ μμ μ μΈλ λ‘컬 λ³μκΉμ§ λλ€μμ λͺ¨λ μ¬μ©ν μ μλ€.
νμ΄λ λ³μκ° μλ λ³μμ μ κ·Όν μ μκ³ , λ°κΉ₯μ λ³μλ₯Ό λ³κ²½ν μ μλ€
fun printProblemCounts(responses: Collection<String>) {
var clientErrors = 0 //λλ€μμ μ¬μ©ν λ³μ μ μΈ
var serverErrors = 0
responses.forEach {
if (it.startsWith("4")) {
clientErrors++ //λλ€ μμμ λλ€ λ°μ λ³μλ₯Ό λ³κ²½νλ€.
} else if (it.startsWith("5")) {
serverErrors++
}
}
println("$clientErrors client errors, $serverErrors server errors")
}
λλ€ μμμ μ¬μ©νλ μΈλΆ λ³μλ₯Ό 'λλ€κ° ν¬νν λ³μ(captured variable)'λΌκ³ λΆλ₯Έλ€.
μ΄λ€ ν¨μκ° μμ μ λ‘컬 λ³μλ₯Ό ν¬νν λλ€λ₯Ό λ°ννκ±°λ λ€λ₯Έ λ³μμ μ μ₯νλ€λ©΄ λ‘컬 λ³μμ μλͺ μ£ΌκΈ°μ ν¨μμ μλͺ μ£ΌκΈ°κ° λ¬λΌμ§ μ μλ€.
- νμ΄λ λ³μλ₯Ό ν¬νν κ²½μ°: λλ€ μ½λλ₯Ό λ³μ κ°κ³Ό ν¨κ» μ μ₯
- νμ΄λμ΄ μλ λ³μλ₯Ό ν¬νν κ²½μ°: λ³μλ₯Ό νΉλ³ν λνΌλ‘ κ°μΈμ λνΌμ λν μ°Έμ‘°λ₯Ό λλ€ μ½λμ ν¨κ» μ μ₯νλ€.
λ©€λ² μ°Έμ‘°
μ½νλ¦°μμλ μλ° 8κ³Ό λ§μ°¬κ°μ§λ‘ ν¨μλ₯Ό κ°μΌλ‘ λ°κΏ μ μλ€.
val getAge = Person::age
::μ μ¬μ©νλ μμ λ©€λ² μ°Έμ‘°λΌκ³ λΆλ₯Έλ€.
νλ‘νΌν°λ λ©μλλ₯Ό λ¨ νλλ§ νΈμΆνλ ν¨μ κ°μ λ§λ€μ΄μ€λ€.
κ·Έ λ©€λ²λ₯Ό νΈμΆνλ λλ€μ κ°μ νμ
μ΄λ€.
μ΅μμμ μ μΈλ ν¨μλ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν μλ μλ€.
#2. 컬λ μ ν¨μν API
filterμ map
- filter: 컬λ μ μ μ΄ν°λ μ΄μ νλ©΄μ μ£Όμ΄μ§ λλ€μ κ° μμλ₯Ό λ겨 λλ€κ° trueλ₯Ό λ°ννλ μμλ§ λͺ¨μλ€. ('μλ‘μ΄ μ»¬λ μ 'μ λ°ννλ€.)
- map: μ£Όμ΄μ§ λλ€λ₯Ό 컬λ μ μ κ° μμμ μ μ©ν κ²°κ³Όλ₯Ό λͺ¨μμ 'μ 컬λ μ 'μ λ§λ λ€.
μ΄λ° ν¨μ νΈμΆμ μ°μμν¬ μ μλ€.
ππ
κΌ νμνμ§ μμ κ²½μ° κ΅³μ΄ κ³μ°μ λ°λ³΅νμ§ λ§λΌ!
λλ€λ₯Ό μΈμλ‘ λ°λ ν¨μμ λλ€λ₯Ό λκΈ°λ©΄ λ¨μν΄ λ³΄μ΄μ§λ§ λ΄λΆ λ‘μ§μ 볡μ‘λλ‘ μΈν΄ μ€μ λ‘λ λΉν¨μ¨μ μΈ κ³μ°μμ΄ λ μλ μλ€.
'λͺ
νν' μ΄ν΄νκ³ μ¬μ©ν΄μΌ νλ€.
all, any, count, find
- all: λͺ¨λ μμκ° μ΄λ€ 쑰건μ λ§μ‘±νλμ§ νλ¨
- any: μ΄λ€ 쑰건μ λ§μ‘±νλ μμκ° μλμ§ νλ¨
- count: 쑰건μ λ§μ‘±νλ μμμ κ°μ λ°ν
- find: 쑰건μ λ§μ‘±νλ '첫 λ²μ§Έ' μμ λ°ν (firstOrNullκ³Ό κ°λ€)
μ΄λ€ 쑰건μ λν΄ !allμ μνν κ²°κ³Όμ κ·Έ 쑰건μ λΆμ μ λν΄ anyλ₯Ό μνν κ²°κ³Όλ κ°λ€. (-> λ λͺ¨λ₯΄κ°μ λ²μΉ)
κ°λ
μ±μ μν΄ anyμ all μμ !λ₯Ό λΆμ΄μ§ μλ κ²μ΄ λ«λ€.
* ν¨μλ₯Ό μ μ¬μ μμ μ¬μ©νκΈ°: countμ size
>> people.filter(canBeInClub27).size
μ΄λ κ² νλ©΄ filterμ κ²°κ³Όλ‘ μ€κ° 컬λ μ μ΄ μκΈ΄λ€.
countλ₯Ό μ¬μ©νλ©΄ μμμ κ°μλ§ μΆμ νκ³ , 쑰건μ λ§μ‘±νλ μμλ₯Ό λ°λ‘ μ μ₯νμ§ μμμ μ΄ κ²½μ°μλ countκ° λ ν¨μ¨μ μ΄λ€.
groupBy: 리μ€νΈλ₯Ό μ¬λ¬ κ·Έλ£ΉμΌλ‘ μ΄λ€μ§ 맡μΌλ‘ λ³κ²½
κ° κ·Έλ£Ήμ 리μ€νΈμ΄λ€. μμμμμ groupByμ κ²°κ³Ό νμ μ Map<Int, List>μ΄λ€.
flatMapκ³Ό flatten: μ€μ²©λ 컬λ μ μμ μμ μ²λ¦¬
- flatMap: μ£Όμ΄μ§ λλ€λ₯Ό 컬λ μ μ λͺ¨λ κ°μ²΄μ μ μ©(map)νκ³ , μ μ©ν κ²°κ³Ό μ»μ΄μ§λ μ¬λ¬ 리μ€νΈλ₯Ό ν 리μ€νΈμ λͺ¨μλ€(flatten).
- flatten: νΉλ³ν λ³νν λ΄μ©μμ΄ νΌμΉκΈ°λ§ ν λ μ¬μ©
- list.flatten()
#3. μ§μ° κ³μ°(lazy) 컬λ μ μ°μ°
people.map(Person::name).filter { it.startsWith("A") }
-> mapμ΄λ filterμ κ°μ 컬λ μ ν¨μλ κ²°κ³Ό 컬λ μ μ μ¦μ μμ±νλ€.
people.asSequence() //컬λ μ
μ μνμ€λ‘ λ³ννλ€.
.map(Person::name) //μνμ€λ 컬λ μ
κ³Ό λκ°μ APIλ₯Ό μ 곡νλ€.
.filter { it.startsWith("A") }
.toList() //κ²°κ³Ό μνμ€λ₯Ό λ€μ 리μ€νΈλ‘ λ³ννλ€.
μνμ€λ₯Ό μ¬μ©νλ©΄ μ€κ° μμ 컬λ μ μ μ¬μ©νμ§ μκ³ λ 컬λ μ μ°μ°μ μ°μν μ μλ€.
μ§μ° κ³μ° μνμ€λ Sequence μΈν°νμ΄μ€μμ μμνλ€.
μνμ€λ ν λ²μ νλμ© μ΄κ±°λ μ μλ μμμ μνμ€λ₯Ό νννλ€.
Sequenceμμ μ 곡νλ iterator λ©μλλ₯Ό ν΅ν΄ μνμ€λ‘λΆν° μμλ₯Ό μ»μ μ μλ€.
μνμ€λ μ§μ° κ³μ°μ νκΈ° λλ¬Έμ μ΅μ’ μνμ€μ μμλ₯Ό νλμ© μ΄ν°λ μ΄μ νκ±°λ μ΅μ’ μνμ€λ₯Ό 리μ€νΈλ‘ λ³νν΄μΌ νλ€.
ν° μ»¬λ μ μ λν΄μ μ°μ°μ μ°μμν¬ λλ μνμ€λ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€.
**μνμ€κ° μ±λ₯μ΄ λ μ’μ κ²½μ°λ ν° μ»¬λ μ μΈ κ²½μ°λΏμ΄λ€. (8μ₯μμ μμΈν λ€λ£¬λ€.)
μνμ€ μ°μ°: μ€κ° μ°μ°κ³Ό μ΅μ’ μ°μ°
- μ€κ° μ°μ°: λ€λ₯Έ μνμ€λ₯Ό λ°ν, νμ μ§μ° κ³μ°λλ€.
- μ΅μ’ μ°μ°: κ²°κ³Όλ₯Ό λ°ν (컬λ μ , μμ, μ«μ λλ κ°μ²΄)
μ΅μ’ μ°μ°μ΄ μμ΄ μ€ννλ©΄ μνμ€ μ°μ°μ νμ§ μλλ€.
μνμ€μ λν μ°μ°μ κ° μμμ λν΄ μμ°¨μ μΌλ‘ μ μ©λλ€.
μμμ μ°μ°μ μ°¨λ‘λλ‘ μ μ©νλ€κ° κ²°κ³Όκ° μ»μ΄μ§λ©΄ κ·Έ μ΄νμ μμμ λν΄μλ λ³νμ΄ μ΄λ€μ§μ§ μμ μλ μλ€.
컬λ μ μ λν΄ μννλ μ°μ°μ μμλ μ±λ₯μ μν₯μ λΌμΉλ€.
μνμ€ λ§λ€κΈ°
generateSequence()
: μ΄μ μ μμλ₯Ό μΈμλ‘ λ°μ λ€μ μμλ₯Ό κ³μ°νλ€.
val naturalNumbers = generateSequence(0) { it + 1 }
val numbersTo100 = naturalNumbers.takeWhile { it <= 100 }
println(numbersTo100.sum()) //sumμ κ²°κ³Όλ₯Ό κ³μ°ν λ λͺ¨λ μ§μ° μ°μ°μ΄ μνλλ€.
#4. μλ° ν¨μν μΈν°νμ΄μ€ νμ©
ν¨μν μΈν°νμ΄μ€ / SAM(Single Abstract Method) μΈν°νμ΄μ€
: μΆμ λ©μλκ° λ¨ νλλ§ μλ μΈν°νμ΄μ€
μ½νλ¦°μμ ν¨μλ₯Ό μΈμλ‘ λ°μ νμκ° μλ ν¨μλ ν¨μν μΈν°νμ΄μ€κ° μλλΌ ν¨μνμ μ μΈμ νμ μΌλ‘ μ¬μ©ν΄μΌ νλ€.
μλ° λ©μλμ λλ€λ₯Ό μΈμλ‘ μ λ¬
ν¨μν μΈν°νμ΄μ€λ₯Ό μΈμλ‘ μνλ μλ° λ©μλμ μ½νλ¦° λλ€λ₯Ό μ λ¬ν μ μλ€.
postponeComputation(1000) { println(42) }
μ»΄νμΌλ¬λ μλμΌλ‘ 무λͺ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄μ€λ€.
- λλ€μ 무λͺ
κ°μ²΄μ μ°¨μ΄
- κ°μ²΄: λͺ μμ μΌλ‘ μ μΈνλ κ²½μ°, λ©μλλ₯Ό νΈμΆν λλ§λ€ μλ‘μ΄ κ°μ²΄κ° μμ±λλ€.
- λλ€: λλ€μ λμνλ 무λͺ κ°μ²΄λ₯Ό λ©μλ νΈμΆ μλ§λ€ λ°λ³΅ μ¬μ©νλ€.
λλ€κ° μ£Όλ³ μμμ λ³μλ₯Ό ν¬ννλ€λ©΄ μ»΄νμΌλ¬λ λ§€λ² μ£Όλ³ μμμ λ³μλ₯Ό ν¬νν μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μ€λ€.
*μ½νλ¦° inlineμΌλ‘ νμλ μ½νλ¦° ν¨μμκ² λλ€λ₯Ό λκΈ°λ©΄ μλ¬΄λ° λ¬΄λͺ ν΄λμ€λ λ§λ€μ΄μ§μ§ μλλ€. (8μ₯μ μμΈν λμ¨λ€.)
SAM μμ±μ: λλ€λ₯Ό ν¨μν μΈν°νμ΄μ€λ‘ λͺ μμ μΌλ‘ λ³κ²½
SAM μμ±μ
: λλ€λ₯Ό ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ‘ λ³νν μ μκ² μ»΄νμΌλ¬κ° μλμΌλ‘ μμ±ν ν¨μ
μ»΄νμΌλ¬κ° λλ€λ₯Ό ν¨μν μΈν°νμ΄μ€ 무λͺ
ν΄λμ€λ‘ λ°κΎΈμ§ λͺ»νλ κ²½μ° SAM μμ±μλ₯Ό μ¬μ©ν μ μλ€.
λλ€λ‘ μμ±ν ν¨μν μΈν°νμ΄μ€ μΈμ€ν΄μ€λ₯Ό λ³μμ μ μ₯ν΄μΌ νλ κ²½μ°μλ SAM μμ±μλ₯Ό μ¬μ©ν μ μλ€
val listener = OnClickListener { view ->
val text = when (view.id) {
R.id.button1 -> "First button"
R.id.button2 -> "Second button"
else -> "Unknown button"
}
toast(text)
}
μ»΄νμΌλ¬ μ μ₯μμ λλ€λ μ½λ λΈλμΌ λΏμ΄κ³ , κ°μ²΄κ° μλλ―λ‘ κ°μ²΄μ²λΌ λλ€λ₯Ό μ°Έμ‘°ν μλ μλ€.
λλ€ μμμ thisλ κ·Έ λλ€λ₯Ό λλ¬μΌ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
무λͺ κ°μ²΄ μμμλ thisκ° κ·Έ 무λͺ κ°μ²΄ μΈμ€ν΄μ€ μμ μ κ°λ¦¬ν¨λ€.
#5. μμ κ°μ²΄ μ§μ λλ€: withμ apply
μμ κ°μ²΄ μ§μ λλ€
: μμ κ°μ²΄λ₯Ό λͺ
μνμ§ μκ³ λλ€μ λ³Έλ¬Έ μμμ λ€λ₯Έ κ°μ²΄μ λ©μλλ₯Ό νΈμΆν μ μκ² νλ λλ€
with ν¨μ
withκ° λ°ννλ κ°μ λλ€ μ½λλ₯Ό μ€νν κ²°κ³Όμ΄λ€.
fun alphabet(): String {
val stringBuilder = StringBuilder()
return with(stringBuilder) { //λ©μλλ₯Ό νΈμΆνλ €λ μμ κ°μ²΄λ₯Ό μ§μ νλ€.
for (letter in 'A'..'Z') {
this.append(letter) //thisλ₯Ό λͺ
μνμ¬ μμ κ°μ²΄μ λ©μλλ₯Ό νΈμΆνλ€.
}
append("\nNow I know the alphabet!") //thisλ μλ΅ κ°λ₯νλ€.
this.toString()
}
}
with ν¨μλ 첫 λ²μ§Έ μΈμλ‘ λ°μ κ°μ²΄λ₯Ό λ λ²μ§Έ μΈμλ‘ λ°μ λλ€μ μμ κ°μ²΄λ‘ λ§λ λ€.
fun alphabet() = with(StringBuilder()) {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know the alphabet!")
toString()
}
λΆνμν stringBuilder λ³μλ₯Ό μμ λ©΄ alphabet() ν¨μκ° μμ κ²°κ³Όλ₯Ό λ°λ‘ λ°ννκ² λλ€.
apply ν¨μ
applyλ νμ μμ κ°μ²΄λ₯Ό λ°ννλ€.
applyμ μμ κ°μ²΄κ° μ λ¬λ°μ λλ€μ μμ κ°μ²΄κ° λλ€.
κ°μ²΄μ μΈμ€ν΄μ€λ₯Ό λ§λ€λ©΄μ μ¦μ νλ‘νΌν° μ€ μΌλΆλ₯Ό μ΄κΈ°νν΄μΌ νλ κ²½μ° μ μ©νλ€.
fun createViewWithCustomAttributes(context: Context) =
TextView(context).apply {
text = "Sample Text"
textSize = 20.0
setPadding(10, 0, 0, 0)
}
'κ°λ° > Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Ktor] 2. Request (0) | 2021.08.04 |
---|---|
[Ktor] 1. ν΄λΌμ΄μΈνΈ, Engine (0) | 2021.08.04 |
[Kotlin In Action] 4. ν΄λμ€, κ°μ²΄, μΈν°νμ΄μ€ (0) | 2021.05.19 |
[Kotlin In Action] 3. ν¨μ μ μμ νΈμΆ (0) | 2021.05.10 |
[Kotlin In Action] 2. μ½νλ¦° κΈ°μ΄ (0) | 2021.05.10 |