Coding Log


Kotlin

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

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

참고 kotlin 공식 사이트

Kotlin이란 무엇인가

Kotlin은 JetBrains사에서 만든 언어로 2011년 최초 공개되었다.

이후 차츰 개발이 진행되어 2016년에 정식 버전이 출시되었다.

그리고 1년 뒤 Google I/O 2017에서 공식 언어가 되면서 인지도가 급격하게 늘게 되었다.

Kotlin의 특징을 정리하면 아래와 같다.

  • Concise - 간결함
  • Safe - 안전성
  • Interoperable - 호환성 (정확히는 compatibility이지만 이해를 돕기 위해 의역함)

이 장점들을 하나씩 알아보자.

간결함

data class Customer(val name: String, val email: String, val company: String)

POJO 를 생성할 때 getter/setter, equals(), hashCode(), toString(), copy()가 한 줄로 구현된다.

또한 문장 끝에 세미콜론(;)이 없으며, new 키워드를 사용하지 않아도 객체를 생성할 수 있다.

참고 POJO (Plain Old Java Object) : 특정 제한 사항에 묶이지 않은 순수한 Java Object

val positiveNumbers = list.filter { it > 0 }

원래 Android는 lambda를 사용하기 어려웠던 환경이었지만 Kotlin은 lambda를 기본적으로 지원한다.

또한 java로 작성된 interface라면 해당 interface의 인스턴스를 바로 lambda로 표현할 수 있다.

대표적으로 View.onClickListener 가 있다.

아래의 예시를 보자.

view.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    // behavior when clicked
  }
});

java에서 onClick을 구현하는 코드가 Kotlin에서는 아래와 같이 변한다.

view.setOnClickListener {
  // behavior when clicked
}

이처럼 lambda로 표현할 수 있는데 이를 SAM Conversions 라고 한다.

참고 SAM(Single Abstract Method) : 단일 추상 메소드

만약 싱글턴 객체를 원한다면 아래와 같이 간결하게 만들 수 있다.

object ThisIsASingleton {
    val companyName: String = "JetBrains"
}

그저 object로 생성만 하면 된다.

안정성

var output: String
output = null   // Compilation error

Kotlin은 null값을 명확히 검증하기 때문에 위의 코드는 오류가 난다.

참고 kotlin 공식 페이지는 이를 The Billion Dollar Mistake라고 표기해놨는데, 이는 Null reference 개념을 창시한 토니 호어가 한 말이다. Null이라는 개념으로 인해서 현재까지도 엄청난 피해를 내고 있기 때문...

참고 토니 호어는 그 유명한 Quick Sort 를 고안한 사람이다.

val name: String? = null    // Nullable type
println(name.length())      // Compilation error

Kotlin은 위와 같은 코드도 컴파일 에러로 검증할 수 있다.

물음표(?)를 보면 Swift의 optional과 이 떠오르지만 추가적인 연산자가 더 존재한다.

이는 추후 Null Safety 의 개념을 다루면서 자세히 설명하도록 하겠다.

fun calculateTotal(obj: Any) {
    if (obj is Invoice)
        obj.calculateTotal()
}

또한 변수의 타입도 자동으로 추론해서 캐스팅해준다.

호환성

import io.reactivex.Flowable
import io.reactivex.schedulers.Schedulers

Flowable
    .fromCallable {
        Thread.sleep(1000) //  imitate expensive computation
        "Done"
    }
    .subscribeOn(Schedulers.io())
    .observeOn(Schedulers.single())
    .subscribe(::println, Throwable::printStackTrace)

위에서 언급한 SAM Conversions 와 마찬가지로 JVM에서 제공하는 기본 라이브러리는 100% 지원한다.

보다시피 위의 코드는 RxJava다.

마무리

Kotlin의 특징 3가지를 알아보았다.

java와의 호환성이 엄청난 강점인 만큼 앞으로는 java와 비교해보면서 kotlin 언어를 익히고 기본 문법에 대해서 포스팅하도록 하겠다.

DISQUS 로드 중…
댓글 로드 중…

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

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