If expression
Kotlin에서 if는 표현식이다.- 값을 반환한다.
따라서 Kotlin에는 삼항연산자(조건 ? then : else)이 없다. 왜냐하면 일반적으로 if가 이 역할을 제대로 수행하기 때문이다.
var max = a
if (a < b) max = b
// else 문 포함
var max: Int
if (a > b) {
max = a
} else {
max = b
}
// 표현식으로
val max = if (a > b) a else b
if 문의 블럭 내에 여러 줄의 식이 있다면 리턴 값은 마지막 줄이 된다.
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
예를 들어 값을 반환하거나 변수에 할당하기 위해 if를 표현식으로 사용하는 경우 else 분기는 필수이다.
When expression
when은 여러 분기가 있는 조건문을 정의한다. C와 같은 언어의 switch 문과 유사하다.
간단한 형태는 다음과 같다.
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 블럭이 있는 것에 주목하라
print("x is neither 1 nor 2")
}
}
when은 일부 분기 조건이 충족될 때까지 모든 분기에 대해 인수를 순차적으로 확인한다.
when은 표현식이나 명령문으로 사용할 수 있다. 표현식으로 사용할 경우 첫 번째로 일치하는 분기의 값이 전체 표현식의 값이 된다. 명령문으로 사용하는 경우 개별 분기의 값은 무시된다. if와 마찬가지로 각 분기는 블록이 될 수 있으며 그 값은 블록의 마지막 표현식 값이다.
else 분기는 다른 분기 조건이 충족되지 않으면 작동한다. when이 표현식으로 사용되는 경우 컴파일러가 가능한 모든 사례가 분기 조건(예: enum 클래스 항목 및 sealed 클래스 하위 유형)이다.
여러 케이스에 대한 공통 동작을 정의하려면 해당 조건을 쉼표로 한 줄에 결합한다.
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")
}
범위나 컬렉션에 in 또는 !in으로 값을 확인할 수도 있다.
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 을 활용해 값이 특정 타입인지 확인하는 것이다. 스마트 캐스트로 인해 추가 검사 없이 유형의 메서드와 속성에 액세스할 수 있다.
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
when은 if- else if 체인을 대신할 수도 있다. 인수가 제공되지 않으면 분기 조건은 단순히 boolean 표현식이며 조건이 참일 때 분기가 실행된다.
when {
x.isOdd() -> print("x is odd")
y.isEven() -> print("y is even")
else -> print("x+y is odd")
}
다음 구문을 사용하여 변수의 주체를 캡처할 수 있다.
fun Request.getBody() =
when (val response = executeRequest()) {
is Success -> response.body
is HttpError -> throw HttpException(response.status)
}
when 주제에 도입된 변수의 범위는 이 when의 본문으로 제한된다.
For loops
for 루프는 반복자를 제공하는 모든 항목을 반복한다. 이는 C#과 같은 언어의 foreach 루프와 동일하다. for 구문은 다음과 같다.
for (item in collection) print(item)
for 의 본문은 블록이 될 수 있다.
for (item: Int in ints) {
// ...
}
앞에서 언급했듯이 for 는 반복자를 제공하는 모든 항목을 반복한다. 이것은 다음을 의미한다.
- Iterator<>를 반환하는 멤버 또는 iterator()를 확장한 함수가 있다.
- 멤버 또는 확장 함수 next()가 있다.
- Boolean을 반환하는 멤버 또는 확장 함수 hasNext()가 있다.
이 세 가지 기능은 모두 operator로 표시되어야 한다.
숫자 범위를 반복하려면 범위 표현식을 사용하시오.
fun main() {
for (i in 1..3) {
println(i)
}
for (i in 6 downTo 0 step 2) {
println(i)
}
}
범위 또는 배열에 대한 for 루프는 반복기 개체를 생성하지 않는 인덱스 기반 루프로 컴파일된다.
배열이나 인덱스가 있는 목록을 반복하려면 다음과 같이 하면 된다.
fun main() {
val array = arrayOf("a", "b", "c")
for (i in array.indices) {
println(array[i])
}
}
또는 withIndex 라이브러리 함수를 사용할 수 있다.
fun main() {
val array = arrayOf("a", "b", "c")
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
}
While loops
while 및 do-while 루프는 조건이 충족되는 동안 계속해서 본문을 실행한다. 이들의 차이점은 상태 확인 시간이다.
- while은 조건을 확인하고, 충족되면 본문을 실행한 다음 조건 확인으로 돌아간다.
- do-while은 본문을 실행한 다음 조건을 확인한다. 만족하면 루프가 반복된다. 따라서 do-while의 본문은 조건에 관계없이 한 번 이상 실행된다.
while (x > 0) {
x--
}
do {
val y = retrieveData()
} while (y != null) // y is visible here!
Break and continue in loops
Kotlin은 루프에서 기존 break 및 continue 연산자를 지원한다.
원문
Conditions and loops | Kotlin
kotlinlang.org
'프로그래밍 > Android' 카테고리의 다른 글
[Kotlin] Exceptions (0) | 2021.09.05 |
---|---|
[Kotlin] Returns and jumps (0) | 2021.09.05 |
[Kotlin] Type checks and casts(타입 확인 및 형변환) (0) | 2021.08.31 |
[Kotlin] Basic types (기본 타입) (0) | 2021.08.29 |
[Kotlin] Coding conventions (0) | 2021.08.26 |