언어/Kotlin

[EffectiveKotlin] 변수의 스코프를 최소화하라

원석💎-dev 2022. 3. 7. 21:50
반응형

kotlin은 스코프를 최소화 하는데 있어서 좀 더 진보한 방식을 사용한다.

 

1. if 문

// 나쁜 예
val user: User
if (hasValue) {
	user = getValue()
} else {
	user = User()
}

// 좋은 예
val user = if (hasValue) {
	getValue()
} else {
	User()
}

2. if-else 문

// 나쁜 예
fun updateWeather(degrees: Int) {
	val description: String
	val color: Int
    
	if (degrees < 5) {
		description = "cold"
		color = Color.BLUE
	} else if (degrees < 23) {
		description = "mild"
		color = Color.YELLOW
	} else {
		description = "hot"
		color = Color.RED
	}
}

// 좋은 예
fun updateWeather(degrees: Int) {
	val (description, color) = when {
		degrees < 5 -> "cold" to Color.BLUE
		degrees < 23 -> "mild" to Color.YELLOW
		else -> "hot" to Color.RED
	}
}

3. Collections

// 나쁜 예
val numbers = mutableListOf(1, 2, 3)
numbers.add(4)
numbers.add(5)

// 좋은 예
val numbers = mutableListOf(1, 2, 3).apply { 
	this.add(4)
	this.add(5)
}.toList()

apply를 사용해 list를 초기화하면, 불변 객체로 가변성을 제한 할 수 있는 장점 또한 추가된다.

4. 캡처링 (coroutine)

에라토스테네스의 체(소수를 구하는 알고리즘)

val primes = sequence {
    // it은 이전 원소
    val numbers = generateSequence(2) { it + 1 }
	
    while (true) {
    	val prime = numbers.first()
        yield(prime)
        numbers = numbers.drop(1)
        	.filter { it % prime != 0 }
    }
}

print(primes.take(10).toList())
// [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

위 문제를 좀 더 최적화하기 위해 아래와 같이 변경하는 경우가 있다.

var prime: Int
while (true) {
   prime = numbers.first()
   .
   .
}

print(prime.take(10).toList())
// [2, 3, 5, 6, 7, 8, 9, 10, 11, 12]

그런데, 이렇게 하면 실행결과가 제대로 나오지 않는다.

 

5. 결론

※ 좁은 스코프에 걸쳐 있을 수록, 그 변경을 추적하는 것이 쉽다.

 

반응형