enum
- enum์ soft keyword์ด๋ค. class์์ ์์ ๋๋ ํน๋ณํ ์๋ฏธ๋ฅผ ์ง๋์ง๋ง ๋ค๋ฅธ ๊ณณ์์๋ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์๋ค.
enum class Color (
val r: Int, val g: Int, val b: Int
) {
RED(255,0,0), ORANGE(255,165,0),YELLO(255,255,0), ...
VIOLET(238,130,238); // <- ๋ฐ๋์ ์ธ๋ฏธ์ฝ๋ก ์ ์ฌ์ฉํด์ผ ํ๋ค.
fun rgb() = (r * 256 + g) * 256 + b
}
when
- ์๋ฐ์ switch ๋ฌธ์ ํด๋นํ๋ ์ฝํ๋ฆฐ ์์
fun getMnmonic(color: Color) =
when (color) {
Color.RED -> "Richard"
Color.ORANGE -> "Of"
Color.YELLOW -> "York"
...
Color.VIOLET -> "Vain"
}
fun getWarmth(color: Color) = when(color) {
Color.RED, Color.ORANGE, Color.YELLOW -> "Warm"
Color.BLUE, Color.INDIGO, Color.VIOLET -> "Cold"
else -> "i don't know"
}
- ์ ์ฝ๋๋ฅผ ๋ ๊ฐ๋จํ๊ฒ?
fun getWarmth(color: Color) = when(color) {
RED, ORANGE, YELLOW -> "Warm"
BLUE, INDIGO, VIOLET -> "Cold"
else -> "i don't know"
}
- ํผํฉ ์กฐ๊ฑด์ผ๋ก ๋งค์นญ
fun mix(c1: Color, c2: Color) =
when (setOf(c1, c2)) {
setOf(RED, YELLOW) -> ORANGE
setOf(YELLOW, BLUE) -> GREEN
setOf(BLUE, VIOLET) -> INDIGO
else -> throw Exception("dirty color")
}
println(mix(BLUE, YELLOW)) // GREEN
- ์์ฒ๋ผ setOf๋ฅผ ์ฌ์ฉํ๋ฉด set์ธ์คํด์ค๋ฅผ ์์ฑํด์ ๊ฐ๋น์ง ๊ฐ์ฒด๊ฐ ๋์ด๋๋ค. ์ฝ๋์ ๊ฐ๋
์ฑ ๋ณด๋ค ์ฑ๋ฅ์ด ๋ ์ค์ํ ๋๋ ์๋ค.
// ๊ฐ๋
์ฑ์ ๋จ์ด์ง์ง๋ง ์ถ๊ฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ง ์๋ ์ฅ์ ์ด ์๋ค.
fun mixOptimized(c1: Color, c2: Color) =
when {
(c1 == RED && c2 == YELLOW) ||
(c1 == YELLOW && c2 == RED) -> ORANGE
(c1 == YELLOW && c2 == BLUE) ||
(c1 == BLUE && c2 == YELLOW) -> GREEN
(c1 == BLUE && c2 == VIOLET) ||
(c1 == VIOLET && c2 == BLUE) -> INDIGO
else -> throw Exception("dirty color")
}
- Kotlin 1.3 ๋ถํฐ ๊ฐ๋ฅ: When์ ๋์์ ๋ณ์์ ๋์
fun Request.getBody() =
when(val response = executeRequest()) {
is Success -> response.body
is HttpError -> throw HttpException(response.status)
}
Smart Cast: ํ์
๊ฒ์ฌ + ํ์
์บ์คํธ๋ฅผ ์กฐํฉ (is, as)
interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr
// println ( eval(Sum(Sum(Num(1), Num(2)), Num(4))) )
// -> 7
- ์๋ฐ ์คํ์ผ ๊ตฌํ (if ์ฌ์ฉ)
fun eval(e: Expr) : Int {
if (e is Num) {
val n = e as Num // ๋ถํ์ํ ์ฝ๋ (์ค๋งํธ ์บ์คํธ๋ก ์ด๋ฏธ Num์ผ๋ก ์บ์คํธ ๋จ)
return n.value
}
if (e is Sum) {
return eval(e.right) + eval(e.left) // ์ค๋งํธ ์บ์คํธ ๋จ
}
throw IllegalArgumentException("Unknown expression")
}
- ์ค๋งํธ ์บ์คํธ:
is
๋ฅผ ํตํด ํ์
์ฒดํฌ๋ฅผ ํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์ํ๋ ํ์
์ผ๋ก ์บ์คํธ ํด์ค๋ค.
is
๋ ์๋ฐ์ instanceof
์ ๋น์ทํ๋ค.
- ์ค๋งํธ ์บ์คํธ ์ํ๋ ๊ฒฝ์ฐ:
val
์ด ์๋๊ฑฐ๋ val
์ด์ง๋ง ์ปค์คํ
์ ๊ทผ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํด๋น ํ๋กํผํฐ์ ๋ํ ์ ๊ทผ์ด ํญ์ ๊ฐ์ ๊ฐ์ ๋ด๋๋๋ค๊ณ ํ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋งํธ ์บ์คํธ ํ์ง ์๋๋ค.
- ๋ช
์์ ํ์
์บ์คํ
as
- ์ฝํ๋ฆฐ ๋ฐฉ์์ผ๋ก ๊ตฌํ
fun eval(e: Expr) : Int =
if (e is Num) {
e.value // ์ค๋งํธ ์บ์คํธ ๋จ
} else if (e is Sum) {
eval(e.right) + eval(e.left) // ์ค๋งํธ ์บ์คํธ ๋จ
} else {
throw IllegalArgumentException("Unknown expression")
}
fun eval(e: Expr) : Int =
when (e) {
is Num -> e.value // ์ค๋งํธ ์บ์คํธ ๋จ
is Sum -> eval(e.right) + eval(e.left) // ์ค๋งํธ ์บ์คํธ ๋จ
else -> throw IllegalArgumentException("Unknown expression")
}
fun eval(e: Expr) : Int =
when (e) {
is Num -> {
println("num: ${e.value}")
e.value
}
is Sum -> {
val left = eval(e.left)
val right = eval(e.right)
println("sum: $left + $right")
left + right
}
else -> throw IllegalArgumentException("Unknown expression")
}