본문으로 바로가기

[Kotlin] 코틀린이란?

category 개발이야기/Kotlin 2017. 11. 26. 01:00
반응형


이 글은 Kotlin In Action을 참고 하였습니다.

더욱 자세한 설명이나 예제는 직접 책을 구매하여 확인 하시기 바랍니다

1.2 코틀린의 주요 특성

코틀린은 자바가 실행되는 환경에서 자바를 대체할 수 있도록 개발된 언어입니다.

코틀린이 어디서 사용될수 있는지 알아보겠습니다.

  • 서버상의 코드 (특히 웹 어플리케이션의 백엔드)
  • 안드로이드의 어플리케이션

사실 이 이외에도 다른 환경에서도 잘 동작합니다.
예를 들어 인텔의 멀티엔진을 이용해서 iOS에서도 실행 가능하며, 토네이토FX & 자바 FX를 이용하여 데스크탑 어플리케이션 개발도 가능합니다.

추가적으로 자바스크립트도 코틀린을 컴파일 할 수 있습니다. 


1.2.2 정적타입 지정 언어

코틀린은 정적 언어 입니다.
따라서 컴파일 시점에 모든 객체나 메서드의 타입을 알 수 있습니다.
다른말로 컴파일러가 타입을 확정하고 검증해 주는겁니다.

반대로 동적언어는 타입과 관계없이 모든값을 변수에 넣을 수 있고 이런 필드나 메소드의 접근에 대한 검등은 run time에 일어납니다.
따라서 코드길이가 더 짧아지고, 데이터 구조를 유연하게 가지고 갈 수 있는 장점이 있지만 이름을 잘 못 입력하는등의 실수도 컴파일시 걸러내지 못하는 단점도 있지요~

단 대부분의 상황에서 kotlin은 타입추론(type inference)가 가능하기 때문에 아래와 같이 사용이 가능합니다.

정리하자면 코틀린은 정적타입의 언어이고, 정적타입 언어가 갖는 아래의 장점을 지닙니다.

var abc = 1
var bcd:Int = 100


  • 성능: 컴파일 타임에 이미 메서드 호출관계가 지정되어 런타임시 빠르다
  • 신뢰성: 컴파일러가 어느정도 컴파일타임에서 많은 오류를 잡아낸다.
  • 유지 보수성: 코트상에서 객체의 타입을 알수 있기 때문에 코드를 다루기 쉽다
  • 도구지원: 안전한 리팩토링이 가능하며, 개발툴은 정확한 코드 완성 기능을 제공할 수 있다.


나중에 나오 겠지만 코틀린은 nullpointerexception을 미연에 방지할 수 있도록 nullability check을 강력하게 지원 합니다.


1.2.3 함수형 프로그래밍과 객체지향 프로그래밍

코틀린은 함수형 프로그래밍이 가능합니다.

따라서 함수를 변수에 담을 수 있고, 함수의 파라미터로 함수를 넘겨줄 수 도 있습니다.

이는 사실 java 8에서도 지원하지만, java8에서는 함수타입까지는 지원하지 않습니다. 대신 interface로 함수형 타입을 대체하지요~


1.3 코틀린의 응용

앞에서 언급한대로 코틀린은 서버에서도 사용이 가능하지만, 저는 안드로이드 개발 목적으로 코틀린을 사용하기 때문에 안드로이드 내용만 언급해 보겠습니다.

먼저 Anko라는 라이브러리를 제공하여 안드로이드 개발이 더 간소해 지도록 도와줍니다.

Null check에 대한 부분이 강화되어 NullPointerException의 발생을 줄여 줍니다.
이런 exception의 발생 가능한 코드는 아예 컴파일 타임에서 막아줍니다.(컴파일이 안되용~)

또한 코틀린은 자바6와 완벽히 호환됩니다.
하지만 함수형 타입을 지원하기 때문에 컴파일시 이를 익명클래스로 변경하는걸 알수 있습니다. (bytecode를 분석해 보면 알수 있습니다.^^)

bytecode 분석 내용을 보려면...
http://tourspace.tistory.com/11
http://tourspace.tistory.com/12


1.4 코틀린의 철학

1.4.1 실용성

코틀린은 실제 문제를 해결하기 위해 만들어진 실용적인 언어 입니다.
대학원에서 나온 새로운 방식의 언어가 아니라, 자바의 불편한점들을 개선하고, 간소화 하는 방향으로 발전되어 있습니다.

1.4.2 간결성

보통 개발자는 코드를 만들어내는 시간보다 기존 코드를 읽는 시간이 더 많이 걸립니다.
사실 지금 제 경우가 그렇습니다.
다른 사람이 만들어 놓은 코드를 분석하는 일은 사실 쉽지 않습니다.ㅠ.ㅠ

코틀린은 개발자가 작성하는 코드에서 의미없는 부분을 줄이고, 의미는 없지만 형식을 맞추기 위해 넣어야 하는 부수적인 코드들을 제거가능 하도록 합니다.

예를들어 getter와 setter를 만들지 않아도 컴파일시 자동으로 생성됩니다. 또한 함수형을 지원하면서 코드량이 감소합니다.
하지만 코틀린 언어 설계의 목표중에 코드량 감소는 들어있지 않다고 하네요.

실제로 코틀린을 사용해 보면 자바 코드를 사용함에 있어 얼마나 부수적인 코드들이 들어가는지 몸으로 느낄 수 있습니다.

"코드가 간결하면 쓰는데 시간이 덜 걸린다. 그리고 읽는데는 더 적게 걸린다!!"


1.4.3 안정성

위에서 계속 언급 되지만 null 관련 부분이 강화되어 있어 컴파일 시점에서 NullPointerException을 미리 잡아 줍니다.
다른말로 해당 오류가 발생할 수 있는 코드는 아예 컴파일이 안됩니다.
이를 위해서 여러 추가적인 연산자들을 제공하는데, 이는 나중에 보도록 하겠습니다.

ClassCaseException을 좀더 쉽게 막을 수 있습니다.
이건 말보다는 코드로 보시죠~
if (value is String) {
    println(value.toUpperCase())
}


value is String을 하는 순간 type 검사와 casting이 동시에 수행 됩니다.

type검사와 casting을 따로 해야하는 자바보다 훨씬 간결합니다. 


1.4.4 상호 운용성

기존에서 사용하던 라이브러리를 코틀린에서 그대로 사용할 수 있습니다.
코틀린에서 자바의 코드를 상속받거나 구현하는것도 물론 가능합니다.

또한 코틀린<->자바 간 호출시에도 특별히 다른 도구가 필요하다거나, 다른 문법이 따로 필요하지 않습니다.
C코드를 자바에서 쓰려면 JNI를 이용해야 하지만 코틀린과 자바사이에는 정말 쉽게 호출이 가능합니다.

따라서 처음부터 코틀린을 사용하지 않은 코드라도, 어느 시점 이후부터는 코틀린 코드로 작성하더라도 프로젝트에 문제가 없습니다.
서로 호출하거나, 상속, 구현하는데에 문제가 없기 때문이죠.

디버깅을 할 때도 코드가 섞여 있더라도 마치 하나의 언어를 쓴것처럼 한 단계씩 싱핼 가능합니다.

또하나 중요한 점은 기존 자바 라이브러리를 가능하면 최대한 이용하도록 되어 있다는점입니다.
예를틀어 코틀린은 collection을 따로 구현하지 않고 자바의 collection을 그대로 가져다가 씁니다.
물론 해당 라이브러리를 확장해서 좀더 편리한 API도 제공 합니다.

1.5 코틀린 도구의 사용

1.5.1 코드 컴파일

코틀린은 .kt라는 확장자를 갖습니다.
그리고 컴파일하면 자바와 같이 .class 파일이 됩니다.
다만 코틀린에서 제공하는 추가적인 API를 동작시키기 위해서는 코틀린 런타임 라이브러리가 필요합니다.
이는 Maven과 Gradle에 몇줄만 넣어주면 알아서 포함시켜 줍니다~

1.5.2 IntelliJ 의 Android studio

안드로이드를 개발하는 사람이라면 누구나 android studio를 쓸텐데요.
2.3.3버전인 경우 추가적으로 Kotlin plugin을 추가하면 되고, 이번에 나온 3.0부터는 기본적으로 코틀린을 포함하고 있습니다.

따라서 새파일 만들때 new -> Kotlin File을 바로 만들어 쓸 수 있습니다.

1.5.3 대화형 쉘(Shell)

코틀린으로 개발하다보면 "어..이렇게 써도 되나?" 라고 생각될때가 꽤 있습니다.
아직 언어가 익숙치 않아서 인데, 샘플로 짧은 코드를 만들어서 그때그때 어떻게 동작하는지 보려면 아래 옵션을 켜면 됩니다.

Tool -> Kotlin -> Kotlin REPL

1.5.4 대화형 쉘(Shell)

물론 이클립스에서도 간단히 플러그인을 추가해서 사용할 수 있습니다.
마켓플레이스에서 kotlin을 검색하면 됩니다.
자세한건 검색~~검색~~

1.5.4 온라인 놀이터

그냥 예제와 함께 간단한 코드를 돌려보고 싶다면 아래 페이지로 접속하면 됩니다.

1.5.6 자바<-> 코틀린 변환기

Android studio에서는 자동 변환기를 제공해 줍니다.

Code -> convert Java File to Kotlin 을 누르면 자바파일이 통째 kotlin을 변환됩니다.

또한 코틀린 파일(.kt)을 먼저 만들고 자바 코드를 붙여넣기 해도 자동 변환이 됩니다.


단!! 그냥 변환해서 쓸꺼면 의미가 없겠죠?
더욱더 코틀린스럽게 수정해서 사용하시면 됩니다.


이로써 코틀린의 overview를 마치려고 합니다.

어떤 언어든지 장점과 단점이 존재합니다.

전 Java8을 먼저 접하고 나서 Kotlin을 접했던터라 Java8을 쓰면 될텐데 굳이...라는 생각을 많이 하면서 봤습니다.
하지만 안드로이드를 개발하는 입장에서 Java8은 하위호환성을 갖지 않기 때문에 치명적이긴 합니다.
N OS 이하에서는 사용할수 없으니...

물론 함수형 프로그래밍을 지원하도록 하는 라이브러리를 사용하여 이전 Android OS에서도 동작하도록 Java 8을 흉내 낼수는 있으나, bytecode로 컴파일 해보면 완벽하게 지원하지 못합니다.

이건..제가 써놓은 자바8 compile 관련 글을 보시면 됩니다. (위에 링크 해놨습니다. 핵심은 invokedynamic의 사용 여부 입니다)

따라서 그럴바엔 차라리 코틀린을 쓰는게 낫습니다.
코틀린은 자바에서 의심없이 사용했던 코드들의 군더더기를 제거해주면서 훨씬 간소한 프로그래밍을 할수 있도록 도와줍니다.

그리고 무엇보다도 새로운 언어라 재밌습니다.^^

책에서 무슨 장점이 있다, 무슨 단점이 있다라고 백날 얘기해 봐야 의미가 없습니다.
자바도 장점이 있고, C도 장점이 있고, C++도 다 장점이 있는 언어 입니다.

직접 해보고 몸으로 느껴보는게 가장 좋은 방법이라고 생각합니다.  


반응형