[Kotlin] 새차원의 코틀린 강좌(4)

새차원의 코틀린 강좌 - Control flow


자바와 달리 코틀린은 if, when 문에서 반환값이 있음


if else 문
  • Java와 거의 유사함
1
2
3
4
5
6
7
8
9
10
// 전통적인 방식
var max1 = a
if (a < b) max1 = b

var max2: Int
if (a > b) {
max2 = a
} else {
max2 = b
}
  • if 문이 식으로 사용되는 경우 값을 반환함
  • if 식의 경우 반드시 else 를 동반해야 함
1
val max = if (a > b) a else b


  • if 식의 branches 들이 블록을 가질 수 있음 {…}
  • 블록의 마지막 구문이 반환 값이 됨
1
2
3
4
5
6
7
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}


  • 삼항연산자가 없음 - if 문이 삼항연산자 역할을 잘 해내기 때문
1
2
3
4
5
// Java
int max = (a > b) ? a : b;

// Kotlin
val max = if (a > b) a else b


  • when문은 C계열 언어의 switch문을 대체
  • 각각의 branches의 조건문이 만족할 때 까지 위에서부터 순차적으로 인자를 비교
1
2
3
4
5
6
7
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> {
print("x is neither 1 nor 2")
}
}


  • when문이 식으로 사용된 경우에는 조건을 만족하는 branch의 값이 전체 식의 결과 값이 됨
  • else 의 경우 다른 branch들의 조건이 만족되지 않을 때 수행됨
  • when이 식으로 사용된 경우 else 문이 필수임
1
2
3
4
5
6
var res = when (x) {
100 -> "A"
90 -> "B"
80 -> "C"
else -> "F"
}


  • 컴파일러가 else문이 없어도 된다는 것을 입증할 수 없는 경우에는 else 생략 가능
1
2
3
4
var res = when (x) {
true -> "맞다"
false -> "틀리다"
}


  • 여러 조건들이 같은 방식으로 처리될 수 있는 경우, branch의 조건문에 콤마를 사용하여 표기하면 됨
1
2
3
4
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}


  • branch의 조건문에 함수나 식을 사용할 수 있음
1
2
3
4
5
when (x) {
parseInt(x) -> print("s encodes x")
1 + 3 -> print("4")
else -> print("s does not encode x")
}


  • range 나 collection 에 in이나 !in 으로 범위 등을 검사할 수 있음
1
2
3
4
5
6
7
val validNumbers = listOf(3, 6, 9)
when (x) {
in validNumbers -> print("x is valid")
in 1..10 -> print("x is in the range")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}


  • is나 !is를 이용하여 타입을 검사할 수 있음. 이 때 스마트 캐스트가 적용됨.
1
2
3
4
fun hasPrefix(x: Any) = when (x) {
is String -> x.startsWith("prefix")
else -> false
}


  • when은 if-else if 체인을 대체할 수 있음.
  • when에 인자를 입력하지 않으면, 논리 연산으로 처리됨
1
2
3
4
5
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}



for loops
  • for 문은 iterator를 제공하는 모든 것을 반복할 수 있음
1
2
for (item in collection)
print(item)


  • for 문의 body가 블록이 올 수도 있음
1
2
3
4
for (item in collection) {
print(item.id)
print(item.name)
}


  • for 문을 지원하는 iterator의 조건 : 멤버함수나 확장함수 중에서
    • iterator()를 반환하는 것이 있는 경우
    • next()를 가지는 경우
    • hasNext(): Boolean을 가지는 경우
  • 위의 세 함수들은 operator로 표기 되어야 함.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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()
}
}

val myData = MyData()
for (item in myData) {
print(item)
}

+ 상속 관계와 같은 객체지향 기법 없이 간단히 구현 가능.


  • 배열이나 리스트를 반복할 때, index를 이용하고 싶다면 indices를 이용하면 됨
1
2
3
4
val array = arrayOf("가","나","다")
for (i in array.indices) {
println("$i: ${array[i]}")
}


  • index를 이용하고 싶을 때, withIndex()를 이용할 수도 있음
1
2
3
4
val array = arrayOf("가","나","다")
for ((index, value) in array.withIndex()) {
println("$index: ${value}")
}



while loops
  • while, do-while문은 java와 거의 같음
  • do-while 문에서 body의 지역변수를 do-while 문의 조건문이 참조할 수 있음
1
2
3
4
5
6
7
while (x > 0) {
x--
}

do {
val y = retrieveData()
} while (y != null)


출처 : 새차원의 코틀린 강좌 https://www.inflearn.com/course/%EC%BD%94%ED%8B%80%EB%A6%B0-%EA%B0%95%EC%A2%8C-%EC%83%88%EC%B0%A8%EC%9B%90/

Share