Hanbit the Developer
Effective Kotlin | 2μ₯. κ°λ μ± λ³Έλ¬Έ
π‘ μ»΄ν¨ν°κ° μΈμν μ μλ μ½λλ λ°λ³΄λΌλ μμ±ν μ μμ§λ§, μΈκ°μ΄ μ΄ν΄ν μ μλ μ½λλ μ€λ ₯ μλ νλ‘κ·Έλλ¨Έλ§ μμ±ν μ μλ€. - Martin Flowler, <Refactoring>
μμ΄ν 11: κ°λ μ±μ λͺ©νλ‘ μ€κ³νλΌ
μΈμ λΆν κ°μ
μΌλ°μ μΌλ‘ μμ£Ό μ¬μ©νλ ν¨ν΄μ νμ©ν κ²
κ·Ήλ¨μ μ΄κ² λμ§ μκΈ°
κ²½νμ΄ λ§μ μ½νλ¦° κ°λ°μλ§ μ½κ² μ΄ν΄ν μ μλ μ½λκ° μμΌλ©΄, μ λλ΄νκ²λ μ΄ν΄νκΈ° μ΄λ €μ΄ μ½λκ° λλ€. κ·ΈλΌμλ λΆκ΅¬νκ³ μ΄λ¬ν ‘λΉμ©’μ μ§λΆν λ§ν μ΄μ κ° μλ€λ©΄ νΈλ μ΄λ μ€νλ₯Ό μ§ννλ μ΅μ μ κ³ λ €ν μ μλ€.
컨벀μ
μμ΄ν 12: μ°μ°μ μ€λ²λ‘λλ₯Ό ν λλ μλ―Έμ λ§κ² μ¬μ©νλΌ
factorial() ν¨μλ₯Ό μ½κ² νννκΈ° μν΄ operator fun Int.not() = factorial()μ μμ±νμ¬ μ¬μ©νλ©΄ νΌλμ€λ½κ³ μ€ν΄μ μμ§κ° μλ€.
λΆλͺ νμ§ μμ κ²½μ°
μ¬λμ λ°λΌ ν΄μμ΄ κ°λ¦΄ μ μλ κ²½μ°μλ infix λλ ν±λ 벨 ν¨μλ₯Ό νμ©νμ¬ μλ―Έλ₯Ό λͺ ννκ² ν κ²
κ·μΉμ 무μν΄λ λλ κ²½μ°
HTML DSL λ± DSL(Domain Specific Language)λ₯Ό μ€κ³νλ κ²½μ°μλ κ·μΉμ 무μν΄λ λλ€.
μμ΄ν 13: Unit?μ 리ν΄νμ§ λ§λΌ
fun isCorrect(key: String): Unit? = // ...
isCorrect(key) ?: return
μμ κ°μ μμΌλ‘ μ½λλ₯Ό μ¬μ©ν μ μμΌλ μ΄ν΄νκΈ° μ΄λ ΅κ³ μ€ν΄μ μμ§κ° μλ€. λμ λ€μκ³Ό κ°μ΄ μ¬μ©νλΌ:
fun isCorrect(key: String): Boolean = // ...
isCorrect(key) ?: return
μμ΄ν 14: λ³μ νμ μ΄ λͺ ννμ§ μμ κ²½μ° νμ€νκ² μ§μ νλΌ
type inference(e.g. val num = 10)λ κ°λ° μκ°μ μ€μ¬μ£Όκ³ κ°λ μ±μ΄ ν₯μλλ€λ μ₯μ μ κ°κ³ μλ€.
νμ§λ§ μ½λ μ μ₯μμ λͺ ννμ§ μμ κ²½μ° νμ μ λͺ μν¨μΌλ‘μ¨ κ°λ μ±μ λμ¬, λ°ν νμ μ μκΈ° μν΄ ν΄λΉ ν¨μ μ μ νμΌμ μ¬λ λ±μ μκ° λλΉλ₯Ό μ€μΌ μ μλ€. λν μμ μ±λ λμμ§λ€.
// val data = getSomeData()
val data: UserData = getSomeData()
μμ΄ν 15: 리μλ²λ₯Ό λͺ μμ μΌλ‘ μ°Έμ‘°νλΌ
μ¬λ¬ κ°μ 리μλ²
μ€μ½ν λ΄λΆμ λ μ΄μμ 리μλ²κ° μλ κ²½μ° λͺ μνλ κ²μ΄ μ’λ€.
run λ΄λΆμμ this ν€μλκ° κ²ΉμΉλ€λ©΄ alsoλ₯Ό μ¬μ©νκ±°λ this@Nodeμ κ°μ΄ λ μ΄λΈμ μ§μ νλ€.
*λ μ΄λΈ μμ΄ λ¦¬μλ²λ₯Ό μ¬μ©νλ©΄ κ°μ₯ κ°κΉμ΄ 리μλ²λ₯Ό μλ―Ένλ€.
DSL λ§μ»€
μμ΄ν 16: νλ‘νΌν°λ λμμ΄ μλλΌ μνλ₯Ό λνλ΄μΌ νλ€
getter λ±μ μ΄μ©ν΄ ν¨μμ²λΌ μλνλ νλ‘νΌν°λ₯Ό λ§λ€μ§ λ§ κ²
νλ‘νΌν° λμ ν¨μλ₯Ό μ¬μ©νλ κ²μ΄ μ’μ κ²½μ°λ λ€μκ³Ό κ°λ€:
- μ°μ° λΉμ©μ΄ λμ κ²½μ°
- λΉμ¦λμ€ λ‘μ§μ ν¬ν¨νλ κ²½μ°
- κ²°μ μ μ΄μ§ μμ κ²½μ°: κ°μ λμμ μ°μμΌλ‘ λ λ² νλλ° λ€λ₯Έ κ°μ΄ λμ€λ κ²½μ°
- λ³νμ κ²½μ°
- getterμμ νλ‘νΌν°μ μν λ³κ²½μ΄ μΌμ΄λμΌ νλ κ²½μ°
μμ΄ν 17: μ΄λ¦ μλ μκ·λ¨ΌνΈλ₯Ό μ¬μ©νλΌ
val text = (1..10).joinToString("|") // X
val text = (1..10).joinToString(separator = "|") // O
val separator = "|"
val text = (1..10).joinToString(separator) // O
μ΄λ¦ μλ μκ·λ¨ΌνΈλ μΈμ μ¬μ©ν΄μΌ ν κΉ?
- sleep(100) → sleep(tileMillis = 100): msμΈμ§ sμΈμ§ λͺ ννμ§ μμλλ° μ΄λ₯Ό κ°μ
- default argumentλ₯Ό κ°μ§ κ²½μ°(default argument e.g. fun add(isStable: Boolean = true))
- κ°μ νμ μ νλΌλ―Έν°κ° λ§μ κ²½μ°
- ν¨μ νμ μ νλΌλ―Έν°κ° μλ κ²½μ°(λ§μ§λ§ κ²½μ° μ μΈ)
μμ΄ν 18: μ½λ© 컨벀μ μ μ§μΌλΌ
μ₯μ μ λ€μκ³Ό κ°λ€:
- μ΄λ€ νλ‘μ νΈλ₯Ό μ ν΄λ μ½κ² μ΄ν΄ν μ μλ€.
- μΈλΆ κ°λ°μλ μ½κ² μ΄ν΄ν μ μλ€.
- μ½λλ₯Ό λ³ν©νκ±°λ μ΄λνλ κ²μ΄ μ½λ€.
λμμ΄ λλ λꡬ:
- IntelliJ Formatter
- ktlink
'Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Effective Kotlin | 4μ₯. μΆμν μ€κ³ (0) | 2023.06.18 |
---|---|
Effective Kotlin | 3μ₯. μ¬μ¬μ©μ± (0) | 2023.06.13 |
Effective Kotlin | 1μ₯. μμ μ± (0) | 2023.06.13 |
Kotlin Documentation | Serialization (0) | 2023.05.26 |
Kotlin Documentation | Shared mutable state and concurrency (0) | 2023.05.26 |