티스토리 뷰
코틀린 공식문서에 있는 Example들을 하나씩 읽어보며 정리하자.
참고: https://play.kotlinlang.org/byExample/overview
Control Flow
When
흔히 사용하는 switch 문 대신에 코틀린에서는 when 문을 제공한다.
when 문은 statement 와 expression 으로 사용할 수 있다.
When Statement
fun main() {
cases("Hello")
cases(1)
cases(0L)
cases(MyClass())
cases("hello")
}
fun cases(obj: Any) {
when (obj) { // 1
1 -> println("One") // 2
"Hello" -> println("Greeting") // 3
is Long -> println("Long") // 4
!is String -> println("Not a string") // 5
else -> println("Unknown") // 6
}
}
class MyClass
/*
Greeting
One
Long
Not a string
Unknown
*/
- when statement 이다.
- obj가 1과 같은지 검사한다.
- obj가 Hello와 같은지 검사한다.
- obj가 Long타입인지 검사한다.
- obj가 String타입이 아닌지 검사한다.
- 디폴트 상황일때 해당 구문이 실행된다.(생략 가능)
모든 분기는 조건 중에 하나를 만족할 때까지 순차적으로 실행된다. 따라서 가장 먼저 조건에 부합하는 분기만 실행될 것이다.
When Expression
fun main() {
println(whenAssign("Hello"))
println(whenAssign(3.4))
println(whenAssign(1))
println(whenAssign(MyClass()))
}
fun whenAssign(obj: Any): Any {
val result = when (obj) { // 1
1 -> "one" // 2
"Hello" -> 1 // 3
is Long -> false // 4
else -> 42 // 5
}
return result
}
class MyClass
/*
1
42
one
42
*/
- when expression 이다.
- obj가 1과 같으면 값에 "one"이 설정된다.
- obj가 Hello와 같으면 값에 1이 설정된다.
- obj가 Long타입의 인스턴스라면 값에 false가 설정된다.
- 앞에 있는 조건을 하나도 만족하지 못한 경우 값에 42가 설정된다. when statement 와 달리 when expression 에서는 디폴트 분기(else)가 대부분 있어야 한다. (컴파일러가 앞에 있는 케이스가 가능한 모든 케이스를 커버한다고 판단할 수 있는 경우를 제외하고는)
Loops
코틀린은 일반적으로 사용되는 모든 반복문을 지원한다.(for, while, do-while)
for
대부분의 언어의 for와 동일하게 작동한다.
val cakes = listOf("carrot", "cheese", "chocolate")
for (cake in cakes) { //1
println("Yummy, it's a $cake cake!")
}
for (i in cakes.indices) { //2
println("$i 번째는 ${cakes[i]}")
}
/*
Yummy, it's a carrot cake!
Yummy, it's a cheese cake!
Yummy, it's a chocolate cake!
0 번째는 carrot
1 번째는 cheese
2 번째는 chocolate
*/
- 리스트에 있는 케이크를 반복한다
- .indices를 사용하여 리스트 인덱스에 접근한다.
while and do-while
while 및 do-while 구문도 대부분의 언어와 유사하게 작동한다.
fun eatACake() = println("Eat a Cake")
fun bakeACake() = println("Bake a Cake")
fun main(args: Array<String>) {
var cakesEaten = 0
var cakesBaked = 0
while (cakesEaten < 5) { // 1
eatACake()
cakesEaten ++
}
do { // 2
bakeACake()
cakesBaked++
} while (cakesBaked < cakesEaten)
}
/*
Eat a Cake
Eat a Cake
Eat a Cake
Eat a Cake
Eat a Cake
Bake a Cake
Bake a Cake
Bake a Cake
Bake a Cake
Bake a Cake
*/
- 조건이 true인 동안 블럭을 실행한다.
- 블럭을 한 번 실행하고, 조건을 체크한다.
Iterator
내가 만든 클래스에 iterator 연산자를 구현하여 나만의 iterator을 정의할 수 있다.
class Animal(val name: String)
class Zoo(val animals: List<Animal>) {
operator fun iterator(): Iterator<Animal> { // 1
return animals.iterator() // 2
}
}
fun main() {
val zoo = Zoo(listOf(Animal("zebra"), Animal("lion")))
for (animal in zoo) { // 3
println("Watch out, it's a ${animal.name}")
}
}
/*
Watch out, it's a zebra
Watch out, it's a lion
*/
- 클래스에 iterator을 정의한다. 메소드 이름은 반드시 iterator 이여야하고 앞에 operator 라는 키워드를 붙여야한다.
- 다음 메서드 요구 사항을 만족하는 iterator를 반환한다.
- next() : Animal
- hasNext() : Boolean
- 사용자가 정의한 iterator를 사용하여 zoo의 animal을 반복한다.
iterator는 타입이나 확장함수로 선언될 수 있다.
Ranges
코틀린에는 범위(ranges)를 정의하기 위한 여러 방법이 있다.
for(i in 0..3) { // 1
print(i)
}
print(" ")
for(i in 0 until 3) { // 2
print(i)
}
print(" ")
for(i in 2..8 step 2) { // 3
print(i)
}
print(" ")
for (i in 3 downTo 0) { // 4
print(i)
}
print(" ")
/*
0123 012 2468 3210
*/
- 0 부터 3(포함)까지 1씩 증가하면서 반복
- 0 부터 3(제외)까지 1씩 증가하면서 반복
- 2 부터 8(포함)까지 2식 증가하면서 반복
- 3 부터 0까지 역순으로 반복
Char ranges 도 지원한다.
for (c in 'a'..'d') { // 1
print(c)
}
print(" ")
for (c in 'z' downTo 's' step 2) { // 2
print(c)
}
print(" ")
/*
abcd zxvt
*/
- 알파벳순으로 char 범위를 반복한다. ('d' 포함)
- char ranges도 'step'과 'downTo' 키워드를 지원한다.
ranges if 문에서도 유용하다.
val x = 2
if (x in 1..5) { // 1
print("x is in range from 1 to 5")
}
println()
if (x !in 6..10) { // 2
print("x is not in range from 6 to 10")
}
/*
x is in range from 1 to 5
x is not in range from 6 to 10
*/
- 값이 범위(1 부터 5)에 있는지 검사한다.
- !in은 in의 반대이다. (포함되지 않는지 검사한다.)
Equality Checks
코틀린은 구조 비교(값 비교) == 연산자를 사용하고 참조 비교를 위해 === 연산자를 사용한다.
더 정확하게, a == b 를 a == null ? b == null : a.equal(b) 로 컴파일한다.
(a가 null이면 b가 null인지에 따라 true 및 false 리턴, a가 null이 아니면 a.equals(b)의 결과 리턴)
val authors = setOf("Shakespeare", "Hemingway", "Twain")
val writers = setOf("Twain", "Shakespeare", "Hemingway")
println(authors == writers) // 1
println(authors === writers) // 2
/*
true
false
*/
- true 리턴, authors.equals(writers)를 호출하기 때문이다. set 은 컬렉션에 저장된 요소의 순서를 무시하기 때문에 구조적으로 같다고 판단한다.
- false 리턴, authors와 writers가 다른 참조값을 갖기 때문이다.
Conditional Expression
코틀린에는 삼항연사자 condition ? then : else 가 없다. 대신 if 가 expression 으로 사용된다.
fun max(a: Int, b: Int) = if (a > b) a else b // 1
println(max(99, -42))
/*
99
*/
- if는 expression으로 동작하고 값을 리턴한다.
'개발 > Kotlin' 카테고리의 다른 글
[Kotlin] - 코틀린 기초 (컬렉션) (0) | 2022.09.03 |
---|---|
[Kotlin] - 코틀린 기초 (특별 클래스) (0) | 2022.08.20 |
[Kotlin] - 코틀린 기초 (Hello World, 함수, 클래스) (0) | 2022.08.15 |
[Kotlin] - 코틀린 기초 (변수, 자료형, 연산자) (0) | 2022.08.14 |