제어문 : if, when, for, while

If 문법

코틀린에서는 if 는 표현중하나로 값을 하나 리턴하게 된다. 그러므로 삼항연산자는 존재하지 않는다. 왜냐하면 if문법이 그 역할을 하고 있으니까.
 

// Traditional usage
var max = a
if (a < b) max = b
// With else
var max: Int
if (a > b) {
 max = a
} else {
 max = b
}
// As expression
val max = if (a > b) a else b

위 표현은 이렇게도 표현할 수 있다.

val max = if (a > b) {
 print("Choose a")
 a
} else {
 print("Choose b")
 b
}

변수에 값을 대입할 목적으로 if문을 사용할 경우 반드시 else 문이 포함되어있어야한다.

when 문법

when은 switch문을 대체한다.

when (x) {
 1 -> print("x == 1")
 2 -> print("x == 2")
 else -> { // Note the block
 print("x is neither 1 nor 2")
 }
}

when은 인자들을 모든 브렌치와 순서대로 만족할때까지 비교하게 된다. when 또한 expression(표현식) 이자 statement(선언문)로 이용가능하다. 만약 expression으로만 쓰인다면 브랜치에서 만족한 값은 전체 표현식의 값이 된다. 선언문 형태로 사용할 때에는 각 비교 구문식의 값은 무시된다.
else 는 아무런 조건도 만족하지 못할 때 실행된다. when이 만약 표현식으로 사용될 때, 컴파일러 입장에서 모든 브랜치들의 조건들이 하나라도 만족하는 경우가 힘들다고 판단된다면, else는 필수적으로 사용되어져야 한다.
 
만약 많은 조건들이 같은 방법으로 다루어 진다면, 조건식을 콤마로 엮을수 있다.

when (x) {
 0, 1 -> print("x == 0 or x == 1")
 else -> print("otherwise")
}

임의의 표현식을 쓸수도 있다.

when (x) {
 parseInt(s) -> print("s encodes x")
 else -> print("s does not encode x")
}

범위 연산자를 이용하여 체크 할 수도 있다.

when (x) {
 in 1..10 -> print("x is in the range")
 in validNumbers -> print("x is valid")
 !in 10..20 -> print("x is outside the range")
 else -> print("none of the above")
}

다른 가능성은 값을 is 또는 !is로 특정한 자료형을 체크하는것이다. smart cast때문에 별도의 검사 없이 자료형의 메소드와 프로퍼티에 접근할 수 있다.

fun hasPrefix(x: Any) = when(x) {
 is String -> x.startsWith("prefix")
 else -> false
}

when은 또한 if – else if 연계의 대체형으로 사용 될 수도 있다. 만약 인자가 없다면,브랜치 조건은 간단히 boolean 표현식이 된다. 그리고 조건이 true인 브랜치가 실행된다

when {
 x.isOdd() -> print("x is odd")
 x.isEven() -> print("x is even")
 else -> print("x is funny")
}

for 반복
for문은 iterator를 제공하는 어떤 타입의 내용을 순차적으로 탐방한다. c#의 foreach와도 같다.

for (item in collection) print(item)

중괄호로 바디부분을 만들수도 있다.

for (item: Int in ints) {
 // ...
}

위에서 언급한것처럼 for문은 iterator를 제공하는 것을 순회 한다. 예를들면

  • iterator() 함수를 갖거나 리턴하는 자료형의 경우
  • next()함수를 갖는 경우
  • hasNext()를 갖거나 Boolean형을 리턴하는 경우

이러한 함수들이 연산자로써 필요하다.
for문은 iterator 객체를 생성하지 못하는 배열에 대해 인덱스 기반의 반복을 수행한다
만약 배열이나 인덱스를 갖는 리스트를 반복수행하고 싶다면 이렇게 하면 된다.

for (i in array.indices) {
 print(array[i])
}

범위를 통한 순환은 최적화된 구현으로 별도의 오브젝트 생성 없이 컴파일된다.
대안으로는 withIndex 라이브러리 함수를 사용할 수 있다.

for ((index, value) in array.withIndex()) {
 println("the element at $index is $value")
}

While 반복

while 그리고 do..while은 보통 다른 언어들처럼 동작한다.

while (x > 0) {
 x--
}
do {
 val y = retrieveData()
} while (y != null) // y is visible here!

반복문에서의 break 와 continue

코틀린은 전통으로 사용되고 있는 break와 continue 연산자를 제공한다.
 

Buy me a coffeeBuy me a coffee
카테고리: AndroidKotlin

0개의 댓글

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.