#1. ν¨μ νΈμΆ
fun <T> joinToString(
collection: Collection<T>,
separator: String,
prefix: String,
postfix: String
): String {
val result = StringBuilder(prefix)
for ((index, element) in collection.withIndex()) {
if (index > 0) result.append(separator)
result.append(element)
}
result.append(postfix)
return result.toString()
}
μ΄λ¦ λΆμΈ μΈμ
- μλ°
joinToString(collection, /* separator */ " ", /* prefix */ " ",
/* postfix */ ".");
- μ½νλ¦°
joinToString(collection, separator = " ", prefix = " ", postfix = ".")
ν¨μμ μ λ¬νλ μΈμ μ€ μΌλΆ(λλ μ λΆ)μ μ΄λ¦μ λͺ
μν μ μλ€.
νΈμΆ μ μΈμ μ€ μ΄λ νλλΌλ μ΄λ¦μ λͺ
μνκ³ λλ©΄ νΌλμ λ§κΈ° μν΄ κ·Έ λ€μ μ€λ λͺ¨λ μΈμλ μ΄λ¦μ κΌ λͺ
μν΄μΌ νλ€.
μλ°λ‘ μμ±ν μ½λλ₯Ό νΈμΆν λλ μ΄λ¦ λΆμΈ μΈμλ₯Ό μ¬μ©ν μ μλ€.
(μ½νλ¦°μ JDK 6μ νΈνλλ€.)
λν΄νΈ νλΌλ―Έν° κ°
μ½νλ¦°μμλ ν¨μ μ μΈμμ νλΌλ―Έν°μ λν΄νΈ κ°μ μ§μ ν μ μμΌλ―λ‘, μ€λ²λ‘λλ₯Ό μ€μΌ μ μλ€.
fun <T> joinToString(
collection: Collection<T>,
separator: String = ", ",
prefix: String = "",
postfix: String = ""
): Strin
μ½νλ¦° ν¨μλ₯Ό μλ°μμ νΈμΆνλ κ²½μ°μλ κ·Έ μ½νλ¦° ν¨μκ° λν΄νΈ νλΌλ―Έν° κ°μ μ 곡νλλΌλ λͺ¨λ μΈμλ₯Ό λͺ μν΄μΌ νλ€. @JvmOverloadsλ₯Ό ν¨μμ μΆκ°νλ©΄ μ½νλ¦° μ»΄νμΌλ¬κ° μλμΌλ‘ 맨 λ§μ§λ§ νλΌλ―Έν°λ‘λΆν° νλΌλ―Έν°λ₯Ό νλμ© μλ΅ν μ€λ²λ‘λ©ν μλ° λ©μλλ₯Ό μΆκ°ν΄μ€λ€.
μ΅μμ ν¨μ
ν¨μλ₯Ό μ§μ μμ€ νμΌμ μ΅μμ μμ€, ν΄λμ€ λ°μ μμΉμν¬ μ μλ€.
JVMμ΄ ν΄λμ€ μμ λ€μ΄μλ μ½λλ§μ μ€νν μ μκΈ° λλ¬Έμ, μ»΄νμΌν λ μλ‘μ΄ ν΄λμ€λ₯Ό μ μν΄μ€λ€.
package strings;
public class JoinKt { //join.kt -> μ½νλ¦° μμ€ νμΌ μ΄λ¦κ³Ό μλ° ν΄λμ€ μ΄λ¦μ΄ λμλλ€.
public static String joinToString(...) { ... }
}
@file:JvmName("StringFunctions"): ν΄λμ€ μ΄λ¦μ μ§μ νλ μ λ Έν μ΄μ
μ΅μμ νλ‘νΌν°
νλ‘νΌν°λ μ΅μμ μμ€μ λμ μ μλ€.
-> μ μ νλμ μ μ₯λλ€.
var opCount = 0
fun performOperation() {
opCount++
// ...
}
fun reportOperationCount() {
println("Operation performed $opCount times")
}
μ΅μμ νλ‘νΌν°λ₯Ό νμ©ν΄ μ½λμ μμλ₯Ό μΆκ°ν μ μλ€.
val UNIX_LINE_SEPARATOR = "\n"
μ΅μμ νλ‘νΌν°λ λ€λ₯Έ νλ‘νΌν°μ²λΌ μ κ·Όμ λ©μλλ₯Ό ν΅ν΄ μλ° μ½λμ λ
ΈμΆλλ€.
const λ³κ²½μλ₯Ό μΆκ°νλ©΄ νλ‘νΌν°λ₯Ό public static final νλλ‘ μ»΄νμΌνκ² λ§λ€ μ μλ€.
(primitive νμ
κ³Ό String νμ
λ§ constλ‘ μ§μ ν μ μλ€.)
#2. νμ₯ ν¨μμ νμ₯ νλ‘νΌν°
νμ₯ ν¨μ
νμ₯ ν¨μλ μ΄λ€ ν΄λμ€μ λ©€λ² λ©μλμΈ κ²μ²λΌ νΈμΆν μ μμ§λ§, κ·Έ ν΄λμ€μ λ°μ μ μΈλ ν¨μλ€.
- μμ κ°μ²΄ νμ (receiver type): ν΄λμ€ μ΄λ¦
- μμ κ°μ²΄(receiver object): νμ₯ ν¨μκ° νΈμΆλλ λμμ΄ λλ κ°(κ°μ²΄)
νμ₯ ν¨μλ₯Ό μ¬μ©νκΈ° μν΄μλ importν΄μΌ νλ€.
import strings.lastChar
val c = "Kotlin".lastChar()
import strings.lastChar as last //as ν€μλλ₯Ό μ¬μ©νλ©΄ λ€λ₯Έ μ΄λ¦μΌλ‘ λΆλ₯Ό μ μλ€.
val c = "Kotlin".last()
μλ°μμ νμ₯ ν¨μ νΈμΆ λ΄λΆμ μΌλ‘ νμ₯ ν¨μλ μμ κ°μ²΄λ₯Ό 첫 λ²μ§Έ μΈμλ‘ λ°λ μ μ λ©μλμ΄λ€.
char c = StringUtilKt.lastChar("Java");
νμ₯ ν¨μλ μ€λ²λΌμ΄λν μ μλ€.
μμ κ°μ²΄λ‘ μ§μ ν λ³μμ μ μ νμ μ μν΄ μ΄λ€ νμ₯ ν¨μκ° νΈμΆλ μ§ κ²°μ λλ€.
- ν΄λμ€μ λ©€λ² ν¨μ μ€ νμ₯ ν¨μμ μ΄λ¦ λ° μκ·Έλμ²κ° κ°μ ν¨μκ° μλ€λ©΄, λ©€λ² ν¨μκ° νΈμΆλλ€.
- λ©€λ² ν¨μμ μ°μ μμκ° λ λλ€.
νμ₯ νλ‘νΌν°
val String.lastChar: Char
get() = get(length - 1)
λ·λ°μΉ¨νλ νλ(Backing field)κ° μμ΄μ κΈ°λ³Έ Getter ꡬνμ μ 곡ν μ μμΌλ―λ‘, μ΅μν Getterλ κΌ μ μν΄μΌ νλ€.
μ΄κΈ°ν μ½λμμ κ³μ°ν κ°μ λ΄μ μ₯μκ° μμΌλ―λ‘, μ΄κΈ°ν μ½λλ μΈ μ μλ€.
var StringBuilder.lastChar: Char
get() = get(length - 1)
set(value: Char) {
this.setCharAt(length - 1, value) //μ€μ λ‘ νμ₯ νλ‘νΌν°λ μ무 μνλ κ°μ§ μ μλ€.
}
#3. κ°λ³ μΈμ ν¨μ
vararg ν€μλ μ¬μ©
fun listOf<T>(vararg values: T): List<T> { ... }
μ½νλ¦°μμλ λ°°μ΄μ λͺ μμ μΌλ‘ νμ΄μ λ°°μ΄μ κ° μμκ° μΈμλ‘ μ λ¬λκ² ν΄μΌ νλ€.
fun main(args: Array<String>) {
val list = listOf("args: ", *args) //μ€νλ λ μ°μ°μ(*)λ₯Ό λΆμ΄λ©΄ λ°°μ΄μ λ΄μ©μ νΌμ³μ€λ€.
println(list)
}
#4. κ°μ μ
μ€μ νΈμΆ
μΈμκ° νλλΏμΈ λ©μλλ νμ₯ ν¨μμ μ€μ νΈμΆμ μ¬μ©ν μ μλ€.
μμ κ°μ²΄μ μ μΌν λ©μλ μΈμ μ¬μ΄μ λ©μλ μ΄λ¦μ λ£μ΄ νΈμΆνλ€.
infixλ₯Ό ν¨μ μ μΈ μμ λΆμ¬μ, μ€μ νΈμΆμ νμ©ν μ μλ€.
infix fun Any.to(other: Any) = Pair(this, other)
1.to("one") //μΌλ°μ μΈ λ°©μμ νΈμΆ
1 to "one" //μ€μ νΈμΆ
ꡬ쑰 λΆν΄ μ μΈ
val (number, name) = 1 to "one" //λ λ³μλ₯Ό μ¦μ μ΄κΈ°νν μ μλ€.
루νμμλ ꡬ쑰 λΆν΄ μ μΈμ νμ©ν μ μλ€.
for ((index, element) in collection.withIndex()) {
println("$index: $element")
}
#5. λ¬Έμμ΄
3μ€ λ°μ΄ν (""")
3μ€ λ°μ΄ν μμμλ μμ¬λμλ₯Ό ν¬ν¨ν μ΄λ€ λ¬Έμλ μ΄μ€μΌμ΄νν νμκ° μλ€.
μ€λ°κΏμ νννλ μ무 λ¬Έμμ΄μ΄λ κ·Έλλ‘ λ€μ΄κ°λ€.
#6. λ‘컬 ν¨μ
ν¨μμμ μΆμΆν ν¨μλ₯Ό μ ν¨μ λ΄λΆμ μ€μ²©μν¬ μ μλ€.
λ‘컬 ν¨μλ μμ μ΄ μν λ°κΉ₯ ν¨μμ λͺ¨λ νλΌλ―Έν°μ λ³μλ₯Ό μ¬μ©ν μ μλ€.
class User(val id: Int, val name: String, val address: String)
fun User.validateBeforeSave() {
fun validate(value: String, fieldName: String) {
if (value.isEmpty()) {
throw IllegalArgumentException(
"Can't save user $id: empty $fieldName")
}
}
validate(name, "Name")
validate(address, "Address")
}
fun saveUser(user: User) {
user.validateBeforeSave()
// Save user to the database
}
ν κ°μ²΄λ§μ λ€λ£¨λ©΄μ κ°μ²΄μ λΉκ³΅κ° λ°μ΄ν°λ₯Ό λ€λ£° νμλ μλ ν¨μλ νμ₯ ν¨μλ‘ λ§λ€λ©΄
'κ°μ²΄.λ©€λ²'μ²λΌ μμ κ°μ²΄λ₯Ό μ§μ νμ§ μκ³ λ 곡κ°λ λ©€λ² νλ‘νΌν°λ λ©μλμ μ κ·Όν μ μλ€.
'κ°λ° > Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Kotlin In Action] 5. λλ€λ‘ νλ‘κ·Έλλ° (1) | 2021.05.29 |
---|---|
[Kotlin In Action] 4. ν΄λμ€, κ°μ²΄, μΈν°νμ΄μ€ (0) | 2021.05.19 |
[Kotlin In Action] 2. μ½νλ¦° κΈ°μ΄ (0) | 2021.05.10 |
[Kotlin In Action] 1. μ½νλ¦°μ΄λ 무μμ΄λ©°, μ νμνκ°? (0) | 2021.05.09 |
Kotlin constructor μ 리 (0) | 2021.04.08 |