티스토리 뷰

Server

Kotlin의 Control Flow

니용 2020. 6. 26. 17:30
반응형

Author: 니용

 

Kotlin 언어는 Java와 같지만 약간 다른 Control Flow(흐름 제어)를 가지고 있습니다. 

대신 간편하게 사용할 수 있도록 설계되어 있습니다.

 


삼항 연산자

이전에 글에 작성된 부분입니다.

// Java
int maxOf(int a, int b) {
    return (a > b) ? a : b;
}

// Kotlin
fun maxOf(a: Int, b: Int) = if(a > b) a else b

Switch Case

Kotlin은 Java의 스위치 제어문도 다릅니다.

// Java
int x = 0
switch(x) {
   case 1: System.out.print("x == 1"); break;
   case 2: case 3: System.out.print("x == 2 or x == 3"); break;
   default: print("x is neither 1 nor 2");
}

// Kotlin
val x: Int? = 0
var res = when(x) {
   1 -> print("x == 1")
   2, 3 -> print("x == 2 or x == 3")
   else -> {
      print("x is neither 1 nor 2")
   }
}

위처럼 when을 사용하고 break; 가 없습니다. 조건이 추가될 때마다 콤마(,)를 사용합니다.

defaultelse로 치환되었네요.


Switch Case+

1. 조건 문에 함수를 넣을 수 있습니다.

fun parseInt(s: String): Int? {
   try {
      return s.toInt()
   }
   catch(e: NumberFormatException) {
      return throw NumberFormatException()
   }
}

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

위의 경우 String stoInt가 가능한 경우 's encodes x'를 출력합니다.

그렇지 않은 경우 else문을 호출합니다. 

 

 

2. 범위 값을 지정할 수 있습니다.

when(x) {
   in 1..10 -> print("범위 안에 값이 있어요")
   in validNum -> print("유효한 값")
   !in 10..20 -> print("범위 밖에 값이 있어요")
   else -> print("모두에 속하지 않아요")
}

 

3. 함수형 프로그래밍이 가능합니다.

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

'is'라는 함수는 Java의 instanceof와 같습니다.

리턴 타입을 추가하지 않은 이유는 추론이 가능하기 때문입니다. 

 

 

4. 조건에 함수를 넣을 수 있습니다.

when {
   x.isOdd() -> print("짝수")
   y.isEven() -> print("홀수")
   else -> print("x+y는 짝수")
}

 

(+) Kotlin 1.3부터 적용된 내용이지만 Lambda 표현식에 익숙하신 분들이 자주 사용할 것 같습니다.

fun Request.getBody() = 
   when (val response = executeRequest()) {
      is Success -> response.body
      is HttpError -> throw HttpException(response.status)
   }

 

Foreach 문 (feat. While)

Java의 경우 3가지의 foreach 문이 존재합니다. 

for(int i=0; i<arrays.length; i++){
   System.out.println("array[i]:" + array[i]);
}

for(int i: arrays) {
   // ...
}

arrays.stream().foreach(i -> {
   // ...
});

 

Kotlin은 더 확장된 기능을 지원합니다.

for(i in 1..arrays.length) print(arrays[i]) // 1 <= i <= arrays.length까지

for(i: Int in arrays) {
   // ...
}

for(i in 1..30) { // 1부터 30까지
   // ...
}


for(i in 90 downTo 0 step 3) { // 90부터 시작하여 역순(downTo)으로 3마다 실행하는 foreach
   // ...
}

for(i in 1..8 step 2) == for(i in 8 downTo 1 step 2) // 두 개는 함수는 다르지만 방법은 같습니다

for(i in 1 until 10) // 1 <= 1 < 10 까지의 범위

 

인덱스 변수를 지정하지 않아도 사용할 수 있습니다.

for(index in array.indices) { // indices가 기본 제공 함수임다
   // ... 
}

for((index, value) in array.withIndex()) {
   println("인덱스: $index, 변수: $value") 
}
// 결과:
// 인덱스: 0, 변수: aaa
// 인덱스: 1, 변수: bbb
// 인덱스: 2, 변수: ccc

 

while과 do.. while도 사용 가능해요.

while(a > 0) { // a가 양수가 되는 조건까지 무한루프
   // ... 
   if(condition1)
      break
   else if(condition2)
      continue
}

do {
   val x = retrieveData()
} while (x != null) { // x는 이 범위 내에서도 사용 가능한 변수임다
   // 
}

 

반응형

'Server' 카테고리의 다른 글

Kotlin의 lateinit과 Nullable (2)  (0) 2020.06.30
Kotlin의 생성자와 data class  (0) 2020.06.29
Kotlin의 Any와 Nullable (1)  (0) 2020.06.29
Kotlin의 함수(Function)  (0) 2020.06.26
[Spring] @Bean과 @Component의 차이  (0) 2020.06.25
Kotlin 변수의 Wrapper Type  (0) 2020.06.25
댓글
공지사항