본문 바로가기
프로그래밍 놀이터/Kotlin, Coroutine

[Effective Kotlin] Item2 : Minimize the scope of variables

by 돼지왕 왕돼지 2022. 2. 16.
반응형

이 글은 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 를 항상 염두해 두어야 한다.

 

 

반응형

댓글