728x90
이펙티브 코루틴을 요약한 내용입니다.
- 상태를 정의할 때는 변수와 프로퍼티의 스코프를 최소화하는 것이 좋음
- 프로퍼티보다는 지역 변수를 사용하는 것이 좋음
- 최대한 좁은 스코프를 갖게 변수를 사용
- 반복문 내부에서 사용하는 변수의 경우 반복문 내부에 작성하는 것이 좋음
- 변수 스코프를 제한하는 예제
// 나쁜 예
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")
}
- 스코프를 좁게 만들 경우 프로그램을 추적하고 관리하기가 쉬워짐
- 스코프 범위가 너무 넓으면 다른 개발자에 의해 변수가 잘못 사용될 수 있음
- 변수는 읽기 전용 또는 읽고 쓰기 전용 여부와 상관없이, 변수를 정의할때 초기화하는 것이 좋음
// 나쁜 예
val user: User
if (hasValue) {
user = getValue()
} else {
user = User()
}
val user: User = if (hasValue) {
getValue()
} else {
User()
}
- 여러 프로퍼티를 한꺼번에 설정해야 하는 경우에는 구조분해 선언을 활용하는 것이 좋음
// 나쁜 예
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
}
}
캡처링
- 소수를 구하는 알고리즘 구현하기
- 2부터 시작하는 숫자 리스트를 만들기
- 첫 번째 요소를 선택
- 남아 있는 숫자 중에서 2번에서 선택한 소수로 나눌 수 있는 모든 숫자를 제거
var numbers = (2..100).toList() val primes = mutableListOf<Int>() while (numbers.isNotEmpty()) { val prime = numbers.first() primes.add(prime) numbers = numbers.filter { it % prime != 0 } } print(primes)
- 시퀀스를 활용하는 예제
val primes: Sequence<Int> = sequence {
var 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]
- 캡처링 문제
- prime 이라는 변수를 캡쳐 했기 때문에 문제 발생
val primes: Sequence<Int> = 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 } } } print(primes.take(10).toList()) [2, 3, 5, 6, 7, 8, 9, 10, 11, 12]
val primes: Sequence<Int> = 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 }
}
}
print(primes.take(10).toList())
[2, 3, 5, 6, 7, 8, 9, 10, 11, 12]
정리
- 변수의 스코프는 좁게 만들어서 활용하는 것이 좋음
- var 보다는 val을 사용하는 것이 좋음
- 람다에서 변수를 캡처한다는 것을 기억
728x90
'코틀린 스터디 > 이펙티브 코틀린' 카테고리의 다른 글
아이템6) 사용자 정의 오류보다는 표준 오류를 사용하라 (0) | 2024.02.16 |
---|---|
아이템5) 예외를 활용해 코드에 제한을 걸어라 (0) | 2024.02.14 |
아이템4) inferred 타입으로 리턴하지 말라 (0) | 2024.02.08 |
아이템3) 최대한 플랫폼 타입을 사용하지 말라 (0) | 2024.02.07 |
아이템1) 가변성을 제한하라 (1) | 2024.02.05 |