굥뷰를 햡시댜
[Kotlin] Control Flow 본문
1. if else 문
- Java와 거의 유사함
- ex) 아래와 같이 사용하면 됩니다.
var max: Int
if(a>b) {
max = a
}
else {
max = b
}
2. if else 문
- if문이 식으로 사용되는 경우 값을 반환함
- if식의 경우 반드시 else를 동반해야 함
- ex) 아래 코드처럼 if문이 식으로 사용되는 경우 else를 반드시 동반해야 함(+ a, b는 반환되는 값)
val max = if(a>b) a else b
- if식의 branches들이 블록을 가질 수 있음 {...}
- 블록의 마지막 구문이 반환값이 됨
val max = if(a>b) {
print("Choose a")
a //반환값
}
else {
print("Choose b")
b //반환값
}
- 삼항연산자가 없음 -> if문이 삼항연산자 역할을 잘 해내기 때문에
- ex)
//Java
int max = (a>b) ? a : b;
//Kotlin
val max = if(a>b) a else b
3. when
- when문은 C계열 언어의 switch문을 대체합니다.
- when문은 각각의 branches의 조건문이 만족할 때 까지 위에서부터 순차적으로 인자를 비교합니다.
- ex)
when(x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> {
print("x is neither 1 nor 2")
}
}
- when문이 식으로 사용된 경우에는 조건을 만족하는 branch의 값이 전체 식의 결과 값이 됩니다.
- when이 식으로 사용된 경우 if문과 마찬가지로 else문이 필수로 사용됩니다.
- 하지만, when이 식으로 사용된 경우 컴파일러가 else문이 없어도 된다는 것을 입증할 수 있는 경우에는 else를 생략할 수 있습니다. -> (when의 조건에 boolean 값이 들어올 경우)
//when문을 식으로 사용 -> else 필수
var res = when(x) {
100 -> "A"
90 -> "B"
80 -> "C"
else -> "F"
}
//when문이 식으로 사용 -> else 생략
var res = when(x) {
true -> "맞다"
false -> "틀리다"
}
- 여러 조건들이 같은 방식으로 처리될 수 있는 경우, branch의 조건문에 콤마(,)를 사용하여 표기 가능
when(x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
- Branch의 조건문에 함수나 식을 사용할 수 있음
when(x) {
parseInt(x) -> print("s encodes x")
1 + 3 -> print("4")
else -> print("s does not encode x")
}
- range나 collection에 in이나 !in으로 범위 등을 검사할 수 있음
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를 이용하여 타입도 검사할 수 있음 -> 이 때 스마트 캐스트가 적용됨
fun hasPrefix(x: Any) = when(x) { //x에 어떤 객체가 들어오고
is String -> x.startsWith("prefix") //x가 String이 맞는지 확인하는 동시에 x를 String으로 만들어줌 -> 맞으면 startsWith 실행
else -> false
}
- when은 if-else를 완벽히 대체할 수 있음
- when에 인자를 입력하지 않으면, 논리연산으로 처리됨
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
4. For Loops
- for문은 iterator를 제공하는 모든 것을 반복할 수 있음
for(item in collection) //item에 collection의 항목들이 각각 들어가면서 반복
print(item)
- for문의 Body에 블록이 올 수도 있음
for(item in collection) {
print(item.id)
print(item.name)
}
- for문을 지원하는 iterator의 조건
- 멤버함수나 확장함수 중에 iterator()를 반환 하는 것이 있는 경우 next()를 가지는 경우, hasNext():Boolean을 가지는 경우라면 for문을 사용할 수 있습니다!
- 단, 위의 세 함수는 operator로 표기 되어야 합니다.
- ex)
fun main(args: Array<String>) {
val myData = MyData()
for(item in myData) { //for문 실행
println(item)
}
}
//MyIterator는 next()와 hasNext()라는 operator를 가지고 있는 클래스임
class MyIterator {
val data = listOf(1, 2, 3, 4, 5)
var idx = 0
operator fun hasNext(): Boolean { //hasNext():Boolean
return data.size > idx
}
operator fun next(): Int { //next()
return data[idx++]
}
}
//MyData라는 클래스는 iterator를 반환하는 클래스임
class MyData {
operator fun iterator(): MyIterator { //iterator를 반환하는 경우
return MyIterator()
}
}
- 배열이나 리스트를 반복할 때, index를 이용하고 싶다면 indices를 이용하면 됨
val array = arrayOf("가", "나", "다")
for(i in array.indices) {
println("$i: ${array[i]}")
}
- indices를 제외하고 또 다른 방법으로는, withIndex()를 이용하는 방법도 있음 -> index와 value 두 개를 동시 반환함
val array = arrayOf("가", "나", "다")
for((index, value) in array.withIndex()) {
println("$index: ${value}")
}
5. while Loops
- while, do-while문은 java와 거의 같음
- do-while문에서 body의 지역변수를 do-while문의 조건문에서 참조할 수 있음 -> Kotlin에서만 가능!
do {
val y = retrieveData()
}while(y != null)
'언어 > Kotlin' 카테고리의 다른 글
[Kotlin] Inheritance (0) | 2019.04.24 |
---|---|
[Kotlin] Class (0) | 2019.04.24 |
[Kotlin] Packages, Return and Jumps (0) | 2019.04.24 |
[Kotlin] Basic Types (0) | 2019.04.23 |
[Kotlin] Basic Syntax (0) | 2019.04.23 |
Comments