코틀린

위키원
tjtnsdh7 (토론 | 기여)님의 2019년 6월 25일 (화) 16:05 판
이동: 둘러보기, 검색

소개

코틀린(Kotlin)이란 IntelliJ IDEA의 개발사 JetBrains에서 2011년에 공개한 프로그래밍 언어이다. 간결한 문법을 가지고 있고, 세미콜론은 옵션이다. JVM 기반의 언어이며, Java와의 상호 운용이 100% 지원된다. JVM 바이트코드가 기본이지만, Kotlin/Native 컴파일러를 사용하여 기계어로 최종컴파일이 된다. 안드로이드, 스프링 프레임워크, 톰캣, JavaScript, Java EE, HTML5, iOS, 라즈베리 파이 등을 개발할 때 사용 가능하다.

현재 최신 버전은 1.3.31

2017년에 구글안드로이드의 공식 언어로 코틀린을 추가하였다. 이는 오라클과의 Java API 저작권 분쟁의 여파로 보는 시각이 많다. 2018년 카카오카카오톡 메시징 서버에 코틀린을 사용해 본 결과, 코드량이 비약적으로 감소하고 생산성이 대폭 상승했다고 한다. 2019년 1월부터는 구글 내부의 안드로이드 프로젝트에서도 Java 대신 코틀린을 사용 가능하다.

특징

  • java와 비교하면 확연히 차이나는 간결한 문법을 제공한다.간결한 문법을 제공하면서도 런타임 오버헤드가 거의 없다.
  • 오버헤드 없는 널 안전성을 제공한다. Kotlin의 변수는 Nullable(널 값 사용 가능)과 NotNull(널 값 사용 불가)로 나뉘는데, 변수 선언 시 '?'를 붙여 Nullable로 만든다. Swift에서도 유사한 기능을 쓰는데 Kotlin 쪽이 제약이 좀 덜해서 사용하기 편하다.
  • 예외처리를 강제하지 않는다.
  • 모든 함수가 리턴값을 가진다.
  • Java의 'Integer'나 'Double'처럼 primitive type을 위한 별도의 wrapper class가 존재하지 않는다. 모든 primitive type은 객체 취급을 받는다. 따라서 Int 따위의 변수는 객체에 할당된 toString 함수 등을 바로바로 이용 가능하다.
  • 확장함수, 연산자 오버로딩을 지원 가능하다.

예를 들어 int형을 확장해 'i = 3 power 4' 같은 식으로 새 연산자를 만든다.

  • API 문서에 Java의 HTML 대신 Markdown을 사용 가능하다.
  • 연산자가 생각하는 대로 작동 가능하다.
  • static 메서드가 없다. companion object를 사용해 감싸야 한다. Java 코드에서 접근하려면 '클래스명.Companion.메서드_혹은_get변수명()' 또는 @JvmStatic annotation을 쓰면 가능하다.
  • Java 6에 호환 가능하다.
  • Java와의 상호 운용이 100% 지원 가능하다.

장점

  • 널안정성 - 널값 허용여부를 컴파일단계에서 검사. 런타임에서 발생하는 오류 감소.
  • 간결한 문법 - 세미콜론이 없음. new 키워드 없이 객체를 생성. 타입추론을 지원하므로 일반적인 타입을 적지 않음.
  • 가변/불변 지원
    • var - 할당된 값을 런타임시에 자유자재로 바꿀수 있는 변수
    • val - 값을 한번할당하고 나면 그 후에 변경할수없는 변수로 자바의 final키워드를 붙인 변수랑 동일.
    • const - 컴파일시의 상수란 의미로 컴파일타임에 값을 할당해야 한다는 의미
    • 컬렉션 자료에도 mutable을 붙인 자료형이 존재. mutableList
  • 람다 표현식 지원 - 자바로 작성된 인터페이스에 한해 sam(single abstract method) 변환을 지원하여 함수의 인자로 전달되는 인터페이스의 인스턴스를 람다로 표현할수있다. 람다표현식이란 메서드를 메서드의 이름과 반환값을 삭제하고 표현한 하나의 식으로 익명함수라고도 불린다
  • 스트림 api를 지원 - 자바8은 컬렉션내의 자료를 다루는데 유용한 스트림 api지원하지만 안드로이드 6.0이상에서만 지원되는등 제약이컸다. 코틀린은 제약이 없다.
  • 완벽한 자바 호환성
  • extension 기능 - 클래스에 상속하지 않아도 메서드를 추가할 수 있는 기능이다. 마치 클래스의 한 기능이었던것 처럼 fun String.makepretty() android data extension으로 findviewbyid없이 id값으로 바로 뷰를 접근이 가능하다.
  • 고차 함수(high order function) - 함수를 파라미터로 가져오고 함수를 리턴.
  • 데이타 클래스 지원 - 데이터 기반의 클래스로 getter, setter, tostring, copy등이 지원.
  • 코루틴 - 스레드처럼 비동기작업을 지원한다. 하지만 os에 의존적이지 않아 스레드보다 부하가 적음.

단점

  • 순수 자바 패키지보다 패키지사이즈가 더 커짐.
  • 빌드시간이 느림.
  • 자바가 코틀린을 호출할때 optional처리문제가 있음. 변수뒤에 ?가 없으면 non-null로 처리되어서 null이 오면 exception처리된다.
  • 함수 파라미터는 var이 아니라 val이라 짜증난다.

관련문서