Coding Log


Kotlin

본 카테고리는 2017년 Android 공식 언어로 채택된 Kotlin에 관하여 다룬다.

Kotlin을 이용해 개발하는 Android는 추후 따로 다루기로 하고 언어 자체에만 집중한다.

참고 kotlin 공식 사이트

흐름 제어(Control Flow)

If 문

Kotlin의 if문은 하나의 식으로서, 값(value)를 반환한다.

Kotlin의 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

if문은 블록(block)을 가질 수 있으며, 식의 가장 마지막에 해당 블록의 값이 위치하게 된다.

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

if문을 명령문이 아닌 표현식으로 사용할 경우 표현식에 else문을 통한 분기 처리가 되어 있어야 한다.

참고 표현식으로 사용한다는 말은 값을 리턴하거나 변수에 지정하는 경우를 말한다.

when 표현식

Kotlin의 when은 C언어의 switch문과 유사하다.

아래의 코드를 보자.

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

when 키워드는 분기하는 조건이 충족될 때까지 모든 분기에 parameter를 순차적으로 일치시킨다.

when을 표현식으로 처리하는 경우 조건이 충족된 분기의 값이 전체 표현식의 값이 되며, 명령문으로
사용되는 경우엔 나머지 분기를 전부 무시한다.

위의 if문과 마찬가지로 각 분기는 블록을 지정할 수 있으며, 블록의 마지막 식이 값이 된다.

else는 모든 분기 조건이 맞지않을 때 사용한다.

만약 when을 표현식으로 사용하였을 때, 각 분기 조건이 모든 경우의 수를 다루지 않았다고 컴파일러가 판단할 경우
else를 필수적으로 사용해야 한다.

분기 처리해야 할 조건이 여러 개일 경우엔 쉼표(,)를 통해 통합할 수 있다.

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

C언어의 switch문이 상수값만 사용할 수 있는 것에 반해 when은 임의의 표현식도 사용할 수 있다.

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")
}

또 다른 방법으로 parameter가 특정 유형인지를 확인할 수 가 있다.

추후 언급할 smart casts 를 통해 추가적인 방법없이 해당 유형의 메소드와 속성을 접근할 수 있다.

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

when은 if-else if 체인을 대체할 때도 사용할 수 있다.

특정 인수가 제공되지 않으면 분기 조건은 단순히 Boolean 관련 표현식이 되고 해당 조건이 true일때 실행된다.

when-if 체인을 대체 할 때도 사용할 수 있습니다. 인수가 제공되지 않으면 분기 조건은 단순히 부울식이 고 해당 조건이 참일 때 분기가 실행됩니다.

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

For Loops

for 루프를 쓰면 parameter로 제공받는 모든 것을 반복한다.

이 구조는 C#의 foreach 루프와 동일하다.

아래의 예제를 보자.

for (item in collection) print(item)

또한 for 루프는 if와 when과 마찬가지로 블록(block)을 가질 수 있다.

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

앞서 설명했듯 for 루프는 제공받는 모든 것을 반복한다.

그 반복의 조건은 아래와 같다.

  • 반환 유형을 가진 멤버함수를 가지고 있거나 확장된 함수 iterator()를 가지고 있다.
  • 멤버함수 또는 확장된 함수 next()를 가지고 있다.
  • Boolean을 반환하는 멤버함수 또는 확장된 함수 hasNext()를 가지고 있다.

위의 세 가지 기능은 모두 operator로 작성되어야 한다.

for 루프에 배열을 전달하면 특정 iterator 객체를 만들지 않을 경우 index를 기반으로 반복된다.

index가 존재하는 배열이나 리스트를 반복할 경우 아래와 같이 작성할 수 있다.

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

위와 같이 범위를 통한 반복은 추가적인 객체를 생성하지않고 최적의 상태로 컴파일된다.

다른 방법으로는 withIndex 라이브러리 함수를 이용해서 작성할 수 있다.

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

While Loops

다른 일반적인 프로그래밍 언어와 마찬가지로 while과 do..while 문도 동작한다.

while (x > 0) {
  x--
}

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

반복문 내의 Break와 Continue

일반적인 프로그래밍언어들 처럼 반복문 안에서 break와 continue를 사용할 수 있다.

참고 Kotlin Return과 Jump 포스팅


DISQUS 로드 중…
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다