μ½νλ¦°μ΄λ?
- μλ° νλ«νΌμμ λμκ°λ μλ‘μ΄ νλ‘κ·Έλλ° μΈμ΄
- κ°κ²°νκ³ μ€μ©μ
- μλ° μ½λμμ μνΈ μ΄μ©μ±μ μ€μ
- μ½νλ¦° μ»΄νμΌλ¬κ° μμ±ν λ°μ΄νΈμ½λλ μΌλ°μ μΈ μλ° μ½λμ λκ°μ΄ ν¨μ¨μ μΌλ‘ μ€ν
μ μ νμ μ§μ μΈμ΄
μ μ νμ
μ§μ μ΄λ λͺ¨λ νλ‘κ·Έλ¨ κ΅¬μ± μμμ νμ
μ μ»΄νμΌ μμ μ μ μ μλ€.
νλ‘κ·Έλ¨ μμμ κ°μ²΄μ νλλ λ©μλλ₯Ό μ¬μ©ν λλ§λ€ μ»΄νμΌλ¬κ° νμ
μ κ²μ¦ν΄μ€λ€.
μ½νλ¦°μ νμ
μΆλ‘ μ μ§μνμ¬ κ°λ°μκ° νμ
μ μΈν΄μΌνλ λΆνΈν¨μ΄ μ€μ΄λ λ€.
λ§€κ° λ³μ μ΄λ¦ λ€μ λ§€κ° λ³μμ μλ£νμ μ΄λ€.
private val PATTERN = Pattern.compile("//(.)\n(.*)")
private const val FIRST_TARGET_STRING = "//"
private const val LAST_TARGET_STRING = "\n"
λ³μ μ μΈ
- val : κ°μ΄ λ³κ²½λμ§ μλ λ³μ
- var : κ°μ΄ λ³κ²½λ μ μλ λ³μ
λΈλ‘μ΄ λ³Έλ¬ΈμΈ ν¨μ
fun max(a: Int, b: Int) : Int {
return if (a > b) a else b
}
μμ΄ λ³Έλ¬ΈμΈ ν¨μ
fun max(a: Int, b: Int) : Int = if (a > b) a else b
μ½νλ¦° νμ΅ ν μ€νΈ
named arguments
Crew("μ μ§ν", 20, "μλ§μ°")
Crew κ°μ²΄μ nameκ³Ό nickname νλκ° μμ λ μμ±μμ μ λ¬νλ μΈμλ§μ λ³΄κ³ λ μ΄λ€ λ¬Έμμ΄μ΄ μ΄λ€ μν μΈμ§ ν·κ°λ¦΄ μ μλ€.
μ΄λ ν¨μμ μκ·Έλμ²λ₯Ό μ΄ν΄λ³΄μ§ μκ³ λ μμλ΄κΈ° μ΄λ €μ΄λ°,
μ½νλ¦°μΌλ‘ μμ±ν ν¨μλ₯Ό νΈμΆν λλ κ°λ
μ±μ λμ΄κΈ° μν΄ μ λ¬νλ μΈμμ μ΄λ¦μ λͺ
μν΄μ€ μ μλ€.
μ΄λ μΈμ μ€ μ΄λ νλλΌλ μ΄λ¦μ λͺ
μνλ©΄ κ·Έ λ€λ‘ μ€λ λͺ¨λ μΈμλ μ΄λ¦μ λͺ
μν΄μΌ νλ€.
Person("μ μ§ν", 20, nickname = "μλ§μ°"),
Person(name = "μ μ§ν", nickname = "μλ§μ°", age = 20)
nullable types
class Person(val name: String, val age: Int?, var nickname: String?)
nullμ΄ λ μ μλ typeμ λͺ
μμ μΌλ‘ νμν μ μλ€.
typeμ ?λ₯Ό λΆμμΌλ‘μ nullμ΄ κ°λ₯ν λ³μμμ λͺ
μμ μΌλ‘ νννλ€.
default arguments
class Person(val name: String, val age: Int? = null, var nickname: String? =null)
μλ°λμ€λ²λ‘λ©μ νμ¬ μΈμκ° λ€λ₯Έ κ°μ λ©μλλ₯Ό λ§λ λ€.
νμ§λ§ μ½νλ¦°μ κΈ°λ³Έ μΈμλ₯Ό μ§μνκΈ° λλ¬Έμ, 1κ°μ λ©μλλ§ μ μνμ¬ λ©μλ μ€λ²λ‘λ© κΈ°λ₯μ νλ€.
κΈ°λ³Έ μΈμλ₯Ό μ€μ νλ λ°©λ²μ, λ€μκ³Ό κ°μ΄ μΈμ μ΄λ¦ λ€μμ μΈμ = κΈ°λ³Έκ°
μ²λΌ μ μνλ©΄ λλ€.
fun add(num1, num2: Int = 0)
μμ λ©μλλ μλμ²λΌ μΈμμ κ°μκ° λ€λ₯΄κ² νΈμΆλ μ μμ΅λλ€.
add(1) // num2 = 0 μ κΈ°λ³ΈμΈμλ‘ μ λ¬
add(1, 2)
data classe
data class Person(val name: String, val age: Int? = null, var nickname: String? =null)
- μ리 νΌμ λ°μ΄ν° ν΄λμ€λ DTOλ€.
- λ±ν λΉμ¦λμ€ λ‘μ§μ κ°κ³ μμ§μλ€.
- μμ±μλΆν° getter & setter, μ¬μ§μ΄ canonical methodsκΉμ§ μμμ μμ±ν΄μ€λ€.
μ ν μ¬ν
- κΈ°λ³Έ μμ±μμλ μ΅μ νλμ νλΌλ―Έν°κ° μμ΄μΌ νλ€.
- κΈ°λ³Έ μμ±μμ νλΌλ―Έν°λ valμ΄λ varμ¬μΌλ§ νλ€.
- λ°μ΄ν° ν΄λμ€λ abstract, open, sealed, innerκ° λλ©΄ μ λλ€.
π€ Canonical Methods?
μΊλ
Έλ컬 λ©μλλ Anyμ μ μΈλ λ©μλ (Anyλ μλ°μ Objectμ²λΌ μ½νλ¦°μμ λͺ¨λ κ°μ²΄μ μ‘°μμ΄ λλ κ°μ²΄)
λ°λΌμ μ½νλ¦°μ λͺ¨λ μΈμ€ν΄μ€κ° κ°κ³ μλ λ©μλλ₯Ό λ»νλ€.
μ½νλ¦°μ data classλ λͺ¨λ Canonical λ©μλλ₯Ό μ¬λ°λ₯΄κ² ꡬννκ³ μλ€.
- equlas(other: Any?): Boolean - μ΄ λ©μλλ μ°Έμ‘°κ° μλλΌ λ°μ΄ν° ν΄λμ€ κ° κ°μ μΌμΉλ₯Ό λΉκ΅νλ€.
- hashCode(): Int - ν΄μ¬μ½λλ μΈμ€ν΄μ€μ μ«μ ννμ΄λ€. hashCode()κ° κ°μ μΈμ€ν΄μ€μμ μ¬λ¬ λ² νΈμΆλ λ νμ λμΌν κ°μ λ°νν΄μΌ νλ€. equals()λ‘ λΉκ΅ν λ μ°Έμ λ°ννλ λ μΈμ€ν΄μ€λ κ°μ hashCode()λ₯Ό κ°μ ΈμΌλ§ νλ€.
- toString(): String - μΈμ€ν΄μ€μ λ¬Έμμ΄ ννμ΄λ€. λ°μ΄ν° ν΄λμ€λ μ΄λ₯Ό λ©€λ² λ³μμ κ°μ λμ΄νλλ‘ μλμΌλ‘ μ¬μ μ νλ€.
- copy() : κ°μ²΄λ₯Ό 볡μ¬νμ¬ μ κ°μ²΄ μμ±
- componentsN() : μμ±μ μμλλ‘ λ°ν
2λ¨κ³ λ¬Έμμ΄ κ³μ°κΈ° ꡬννλ©΄μ λ°°μ΄ μ¬μ€λ€
λ©μλ μ μ
fun λ©μλλͺ
(x: Int): λ°ννμ
{
retunr 2 * x
}
Unit / Nothing
μ½νλ¦°μ μμνμ κ³Ό wrapper typeμ ꡬλΆνμ§ μλλ€.
Unit
ν¨μμ λ°ν κ΅¬λ¬Έμ΄ μλ€λ κ²μ νννλ€. (μλ°μ voidμ ν΄λΉ).
voidμλ λ€λ₯΄κ² μΈμλ‘λ μ¬μ©ν μ μλ€.
Nothing
ν¨μκ° μ μμ μΌλ‘ λλμ§ μλλ€λΌλκ±Έ λͺ μμ μΌλ‘ νννλ€.
firstOrNull
컬λ μ λ΄ μ²« λ²μ§Έ μΈμλ₯Ό λ°ννλ€. λ¨μν 리μ€νΈ λ΄μμ 첫 λ²μ§Έμ μμΉνλ μΈμλ₯Ό λ°ννλ κ²λΏ μλλΌ, νΉμ 쑰건μ λ§μ‘±νλ 첫 λ²μ§Έ μΈμλ₯Ό λ°ννλλ‘ κ΅¬μ±νλ κ²λ κ°λ₯νλ€.
val operator = values().firstOrNull { item -> item.op == op }
?: throw IllegalArgumentException("μ‘΄μ¬νμ§ μλ μ°μ°μμ
λλ€.")
μλμ°¨ κ²½μ£Ό νΌλλ°±
μ½νλ¦°μ μ½λ© 컨벀μ
ν΄λμ€
- νλ‘νΌν°
- μ΄κΈ°ν λΈλ‘
- λΆ μμ±μ
- ν¨μ
- λλ° κ°μ²΄
μμΌλ‘ μμ±νλ€.
β ktlint μ μ©νκΈ°
ktlintλ μ½νλ¦°μ μν μ μ λΆμ λꡬλ‘, μ½νλ¦°μΌλ‘ μμ±ν μ½λμ μ€νμΌ κ²μ¬μ, νμμ λ§μ§ μλ λΆλΆμ μμ νλ κΈ°λ₯μ μ 곡νλ€.
μ¬μ©νκΈ° μν΄μλ λ€μκ³Ό κ°μ΄ νλ¬κ·ΈμΈμ μΆκ°ν΄μ€λ€.
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.3.72'
id 'org.jmailen.kotlinter' version "3.2.0" // μΆκ°
}
νλ¬κ·ΈμΈμ μΆκ°νλ©΄ gradle-Tasks-formatingμ΄ μμ±λλλ° lintKotlinμ λλ¬μ£Όλ©΄ lintλ‘ μ½νλ¦° 컨벀μ μ΄ νλ¦° λΆλΆμ μ‘μμ€λ€.
μ£Όμμ±μ, λΆ μμ±μ
μ£Ό μμ±μ
class Car(val name: String, val position: Int = 0)
ν΄λμ€ μ΄λ¦ λ€μ μ€λ μμ±μκ° λ°λ‘ μ£Ό μμ±μμ΄λ€.
μ£Ό μμ±μλ μμ±μ νλΌλ―Έν°λ₯Ό μ§μ νκ³ , μ΄μ μν΄ μ΄κΈ°νλλ νλ‘νΌν°λ₯Ό μ μνλλ° μ¬μ©λλ€.
λν μ£Ό μμ±μλ κ°μ²΄ μ΄κΈ°νλ₯Ό μμνλ μ μΌν κ³³μ΄κΈ° λλ¬Έμ μ 곡λλ μΈμλ€μ΄ μμ ν΄μΌ νλ€.
μ£Ό μμ±μμλ λ³λμ μ½λλ₯Ό ν¬ν¨μν¬ μ μλ€.
μ΄λ μ½νλ¦°μ init
ν€μλλ‘ μ΄κΈ°ν λΈλ‘μ μ μΈν μ μλ€.
class Car(val name: String, val position: Int = 0) {
init {
require(name.length <= MAX_NAME_LENGTH) {
"μλμ°¨μ μ΄λ¦μ 5κΈμλ₯Ό μ΄κ³Όν μ μμ΅λλ€."
}
// ...
λΆ μμ±μ
νλΌλ―Έν° λͺ©λ‘μ΄ λ€λ₯Έ μ¬λ¬ μμ±μλ₯Ό λ§λ€ κ²½μ° λΆ μμ±μλ₯Ό λ μ μλ€.
λΆ μμ±μμμλ this
ν€μλλ₯Ό μ¬μ©ν΄ μ£Ό μμ±μλ₯Ό νΈμΆνλλ‘ νλ€.
class Car(val name: String, var position: Int) {
constructor(name: String) : this(name, 0)
}
νμ§λ§ μ΄ κ²½μ°λ³΄λ€λ default
ν€μλλ₯Ό μ¬μ©νμ¬ λ§€κ°λ³μμ κΈ°λ³Έκ°μ μ¬μ©νμ.
μ£Ό μμ±μ νΈμΆ μμ
constructor(carNUm : Int) : this(ArryaList()) {
createList(carName)
}
μμ κ°μ΄ λΆ μμ±μμμ μ£Ό μμ±μλ₯Ό νΈμΆν λ createList()
κ° μ€νλλ μμλ λ€μκ³Ό κ°λ€.
public Cars(int carNUm) {
this(new ArrayList())
this.createList(carNum)
}
require(), check() - 쑰건 νμΈ ν¨μ
-
require() : μμ΄ μ°Έμ΄ μλ κ²½μ°
IllegalArgumentException
λ°μ -
check() : μμ΄ μ°Έμ΄ μλ κ²½μ°
IllegalStateException
λ°μμ μμ μ²λΌ
{}
λΈλ‘μ μμΈ λ©μμ§λ₯Ό μμ±ν μλ μλ€.
setterλ§ privateμΌλ‘ - κ°μμ± λ³κ²½μ
μλ°λ₯Ό μκ°νλ©΄ νλλ₯Ό private
λ‘ λ§λ€κ³ , getterλ₯Ό ν΅ν΄ κ°μ κΊΌλ΄λλ‘ νμμ§λ§,
μ½νλ¦°μμλ νλλ₯Ό privateμΌλ‘ λ기보λ€λ setter ν¨μλ§ privateμΌλ‘ μ§μ νλ€.
class Car(val name: String) {
var position: Int = 0
private set
}
μλ°λ νλ κΈ°λ° μΈμ΄μΈλ° μ½νλ¦°μ νλ‘νΌν° κΈ°λ° μΈμ΄μ΄λ€.
νμ μ€λ€λ©΄ μ½νλ¦°μμ νλ‘νΌν°μ 무μΈκ° μ°μ°μ΄ λ€μ΄κ°λ€λ©΄ ν¨μλ₯Ό λ§λ€κ³ ,
κ° μμ²΄λ§ λ°ννλ€λ©΄ μμ κ°μ΄ μ°μ.
μμ
κΈ°λ³Έ μλ£νμ μμλ const val
ν€μλλ‘ νννλ€.
κΈ°λ³Έ μλ£ν μΈμλ const
ν€μλλ₯Ό μ¬μ©ν μ μλ€.
μμλ ν΄λμ€ μΈλΆμλ€κ°λ μ μΈν μ μλ€.
νμ§λ§ μ΄ κ²½μ° νμ₯μκ° νμΌλ‘ λ³κ²½λλ μ¬λ μ·¨ν₯κ» νλ©΄ λλ€.
companion object - λλ° κ°μ²΄
μ½νλ¦°μμλ static
ν€μλκ° μλλ°, μ΄ λμ μ¬μ©ν μ μλ κ²μ΄ companion object μ΄λ€.
μ΄λ κ°μ²΄μ΄λ©°, companion object
λ΄μ μ μΈλ μμ±κ³Ό ν¨μλ {ν΄λμ€ μ΄λ¦}.{νλ/ν¨μ μ΄λ¦}
ννλ‘ λ°λ‘ νΈμΆν μ μλ€.
ν΄λμ€μ 맨 νλ¨μ μμ±νλ€.
@JvmStatic
ompanion object
λ₯Ό μ¬μ©νμ¬ κ΅¬μ±ν μ½λλ₯Ό μλ°μμ μ¬μ©νλ €λ©΄ μμ± λ° ν¨μκ° μλ°μ νλ/λ©μλλ‘ ν΄μλλλ‘ μλ €μ£Όμ΄μΌ νλ€.
const
μ μΈμ΄ λμ΄ μλ νλ‘νΌν°λ λ³λμ μ²λ¦¬ μμ΄ μλ°μμλ μ¬μ© κ°λ₯νλ©°,
ν¨μλ @JvmStatic
μ΄λ
Έν
μ΄μ
μ μ¬μ©νμ¬ μλ°μμ μ μ λ©μλλ‘ μ¬μ©ν μ μκ² νλ€.
@JvmField
const
ν€μλλ κΈ°λ³Έ μλ£νμλ§ μ¬μ©μ΄ κ°λ₯νλ€.
μ΄μΈμ νμ
κ°μ²΄λ₯Ό μλ°μμ μ μ νλμ²λΌ μ¬μ©νλ €λ©΄ @JvmField
μ΄λ
Έν
μ΄μ
μ μ¬μ©ν΄μΌ νλ€.
Utility ν΄λμ€
μλ°μμλ λͺ¨λ λ©μλλ₯Ό ν΄λμ€ λ΄λΆμ μμ±ν΄μΌνμ§λ§, μ½νλ¦°μμλ κ·Έλ΄ νμκ° μλ€.
νμν μ νΈλ¦¬ν° λ©μλλ§ λͺ¨μλμ νμΌλ§μ λ§λ€κ³ μ΄λ₯Ό νμΌ μ΅μμμ μμΉμν€λ©΄ λλ€.
μ€λ§νΈ μΊμ€νΈ
μ½νλ¦°μμλ μ»΄νμΌλ¬κ° λμ μΊμ€ν
μ ν΄μ€λ€.
μνλ νμ
μ κ²μ¬νκ³ λλ©΄, κ°λ°μκ° λ³μλ₯Ό μνλ νμ
μΌλ‘ μΊμ€ν
νμ§ μμλ ν΄λΉ λ³μκ° μνλ νμ
μΌλ‘ μ μΈλ κ²μ²λΌ μ¬μ©ν μ μλ€.
μ΄λ μ»΄νμΌλ¬κ° μΊμ€ν
μ μνν΄μ£Όμ΄ κ°λ₯ν μΌμ΄λ€.
fun calculate(text: String?): Int {
if (text.isNullOrBlank()) {
throw IllegalArgumentException()
}
val tokens = text.split(" ")
// ...
}
μ½λ 리뷰 μ€ μ§€λ§ν λ°°μ
maxBy{}
fun findMaxPosition(): Int {
return cars.maxBy { it.position }!!.position
}
κ°μ₯ ν° μμλ₯Ό μ°ΎκΈ° μν΄ λΉκ΅μ μ¬μ©ν κ°μ μΈμλ‘ λ°λλ€.
λͺ¨λ 컬λ μ
μ λν΄ maxBy ν¨μλ₯Ό νΈμΆν μ μλ€.
{ it.position }
λ λΉκ΅μ μ¬μ©ν κ°μ λλ €μ£Όλ ν¨μμ΄λ€.
maxBy{}
μ λ°ν κ°μ nullableμΈλ°, λ°νλ κ°μ νλ‘νΌν°λ₯Ό μ¬μ©νκ³ μΆμ κ²½μ° !!
ν€μλλ₯Ό ν΅ν΄ nullμ΄ μλμ μ μΈνμ¬ κΊΌλΈλ€.
μ°Έκ³
?:
(μλΉμ€ μ€νΌλ μ΄ν° ) : nullμΈ κ²½μ° μ€μ ν default κ°μ λ£λλ€.
Pair
Kotlinμμ μ 곡νλ κ°μ²΄ νμ μ€ μ°κ΄ νμ λΌλ¦¬ κ΄κ³κ° μμ΄λ 2κ°λ₯Ό μμΌλ‘ κ°μ§κ³ μλ κ°μ²΄
getterλ .first .second λλ .component1() / .component2()λ‘ μ κ·Όν μ μλ€.
RacingCar μΌλΆ
fun race(moveStrategy: MoveStrategy): Pair<List<Cars>, List<Car>> {
val carsGroup = arrayListOf<Cars>()
for (i in 0 until tryNumber) {
this.cars = this.cars.moveAll(moveStrategy)
carsGroup.add(this.cars)
}
return Pair(carsGroup, findWinners())
}
private fun findWinners(): List<Car> {
val maxPosition = cars.findMaxPosition()
return cars.findCarsBySamePosition(maxPosition)
}
==κ³Ό ===
-
==
μ°μ°μλ μλ°μ equalμ κ°λ€. -
===
μ°μ°μλ μλ°μ==
μ κ°λ€.
List, MutableList
μ½νλ¦°μμλ μ½κΈ° μ μ© λ¦¬μ€νΈ(List)μ μμ ν μ μλ 리μ€νΈ(MutableList)κ° μλ€.
arrayListOf()
λ₯Ό μ°κΈ°λ³΄λ€λ μ½νλ¦°μ΄ μ 곡νλ List λλ MutableListλ₯Ό μ¬μ©νμ
List
λ°μ΄ν°λ₯Ό μ½κΈ°λ§ κ°λ₯νκ³ λ¦¬μ€νΈλ₯Ό μ μΈν λ λ£μ λ°μ΄ν°λ€μ μμ , μμ , λ³κ²½ν μ μλ€.
var cars = listOf(Car("ama"), Car("mazzi"))
println(cars[0]) // O
cars.add(Car("new")) // X μ»΄νμΌμλ¬
cars.remove(1) // X μ»΄νμΌμλ¬
MutableList
κΈ°μ‘΄ μλ°μμ μ¬μ©νλ ArrayListμ μ μ¬νλ―λ‘ ArrayListμ ν¨μλ€μ λͺ¨λ μ¬μ©ν μ μλ€.
var carsMutable = mutableListOf<Car>()
carsMutable.add(Car("ama")) // O
carsMutable.add(Car("mazzi")) // O
carsMutable.remove(0) // O
println(carsMutable[0]) // O
Listμ MutalbeList μλ‘μ νμ μΌλ‘ λ³κ²½λ κ°λ₯νλ€. μ΄ λ μλ‘ μλ‘μ΄ λ¦¬μ€νΈλ₯Ό λ°ννλ€.
var carsMutable = mutableListOf<Car>()
carsMutable.add(Car("ama"))
carsMutable.add(Car("mazzi"))
var arrNotMutable = carsMutable.toList() //mutable -> list λ³κ²½
var arrReMutable = arrNotMutable.toMutableList() // list -> mutable λ³κ²½
arrReMutable.add(Car("new"))
println(arrReMutable)
assertThrows
μλ°μ²λΌ assertThatThrownBy
λ₯Ό μ°μ§ λ§κ³ μλμ κ°μ΄ μ°μ.
μ΄μ λ assertThatThrownBy
λ₯Ό μ¬μ©ν κ²½μ° isInstanceOf()
λ₯Ό μ¬μ©νλλ° μ¬κΈ°μλ .java.class
λ₯Ό λΆμ¬μ£Όμ΄μΌ ν΄ μ½νλ¦° μ€λ½μ§ λͺ»νκΈ° λλ¬Έμ΄λ€.
<IllegalArgumentException> {Car(name = input)}
object
ν΄λμ€λ₯Ό λ§λ¦κ³Ό λμμ μΈμ€ν΄μ€λ‘ λ§λ λ€. (μ±κΈν΄)
λλ€ μμ±
μ½νλ¦°μ λλ€μμ μμ±ν λ {}
λ‘ νννλ€.
λλ€μ μΈμκ° νλλΌλ©΄ λλ€μ λ΄λΆμμ it
μΌλ‘ λ°μ μ μλ€.
ν¨μμ μΈμλ‘ λλ€κ° λμ΄μ¬ λ, 맨 λ§μ§λ§ μλ²μ΄λΌλ©΄ ()
λ°μ μΈ μ μλ€.
λ§μ½ λλ€ νλλ§ λ°λ κ±°λΌλ©΄ ()
λ₯Ό μλ΅ν μ μκ² μ£ ?
val newCars = cars.map { it.move(moveStrategy) }
associate{}
mapμ κΈ°λ³Έμ μΌλ‘ λ°ννλ€.
Inputμ μ¬κ·μ μΌλ‘
tailrec fun inputCarNames(): List<String> {
println("κ²½μ£Όν μλμ°¨ μ΄λ¦μ μ
λ ₯νμΈμ(μ΄λ¦μ μΌν(,)λ₯Ό κΈ°μ€μΌλ‘ ꡬλΆ).")
return readLine()?.replace(" ", "")?.split(",") ?: inputCarNames()
}
tailrec fun inputTryNumber(): Int {
println("μλν νμλ λͺ νμΈκ°μ?")
return readLine()?.toIntOrNull() ?: inputTryNumber()
}
tailrec
: 꼬리μ¬κ·(tail recursive)λΌλ μλ―Έλ‘, μΆκ°μ μΈ μ°μ°μ΄ μμ΄ μμ μ€μ€λ‘ μ¬κ·μ μΌλ‘ νΈμΆνλ€κ° μ΄λ€ κ°μ 리ν΄νλ ν¨μ- ν΄λΉ ν€μλλ₯Ό λΆμ΄λ©΄ μ¬κ·μ μΈ ν¨μ νΈμΆμ μ΅μ νκ°(?) μΌμ΄λ¨
μ€μ ν¨μ (to ν€μλ)
- μ€μ ννλ² : λ³μμ λ³μμ¬μ΄μ ν¨μλ₯Ό λ£μ΄ μ°μ°μ μ²λΌ μ¬μ©νλ κ²
쑰건
- λ©€λ² λ©μλ λλ νμ₯ ν¨μμ¬μΌ ν¨
- νλμ 맀κ°λ³μλ₯Ό κ°μ ΈμΌν¨
- infix ν€μλλ₯Ό μ¬μ©νμ¬ μ μ
ex) Pair κ°μ²΄λ₯Ό μμ±ν λ to
by ν€μλ
μ μ½λμμ Carμ μΌκΈ 컬λ μ
μΈ Carsλ₯Ό μνν λ νμ¬λ List<Car>
μ μ κ·Όνμ¬ μννκ³ μλ€.
νμ§λ§ μ½νλ¦°μμλ λ€μκ³Ό κ°μ΄ λ³κ²½ν μ μλ€.
μμ κ°μ΄ cars μΌκΈ 컬λ μ
μ λ°λ‘ μνν μ μλ μ΄μ λ Carsκ° λ€μκ³Ό κ°μ΄ List<Car>
μΈν°νμ΄μ€λ₯Ό ꡬννκ³ μκΈ° λλ¬Έμ΄λ€.
λμΌ μμ μ κΈ°ν΄β¦.
μ μ΄μ¨μ΄ μΌλ¨ μ§κΈμ βμ λμΌβ μ΄μ λκΉμ§λ§ μμλμ΄λ λλ€κ³ νμλ€.
μ½νλ¦° 짱