코틀린 언어 정리 1-4

기본 - 제어문

제어문

특징

모든 제어문은 일정 조건을 만족하면 모두 표현식으로 사용될 수 있습니다. 예를 들면 if, when 등 의 경우 표현식으로 사용하려면 반드시 else를 포함하여 사용해야 합니다.

 

예제

val bResult = if (a == 10) true else false

 

if else

C/C++/Java 처럼 3항 연산자 "A ? B : C" 는 없지만 if else 문으로 동일하게 처리할 수 있습니다.

 

예제

val a = 10
var result = if (a > 5) 5 else a

 

for in

예제

fun test () {
   //⇒ 0~10 범위 (10 포함)
   for (idx in 0..10) {
       println("a")
   }

   //⇒ 1 부터 9 까지 (10 제외)
   for (i in 1 until 10) {
       println("a")
   }

   //⇒ 5 씩 증가
   for (i in 1..10 step 5) println("a")

   //⇒ 10 부터 1 까지 감소
   for (i in 10 downTo 1)
       println("a")


   var list = listOf("a", "b", "c")
   //⇒ 구조 분해를 통한 다중값 리턴으로 list의 index와 element를 동시에 받음
   for ((idx, value) in list.withIndex()) {
       println("$idx: $value")
   }
}

 

for ( idx in 0..10 ) { ... }

⇒ 0~10 범위 ( 10 포함 )

 

for ( i in 1 until 10 ) { ... }

⇒ 1부터 9까지 ( 10 제외 )

 

for ( i in 1 ..10 step 5 )

⇒ 5씩 증가

 

for ( i in 10 downTo 1 )

⇒ 10부터 1까지 감소

 

for ( ( idx, value ) in list.withIndex() ) { ... }

⇒ 구조 분해를 통한 다중값 리턴으로 list의 index와 element를 동시에 받음

 

for 와 같이 사용할 수 있는 키워드

in

until

downTo

step

 

특징

코틀린에서는 C/C++/Java와 같은 방식의 for문은 제공하지 않습니다. ex. for ( int i = 0; i < 100; i++ ) { ... }

 

while / do while

while / do while 은 C/C++/Java와 동일합니다.

 

예제

fun test () {
   var a = 20
   while (a > 10) {
       a--
   }
}

 

when

Kotlin에는 switch case 문 대신 when이 있습니다. switch case 와 다르게 when에서는 입력된 객체에 대한 값( 단일값, ","로 구분된 복수의 값, Type이 각각 다른 값 ), 범위, 타입 등을 명시하여 분기할 수 있으며 각각의 마지막 표현식을 when 구문 전체의 리턴값 처럼 사용합니다. when 구문을 표현식으로 사용하려면 else를 반드시 포함해야 합니다. 위에서 언급한 "Type이 각각 다른 값"에 대해 좀 더 구체적으로 확인 해보면 아무 타입의 값을 넣고 Type을 모르는 상태( 보통 Any 등의 Type으로 선언된 경우 )에서 예상되는 모든 타입의 값을 넣고 비교할 수 있습니다. 주의할 점은, 바로 전에 "Type을 모르는 상태"라고 했는데, 만약 명백하게 타입을 알고 있는 경우(ex. 바로 윗부분에 Int형 변수를 선언하고 아래 부분에서 String Type으로 비교하는 경우, 즉 명백하게 잘못된 코딩을 한 경우)라면 컴파일 에러 또는 경고를 발생시킵니다. 즉 컴파일 할때 when 구문 자체만 분석하는 것이 아니라(아니라) when과 관련 있는 코드의 문맥까지 분석하여 오류를 추론합니다.

 

거의 모든 경우가 포함된 when의 사용 예

예제

fun magicNum(): Int {
   return 100
}

fun main1(args: Array<String>) {
   var obj: Any = 30
   var result: String = when (obj) {
       1 -> "1" //정수와 비교 후 맞다면 result에 "1" 반환
       is String -> { // 문자열 타입 비교
           println("obj is String Type")
           "String"
       }
       5, 6 -> "5 or 6" // 복수의 정수값
       in listOf(8, 10, 17) -> "8, 10, 17" // list에 포함된 요소들과 모두 비교
       in 20..30 -> "in 20~30" // 범위 내에 있는 모든 값과 비교
       magicNum() -> "magicNum Function Return" //함수의 리턴값과 비교
       else -> { // 위의 경우에 포함되지 않는 경우
           println("unknown")
           "unknown"
       }
   }
   println(result)
}

 

if else문 처럼 사용 되는 예

when 다음에 "( 객체 )" 와 같이 비교할 인자값 등을 넣지 않고 조건식만 나열하여 사용할 수 있습니다.

예제

fun main2(args: Array<String>) {
   val num1 = 10
   val num2 = 20
   val num3 = 5
   when {
       num1 > num2 -> println("num1 is greater.")
       num2 > num1 -> println("num2 is greater.")
       num1 > num3 && num2 > num3 -> println("num3 is the smallest.")
       else -> println("num3 is vague..")
   }
}

 

break/continue/return/label

C/C++/Java와 마찬가지로 for, while 등의 반복문 내에서 흐름을 제어할 수 있는 구문입니다. 일반적인 사용법은 기존 언어들과 동일하며 차이점은 Label과 같이 사용할 수 있다는 점입니다.( C/C++ 에서 Label은 goto 문과 같이 사용합니다. )

 

예제

fun main1(args: Array<String>) {
   label1@ for (i in 10 downTo 1) {
       for (j in 0..10) {
           if (i == 5 && j == 2) {
               println("i = $i, j=$j")
               break@label1
           }
       }
   }
}

break은 보통 break을 직접 포함하는 반복문을 벗어나는 흐름을 만들지만 Label과 같이 사용하면 label로 이름이 지정된 더 상위의 반복문도 바로 빠져나갈 수 있습니다. "continue@label1"도 동일한 개념으로 동작합니다.

 

예제

fun main1(args: Array<String>) {
   var resultFunction =
       label1@{
           println("execute lambda!")
           return@label1 "lambda returned"
       }
   println(resultFunction())
}

lambda 함수에서도 label과 같이 사용 되는 return을 유용하게 사용할 수 있는데 이와 관련된 내용은 lambda 함수 부분에 포함되어 있습니다.

 

+ Recent posts