2.1.3 변수
- 기본적으로 모든 변수를 val 키워드를 사용해 불변 변수로 선언할 것,
나중에 꼭 필요할 때만 var로 변경 - 초기화 식을 사용하지 않고 변수를 선언하려면 변수 타입을 명시
val answer: Int
answer = 42
3. val 참조 객체는 불변일지라도 그 참조가 가르키는 객체의 내부 값은 변경될 수 있음
val languages = arrayListOf("Java")
languages.add("Kotlin")
2.2.2 커스텀 접근자
1. 프로퍼티 게터 선언을 통해 클라이언트가 프로퍼티에 접근할 때마다
게터가 프로퍼티 값을 매번 다시 계산
fun main(args: Array<String>) {
val rect = Rectangle(3,3)
val rect2 = Rectangle(3,5)
println(rect.isSquare)
println(rect2.isSquare)
}
class Rectangle(val height: Int, val width: Int) {
val isSquare: Boolean
get() {
return height == width
}
}
2.3.2 when으로 enum 클래스 다루기
1. 한 분기 안에서 여러 값을 매치 패턴으로 사용 가능 (콤마로 분리)
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE
}
fun main(args: Array<String>) {
val color = Color.ORANGE
println(getWarmth(color))
}
fun getWarmth(color: Color) = when (color) {
Color.RED, Color.ORANGE, Color.YELLOW -> "warm"
Color.GREEN -> "neutral"
Color.BLUE -> "cold"
}
2. 다른 패키지에서 정의한 enum 클래스 수식자 없이 사용
import colors.Color
import colors.Color.* // enum 상수를 모두 import
fun main(args: Array<String>) {
val color = ORANGE
println(getWarmth(color))
}
fun getWarmth(color: Color) = when (color) {
RED, ORANGE, YELLOW -> "warm"
GREEN -> "neutral"
BLUE -> "cold"
}
3. when의 분기 조건에 여러 다른 객체를 사용 가능
- setOf는 인자로 받은 원소를 포함하여 집합인 Set 객체로 만드는 함수
- setOf(c1, c2)와 setOf(YELLOW, BLUE)가 같다는 말은
c1이 YELLOW이고 c2가 BLUE이거나, c1이 BLUE이고 c2가 YELLOW라는 의미
fun main(args: Array<String>) {
println(mix(BLUE, YELLOW))
}
fun mix(c1: Color, c2: Color) =
when (setOf(c1, c2)) {
setOf(RED, YELLOW) -> ORANGE
setOf(YELLOW, BLUE) -> GREEN
else -> throw Exception("Dirty Color")
}
728x90
2.3.4 인자 없는 when 사용
1. 불필요한 객체 생성 방지
- when에 인자가 없으려면 각 분기의 조건이 Bollean 결과를 계산하는 식이어야 함
- 위 코드에서는 여러 Set 인스턴스를 생성하게 됨, 함수가 자주 호출된다면
불필요한 가비지 객체가 늘어나게 되므로 이를 방지하기 위해 인자가 없는
when을 사용할 수 있음 - 가독성이 떨어짐
fun main(args: Array<String>) {
println(mix(BLUE, YELLOW))
}
fun mix(c1: Color, c2: Color) =
when {
(c1 == YELLOW && c2 == RED) || (c1 == RED && c2 == YELLOW) -> ORANGE
(c1 == YELLOW && c2 == BLUE) || (c1 == BLUE && c2 == YELLOW) -> GREEN
else -> throw Exception("Dirty color")
}
2.3.5 스마트 캐스트: 타입 검사와 타입 캐스트를 조합
- is를 통해 변수의 타입을 검사하면 굳이 변수를 원하는 타입으로 캐스팅하지 않아도
컴파일러가 캐스팅을 수행함
interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr
fun eval(e: Expr): Int {
if (e is Num) {
val n = e as Num // 불필요
return n.value
}
if (e is Sum) {
return eval(e.right) + eval(e.left)
}
throw IllegalArgumentException("Unknown expression")
}
- if (a > b) a else b 는 자바의 a > b ? a : b처럼 작동
- eval 함수에서 return문과 중괄호문을 없애고 if식을 본문으로 사용해
간단하게 만들 수 있음
- eval 함수에서 return문과 중괄호문을 없애고 if식을 본문으로 사용해
# if를 when으로 변경
fun eval(e: Expr) {
when (e) {
is Num ->
e.value
is Sum ->
eval(e.left) + eval(e.right)
else ->
throw IllegalArgumentException("Unknown expression")
}
}
2.4.3 맵에 대한 이터레이션
1. 원소의 현재 인덱스를 유지하면서 컬렉션을 이터레이션 가능
fun main(args: Array<String>) {
val list = arrayListOf("10","11","1001")
for ((index, element) in list.withIndex()) {
println("$index: $element")
}
}
2.4.4 in으로 컬렉션이나 범위의 원소 검사
- when식에서 in 또는 !in 연산자 사용 가능
fun recognize(c: Char) = when (c) {
in '0'..'9' -> "digit"
in 'A'..'Z', in 'a'..'z' -> "letter"
else -> "I don't know"
}
728x90
'Android > Kotlin' 카테고리의 다른 글
[코틀린 인 액션] 4장 정리 (0) | 2022.11.29 |
---|---|
[코틀린 인 액션] 3장 정리 (0) | 2022.11.28 |
[Kotlin] enum, sealed class (0) | 2022.09.27 |
[Kotlin] 고차 함수, 람다, Scope functions (0) | 2022.09.18 |
[Kotiln] Nested & inner class, Extension함수, Generics (0) | 2022.09.16 |