오늘은 코틀린의 기초에 대해 살펴보도록 하자! 필자가 생각하기에 자주 쓰이는 문법들을 살펴보겠다. 이 외에 문법들은 코틀린 공식문서를 살펴보는게 좋을 듯 싶다.

기본적인 number들은 자바와 bit 길이가 같다. 그러므로 생략한다.

명시적 변환

자바와 달리 코틀린은 자동 형변환을 지원하지 않는 듯하다.
예를들어 보자.

int i = 10;
long l = i;
System.out.println(l);

위의 코드는 자바의 자동 형변환 코드이다. 작은 범위의 타입은 큰 범위 타입으로 자동 형 변환이 가능하다. 이건 자바 기초이므로 다 알거라고 생각한다. 하지만 코틀린의 경우 다르다.

val i :Int = 10
val l : Long = i //컴파일 에러
println(l)

위는 코드는 아무 이상 없어 보이지만 컴파일 에러가 발생한다. 이유는 코틀린의 Int 는 자바의 Integer로 오토박싱 된다. 그러므로 자동 형변환은 지원되지 않는다.
하지만 명시적 변환은 지원되니 모든 숫자 타입은 아래와 같은 방법으로 변환해주면 된다.
– toByte(): Byte
– toShort(): Short
– toInt(): Int
– toLong(): Long
– toFloat(): Float
– toDouble(): Double
– toChar(): Char

Strings

자바와 동일하게 String타입은 불변의 객체이다. for문은 통해 각각의 문자를 가져올 수 있다.

val str = "hello"
for(s in str){
    print("$s ")
}
//h e l l o 

String Literals

이거 또한 요즘 나오는 언어에는 대부분 지원하는 듯 하다. 자바는 흠..

val hello = "hello\nworld"
val hello1 =
"""
hello
world
"""

기존의 뉴라인은 \n를 써왔다. 하지만 이제 """ 쌍따움표 세개 안에 String 문자열을 그대로 사용할 수 있다. text를 json으로 만들 때 우리는 다음과 같이 했다.

val json = "{\"key\":\"value\"}"

귀찮게 빽슬래스를 사용해서 key value들을 어사인 할 수 있었지만 이제는 그럴 필요 없다.

val json1 =
"""
{"key":"value"}
"""

위와 같이 하면 \ 빽슬래시를 사용하지 않아도 간단하게 json을 만들 수 있다. 히지만 String을 그대로 출력하므로 에디터에서도 제일 앞부분으로 옮겨야 한다는 단점도 있다. 이 문제를 해결하기 하려면 아래와 같이 하면 된다.

val json1 = """
    |{"key":"value"},
    |{"key1":"value1"}
    """.trimMargin()

앞부분에 |을 사용하고 trimMargin() 메서드를 사용하면 된다.

import

기본적으로는 자바와 import방식은 동일하다.

import java.util.Arrays

몇가지 다른점이 있는데 코틀린에서는 static import가 존재 하지 않는다. 하지만 그에 맞게 적당한 대응책은 존재한다.

import java.util.Arrays.*

위와 같이 asterisk를 사용하여 해당 범위 모든 패키지 클래스 오브젝트에 접근할 수 있다.

asList(1, 2, 3, 4, 5)

또한 import에 alias를 선언할 수 있다.

import kotlin.collections.listOf as of
...
val list = of(1, 2, 3, 4, 5)

흐름 제어

if 문

코틀린에서는 자바와는 다르게 if문은 expression으로 사용할 수 있다. 스칼라도 동일하다.

val a = 10
val b = 20
val max: Int
if (a > b)
    max = a
else
    max = b
println(max)

기존의 우리는 위와 같은 방식으로 사용해 왔다. a 가 b보다 크면 max에다 a를 넣고 아니면 max에다 b를 넣는 그런 코드이다.
하지만 이제부터는 식으로 사용할 수 있다

val max1 = if (a > b) a else b
println(max1)

기존의 코드보다 좀 더 짧은 코드로 작성 할 수 있다. 만약 a를 리턴전에 추가적으로 할일이 있다면 컬리브레이스로 감싸주면 된다.

val max2 = if (a > b) {
    println("a")
    a
} else {
    println("b")
    b
}
println(max2)

위와 같이 컬리브레이스를 사용하면 되고 return 키워드는 사용하지 않아도 된다.

When 문

첫 번째 시간에서도 언급을 했는데 java의 switch 문과 비슷한 문법을 갖고 있으나 더욱 강력하다. 스칼라의 패턴매칭보다는 조금 아쉽지만 그래도 자바보단 낫다.

가장 간단한 예제를 보자.

val text = "hello"

when(text){
    "hello" -> println("text == hello")
    "world" -> println("text == world")
    else -> {
        println("no matching")
    }
}

일반 자바의 switch 문과 문법은 비슷해 보인다. 여기서는 특정 문자에 매칭이 되면 해당되는 문자를 출력한다.

fun whenExpression(any: Any) {
    when (any) {
        in 0..10 -> println("0 ~ 10")
        is String -> println("String type")
        else -> {
            println("no matching")
        }
    }
}

좀더 다양한 방법으로는 in 키워드로 범위를 지정할 수 있으면 is 키워드로 타입을 체크 할 수 있다.

fun whenExpression1(any: Any): Boolean? {
    return when (any) {
        is String -> any.startsWith("when")
        else -> {
            false
        }
    }
}

위와 같이 String 타입을 경우에는 형변환 할 필요 없이 자동으로 형변환을 해준다. java의 switch case문 보다는 좀 더 강력한 기능을 갖고 있다.

마무리

필자는 예전에 스칼라를 조금 공부한적이 있었다. 물론 아주 세밀한건 아니고 그냥 한번 살펴본 정도? 그래도 그것 때문인지 그래도 좀더 이해가 빠르게 되는거 같다. 물론 oop를 오랫동안 한 개발자들은 함수형 언어가 조금 낯설게 느껴질 지도 모른다. 필자도 처음에는 함수형 언어가 조금 어려웠다. 아직도 어렵고 잘 이해 안가는 부분이 아주 많다. 자바 개발자 중 java8을 사용하거나 공부를 했다면 코틀린과 스칼라를 공부해도 될 것 같지만 아직 java8을 사용하지 않거나 잘 모른다면 일단 java8의 람다, stream, 메서드 레퍼런스 등 java8 에서 새롭게 추가된 문법들 부터 공부해보자.

오늘은 이것으로 기본 문법들을 살펴 봤다. 다음 시간에는 코틀린의 클래스에 대해서 알아보자!