상태를 정의할 때는 변수와 프로퍼티의 소코프를 최소화하는 것이 좋음
프로퍼티보다는 지역 변수 사용
최대한 좁은 스코프를 갖게 되는 변수 사용
요소의 스코프라는 것은 요소를 볼 수 있는 컴퓨터 프로그램 영역
코틀린의 스코프는 기본적으로 중괄호로 만들어지며,
내부 스코프에서 외부 스코프에 있는 요소에만 접근할 수 있음
EX )
val users =listOf<User>()var user: User// 외부/내부 모두 사용할 수 있는 변수 사용for (i in users.indices) { user = users[i]println("User at $i is $user")}// user 스코프를 내부로 제한for (i in users.indices) {val user = users[i]println("User at $i is $user")}for ((i, user) in users.withIndex()){println("User at $i is $user")}
스코프를 좁게 만드는 것이 좋은 가장 큰 이유는 프로그램을 추적하고 관리하기 쉽기 때문임
ㄴ스코프 범위가 너무 넓으면 다른 개발자에 의해 변수가 잘못 사용될 수 있음
추가로 변수 정의시에도 초기화하는 것이 좋은데 코틀린은 if, when, try-catch, Elvis 표현식 등을 활용하면 최대한 변수를 정의할때 초기할 수 있음
// badval user: Userif (hasValue) { user =getValue()} else { user =User()}// goodval user: User=if (hasValue) {getValue()} else {User()}// 구조분해 선언// badfunupdateWeather(degrees: Int) {val description: Stringval color: Stringif (degrees <5) { description ="cold" color ="BLUE" } elseif (degrees <23) { description ="mild" color ="YELLOW" } else { description ="hot" color ="RED" }}// goodfunupdateWeather(degrees: Int) {val (description, color) =when { degrees <5->"color" to "BLUE" degrees <23->"mild" to "YELLOW"else->"hot" to "RED" }}
넓은 스코프 범위의 문제 : 캡처링
에라토스테네스의 체 (소수를 구현하느 알고리즘)를 통해 캡처링 이슈 파악
2부터 시작하는 숫자 리스트 만듬
첫번째 요소를 선택
남아 있는 숫자 중에서 2번에서 선택한 소수로 나눌 수 있는 모든 숫자를 제거