[이펙티브 코틀린] 1장 안정성 Item 2 변수의 스코프를 최소화하라

Sdoubleu·2023년 1월 2일
0

이펙코

목록 보기
2/7
post-thumbnail

상태를 정의할 때는 변수와 프로퍼티의 스코프를 최소화 하는 것이 좋음

  • 프로퍼티보다는 지역 변수를 사용하는 것이 좋음
  • 최대한 좁은 스코프를 갖게 변수를 사용
    - ex) 반복문 내부에 변수 작성

변수 스코프를 제한하는 예시

// 나쁜 예시
var user: User
for ( i in users.indices ) {
	user = users[i]
    print("User at $i is $user")
}
// 조금 더 좋은 예시
for ( i in users.indices ) {
	val user = users[i]
    print("User at $i is $user")
}
// 제일 좋은 예시
for ( (i, user) in users.withIndex()) {
	print("User at $i is $user")
}
  • 첫 번째 예시) 변수 user는 for 반복문 스코프 내부뿐만 아니라 외부에서도 사용 가능
  • 두 세번 째 예시) user의 스코프를 for 반복문 내부로 제한

스코프를 좁게 만드는 것이 좋은 이유

  • 프로그램을 추적하고 관리하기 쉽기 때문!!
    - 좁은 스코프에 걸쳐 있을수록, 변경 추적이 쉬움
    ↪ 추적이 돼야 코드를 이해하고 변경이 쉬움!

변수는 정의할 때 초기화되는 것이 좋음

if, when, try-catch, Elvis 표현식 등을 활용하면,
최대한 변수를 정의할 때 초기화 가능!

Elvis 표현식에 대한 정의

// 나쁜 예시
val user: User
if(hasValue) {
	user = getValue()
}	else {
	user =User()
}
// 조금 더 좋은 예시
val user: User = if(hasValue) {
	getValue()
} else {
	User()
}

여러 프로퍼티를 한 번에 설정해야 하는 경우에는 구조분해 선언(destructuring declaration)

🛠️ 구조분해 선언에 대해 추가 할 예정

// 나쁜 예시
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
    }
    //...
}

캡처링

🛠️ 시퀀스, 캡처링에 대해 조금 더 조사 필요


⭐정리

  1. 변수의 스코프는 좁게 만들어서 활용하는 것이 좋음
  2. var << val
  3. 람다에서 변수를 캡처한다는 것

🔗참고자료

profile
개발자희망자

0개의 댓글