반응형
이 글은 Effective Java 를 완독하고, Kotlin 을 상용으로 사용하는 개발자 입장에서
Effective Kotlin 글 중 새로운 내용, remind 할 필요 있는 부분, 핵심 내용 등만 추려 정리한 내용입니다.
#
member 변수 대신 local 변수로 정의하거나, 최대한 사용 블록 안으로 변수를 제한하는 등으로 scope 제한을 할 수 있다.
#
scope 를 제한할수록 프로그램을 이해하고 관리하기 쉽다.
#
val, var 상관없이, 변수는 정의될 때 init 되는 것이 좋다.
#
복수개의 property 를 정의할 때는 destructuring declaration 이 유용하다.
fun updateWeather(degrees: Int){
val desc: String
val color: Int
if (degrees < 5) {
desc = "cold"
color = Color.BLUE
} else {
desc = "hot"
color = Color.RED
}
}
// vs.
fun updateWeather(degrees: Int){
val (desc, color) = when{
degrees < 5 -> "cold" to Color.BLUE
else -> "hot" to Color.RED
}
}
Capturing
#
val primes: Sequence = sequence{
var numbers = generateSequence(2) { it + 1 }
while (true){
val prime = numbers.first()
yield(prime)
numbers = numbers.drop(1).filter { it % prime != 0 }
}
}
// 정상 동작
val primes: Sequence = sequence{
var numbers = generateSequence(2) { it + 1 }
var prime: Int
while (true){
prime = numbers.first()
yield(prime)
numbers = numbers.drop(1).filter { it % prime != 0 }
}
}
// numbers 가 lazy filter 가 되면서 prime 이 latest 값으로 계속 capturing 된다.
// 따라서 소수가 아닌 2, 3, 5, 6, 7, 8, 9, 10, 11, 12... 의 결과가 나온다.
Summary
#
var 보다는 val. 그리고 최대한 local 을 사용하는 등으로 scope 를 좁혀야 한다.
lambda 안에서 발생하는 변수 capture 를 항상 염두해 두어야 한다.
끝
반응형
'프로그래밍 놀이터 > Kotlin, Coroutine' 카테고리의 다른 글
[Effective Kotlin] Item 4 : Do not expose inferred types (0) | 2022.02.18 |
---|---|
[Effective Kotlin] Item 3 : Eliminate platform types as soon as possible (0) | 2022.02.17 |
[Effective Kotlin] Item1 : Limit mutability (0) | 2022.02.15 |
[coroutine] Back-pressure 대응하기 (0) | 2022.02.02 |
[coroutine] withContext vs async (0) | 2022.02.01 |
댓글