Control Flow
자바와 유사하지만 또 다른 부분도 많다.
프로그래밍에서 흐름 제어만 잘해도 웬만한 문제는 해결할 수 있다고 생각한다.
if-else
var max = a
if(a < b) max = b
var max: Int
if(a > b){
max = a
}else{
max = b
}
자바와 거의 유사하다.
하지만 이를 식으로 표현할 수 있다. 이는 Kotlin에서만 가능하다.
val max = if(a > b) a else b
if식의 경우에는 반드시 else를 동반해야 에러가 발생하지 않는다.
branches들은 블록을 가질 수 있고 블록의 마지막 구문이 반환 값이 된다.
val max = if(a > b){
print("Choose a")
a
}else{
print("Choose b")
b
}
그리고 자바와는 달리 삼항 연산자는 없다.
when
when문은 switch문을 대체한다.
when(x){
1 -> pirnt("x == 1")
2 -> print("x == 2")
else -> {
print("x is neither 1 nor 2")
}
}
when문은 각각의 branches의 조건문이 만족할 때까지 위에서부터 순차적으로 인자를 비교한다.
따라서 break는 필요없다.
또한 when도 if처럼 식으로 사용할 수 있다.
var res = when(x){
100 -> "A"
90 ->"B"
80 -> "C"
else -> "F"
}
when이 식으로 사용되는 경우에는 if문과 같이 else가 필수이다.
하지만 boolean값은 생략이 가능하다.
또한, 여러 조건을 사용할 수도 있다.
when(x){
0, 1 -> print("x == 0 or x == 1")
else -> pirnt("otherwise")
}
또한 타입을 검사하면서 캐스팅도 할 수 있다.
fun hasPrefix(x: Any) = when(x) {
is String -> {
if(x.startsWith("pre")){
print("yes")
}else{
print("no")
}
}
else -> false
}
String임을 검사하는 동시에 캐스팅이 되어 startsWith함수를 사용할 수 있다.
for
for문은 iterator을 제공하는 모든 것을 반복할 수 있다.
fun forBasic(){
var collection = listOf(1, 2, 3, 4, 5)
collection.iterator()
for (item in collection){
println(item)
}
}
만약 iterator가 없다면 for문을 이용할 수 없다.
for문을 지원하는 itreator의 조건은 다음과 같다.
- 멤버 함수나 확장 함수 중에 iterator()를 반환하는 것이 있는 경우
- next()를 가지는 경우
- hasNext(): Boolean를 가지는 경우
- 위의 3 함수는 operator로 표기되어야 한다.
fun forBasic2(args: Array<String>){
val myData = MyData()
for (item in myData){
println(item)
}
}
class MyIterator{
val data = listOf(1, 2, 3, 4, 5)
var idx = 0
operator fun hasNext(): Boolean{
return data.size > idx
}
operator fun next(): Int {
return data[idx++]
}
}
class MyData{
operator fun iterator(): MyIterator{
return MyIterator()
}
}
MyData는 iterator를 반환하고 있다.
또한, 반환하는 iterator가 hasNext와 next를 가지고 있으므로 for문안에 들어갈 수 있다.
그렇기 때문에 상속관계로 엮이지 않더라도 for문을 사용할 수 있다.
index에는 indices라는 속성을 이용하여 접근할 수 있다.
fun indexPrint(){
val array = arrayOf("가", "나", "다")
for(i in array.indices){
println("$i: ${array[i]}")
}
}
fun UsingWithIndex(){
val array = arrayOf("가", "나", "다")
for((index, value) in array.withIndex()){
println("$index: ${value}")
}
}
while
while은 자바와 거의 동일하다.
do-while은 조금 다른데 do-while문에서 body의 지역변수를 참조할 수 있다.
do{
val y = retrieveData()
}while(y != null)