변수의 스코프를 최소화시켜야 하는 이유
책에서는 변수의 스코프를 최소화하라고 합니다.
예시를 봐봅시다.
fun main(){
val a = 1
val b = 2
val c = 3
fun fizz() {
println(a+b)
}
fun buzz() {
println(a+c)
}
}
이예시에서는 b와 c는 fizz와 buzz에서 밖에 쓰이지 않습니다. 그렇다면 b와 c를 fizz와 buzz안에 넣으면 어떻게 될까요?
fun main(){
val a = 1
fun fizz() {
val b = 2
println(a+b)
}
fun buzz() {
val c = 3
println(a+c)
}
}
이렇게 넣게 되면 b나 c라는 변수를 추적하거나 함수의 스코프 밖에서는 해당 변수를 사용할 수 없습니다. 이러한 부분은 메모리측면에서 보았을 때는 함수에서 매번 변수를 만들어 더 안 좋은 것이 아닌가라고 볼 수도 있겠지만 안정적인 서비스의 제공이나 유지보수 측면에서 보았을 때에는 안정성을 더 많이 보는 것 같습니다.
책에서는 이런 안정성으로 얻을 수 있는 장점을..
프로그램을 추적하고 관리하기 쉽다.
mutable 프로퍼티는 좁은 스코프에 걸쳐 있을수록, 그 변경을 추적하는 것이 쉽다.
변수의 범위가 넓으면, 다른 개발자에 의해서 변수가 잘못 사용될 수 있다.
변수는 읽기 전용 또는 읽고 쓰기 전용 여부와 상관없이, 변수를 정의할 때 초기화되는 것이 좋다.
if, when, try-catch, Elvis 표현식 등을 활용하면, 변수를 정의할 때 초기화할 수 있다.
이라고 표현합니다. 그렇다면 스코프를 줄일 수 있는 방법은 무엇이 있을까요?
변수의 스코프를 최소화시키는 방법
Collection의 값을 돌면서 해당 인덱스 값과 내용을 둘 다 쓰고 싶은 경우,
for ((i, user) in users.withIndex()) {
print("User at $i is $user")
}
이처럼 인덱스의 값과 해당 내용이 필요할 경우 withIndex 같은 함수를 사용하여 최대한 변수를 안에서 통제할 수 있도 만들어야 합니다.
변수에 따라 값을 다르게 설정해야 하는 경우,
val user: User = if(hasValue) {
getValue()
} else {
User()
}
이처럼 해야 하는 이유는 변수를 추적할 때 정의 된 부분만 보면 쉽게 추적을 할 수 있기 때문입니다.
여러 프로퍼티를 한꺼번에 정의해야 하는 경우,
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
}
}
위에서 말한대로 정의할 때 값을 넣어준다면 쉽게 추적을 할 수 있습니다.
//일반 변수 할당
val (var1, var2, var3) = listOf(value1, value2, value3)
//배열 구조 분해 할당
val (var1, var2, var3) = arrayOf(value1, value2, value3)
//객체 구조 분해 할당
val (var1, var2, var3) = mapOf("var1" to value1, "var2" to value2, "var3" to value3)
//함수의 반환 값으로부터 변수 할당
fun returnMultipleValues(): Triple<Type1, Type2, Type3> {
// ...
return Triple(value1, value2, value3)
}
val (var1, var2, var3) = returnMultipleValues()
그렇지만 이예시의 같이 조건이 필요 없는 경우 따로따로 값을 설정해 주는 것이 좋습니다.
'코틀린 > Effective Kotlin' 카테고리의 다른 글
[Effective Kotlin] 5. 안정성 - 예외를 활용해 코드에 제한을 걸어라 (0) | 2023.07.19 |
---|---|
[Effective Kotlin] 4. 안정성 - inferred 타입으로 리턴하지 말라 (0) | 2023.07.17 |
[Effective Kotlin] 3. 안정성 - 최대한 플랫폼 타입을 사용하지 말라 (0) | 2023.07.14 |
[Effective Kotlin] 1. 안전성 - 가변성을 제한하라 (0) | 2023.06.28 |
[Effectiv Kotlin] 책소개및 클린코드의 정의 (0) | 2023.06.12 |