Offcanvas

개발자 / 애플리케이션

'떠오르는 자바 대체제'··· 코틀린 제대로 이해하기

2017.11.06 Martin Heller  |  InfoWorld


안드로이드용 코틀린
2017년 5월까지 안드로이드용으로 공식 지원되는 프로그래밍 언어는 자바와 C++ 둘 뿐이었다. 구글은 2017 구글 I/O에서 안드로이드의 코틀린 지원을 공식 발표했고 안드로이드 스튜디오 3.0부터는 안드로이드 개발 툴셋에 코틀린이 포함됐다. 플러그인 형태로 이전 버전의 안드로이드 스튜디오에 코틀린을 추가할 수 있다.

코틀린은 자바와 동일한 바이트 코드로 컴파일되며 자바 클래스와 자연스럽게 상호 운용되고 자바와 툴을 공유한다. 코틀린과 자바 간 상호 호출에 따르는 오버헤드가 없으므로 현재 자바로 된 안드로이드 앱에 코틀린을 점진적으로 추가하는 것은 아주 좋은 방법이다.

핀터레스트(Pinterest)는 2016년 11월 일찌감치 코틀린으로 작성된 대표적인 안드로이드 앱이며 구글 I/O 2017의 코틀린 발표에서 주요 사례로 언급됐다. 또한 코틀린 팀은 안드로이드용 에버노트(Evernote), 트렐로(Trello), 스퀘어(Square), 코세라(Coursera) 앱을 자주 언급한다.

코틀린 대 자바
새 개발 작업에서 코틀린과 자바 중 무엇을 선택하느냐의 질문은 2016년 2월 코틀린 1.0이 처음 나왔을 때부터 있었지만 구글 I/O 발표 이후 안드로이드 커뮤니티를 뜨겁게 달구는 주제다. 간단히 답하자면 코틀린 코드가 자바 코드보다 더 안전하고 간결하며, 코틀린과 자바 파일은 안드로이드 앱에서 공존이 가능하므로 코틀린은 새 앱에서 뿐만 아니라 기존 자바 앱을 확장하는 용도로도 유용하다는 것이다.

코틀린 대신 자바를 선택할 만한 유일한 경우는 완전 초보 안드로이드 개발자인 경우다. 대부분의 안드로이드 문서와 예제가 자바로 되어 있음을 감안하면 코틀린 선택 시 어려움이 따를 것이다. 반면 안드로이드 스튜디오에서 자바를 코틀린으로 변환하려면 자바 코드를 코틀린 파일에 붙여 넣기만 하면 된다.

그 외의 안드로이드 개발 일을 하는 대부분의 사람들에게는 코틀린의 장점이 매력적이다. 자바 개발자가 코틀린을 배우는 데 소요되는 시간은 보통 몇 시간 정도다. 널 참조 오류에서 벗어나고 확장 함수를 구현하고 함수형 프로그래밍을 지원하고 코루틴을 추가하기 위해 치러야 할 대가 치고는 미미하다.

코틀린 대 스칼라
코틀린 또는 스칼라 선택에 대한 질문은 안드로이드 커뮤니티에 자주 올라오지는 않는다. 스칼라에 대한 안드로이드 툴 지원이 빈약하고 안드로이드용 스칼라 라이브러리는 비교적 큰 편이기 때문이다. 반면 스칼라 커뮤니티는 이 문제를 예민하게 받아들이고 있으며 이에 대한 해결 방안을 연구 중이다.

상황이 다른 환경도 있다. 예를 들어 아파치 스파크는 대부분 스칼라로 작성되며 스파크용 빅 데이터 애플리케이션도 스칼라로 작성되는 경우가 많다.

많은 측면에서 스칼라와 코틀린 모두 객체 지향 프로그래밍과 함수형 프로그래밍의 융합 특성이 있다. 두 언어는 예를 들어 val을 사용한 불변 선언, var를 사용한 가변 선언과 같이 많은 개념과 표기법을 공유하지만 조금씩 다른 측면도 있다. 예를 들어 람다 함수를 선언할 때 화살표를 배치하는 위치, 단일 화살표를 사용하는지 이중 화살표를 사용하는지 등이다. 코틀린 data class는 스칼라 case class에 매핑된다.

코틀린에서 널 허용 변수를 정의하는 방법은 그루비, C#, F#과 비슷해서 대부분의 사람들은 금방 익숙해진다. 반면 스칼라는 Option 모나드를 사용해 널 허용 변수를 정의하는데, 이게 상당히 어려워서 일부 저자들은 스칼라에 널 안전성(null safety)이 없다고 생각할 정도다.

스칼라의 한 가지 확실한 단점은 긴 컴파일 시간이다. 스파크 리포지토리와 같이 큰 스칼라 본문을 소스에서 빌드할 때 느낄 수 있다. 반면 코틀린은 가장 보편적인 소프트웨어 개발 시나리오에서 빠르게 컴파일되도록 설계됐으며 실제로 자바 코드보다 컴파일 속도가 더 빠른 경우가 많다.

코틀린의 자바 상호운용성
여기까지 읽었다면 아마 null 처리와 검사된 예외의 차이점을 떠올리며 코틀린이 자바 상호운용성 호출의 결과를 어떻게 처리하는지 궁금할 것이다. 코틀린은 자바 형식과 똑같이 작동하는 이른바 "플랫폼 형식"을 드러내지 않고, 안정적으로 추론한다. 이는 즉 널을 허용하지만 널 포인터 예외를 생성할 수 있다는 의미다. 또한 코틀린은 컴파일 시에 코드에 어서션(assertion)을 넣어서 실제 널 포인터 예외 트리거를 피할 수 있다. 플랫폼 형식에 대한 명시적인 언어 표현은 없지만 코틀린이 플랫폼 형식을 보고해야 하는 경우(예를 들어 오류 메시지) 형식에 !를 추가한다.

대부분의 경우 코틀린에서 자바 코드 호출은 예상한 대로 작동한다. 예를 들어 자바 클래스에 getter와 setter가 모두 있는 경우 코틀린은 이를 동일한 이름을 가진 속성으로 취급한다. 마찬가지로 부울(Boolean) 접근자 메서드는 getter 메서드와 동일한 이름을 가진 속성으로 취급된다. 예를 들면 다음과 같다.

import java.util.Calendar

fun calendarDemo() {
val calendar = Calendar.getInstance()
if (calendar.firstDayOfWeek == Calendar.SUNDAY) { // call getFirstDayOfWeek()
calendar.firstDayOfWeek = Calendar.MONDAY // call setFirstDayOfWeek()
}

if (!calendar.isLenient) { // call isLenient()
calendar.isLenient = true // call setLenient()
}
}


이 방식은 자바의 set만 있는 속성에서는 통하지 않는다. 아직 코틀린에서 지원되지 않기 때문이다. 자바 클래스에 setter만 있는 경우 코틀린에서 속성으로 보이지 않는다.

코틀린의 자바 상호운용성은 자바 툴까지 확장된다. 코틀린은 자체 편집기나 IDE가 없다. 대신 인텔리J IDEA, 안드로이드 스튜디오, 이클립스를 포함한 인기 있는 자바 편집기와 IDE를 위한 플러그인이 있다. 코틀린에는 자체 빌드 시스템이 없고, 그래들(Gradle), 메이븐(Maven), 앤트(Ant)를 사용한다.

코틀린의 자바스크립트 상호운용성
코틀린으로 브라우저와 Node.js를 위한 코드를 작성할 수 있다. 타겟이 브라우저와 Node.js인 경우 코틀린은 JVM 바이트 코드로 컴파일되지 않고 자바스크립트 ES5.1로 트랜스파일된다.

자바스크립트는 동적 언어이므로 자바스크립트용 코틀린은 다음과 같이 JVM용 코틀린에서는 사용할 수 없는 dynamic 형식을 추가한다.

val dyn: dynamic = ...

코틀린 형식 체커는 dynamic 형식을 무시하고 자바스크립트가 런타임에 이를 처리하도록 한다. dynamic 형식의 값을 사용하는 식은 작성될 때 자바스크립트로 변환된다. 마찬가지로 코틀린은 기본적으로 이를 무시하고 자바스크립트가 런타임에 식을 해석하도록 한다.

코틀린에서 자바스크립트를 호출하는 방법은 두 가지다. dynamic 형식을 사용하거나 자바스크립트 라이브러리에 대해 엄격한 형식의 코틀린 헤더를 사용하는 것이다. 엄격한 형식의 API로 잘 알려진 서드파티 자바스크립트 프레임워크에 접근하려면 ts2kt 툴을 사용해서 DefinitelyTyped 형식 정의 리포지토리의 TypeScript 정의를 코틀린으로 변환하면 된다.

js(“…”) 함수를 사용해서 코틀린에 텍스트로 자바스크립트 코드를 집어넣을 수 있다. external 한정자를 사용하면 코틀린 코드로 된 패키지 선언을 순수 자바스크립트로 표시할 수 있다. 자바스크립트에서 코틀린 코드를 호출할 수 있지만 이 경우 정규화된 이름을 사용해야 한다.

전체적으로 코틀린은 자바에 비해 JVM에서 실행되는 코드 측면에서 여러 가지 이점을 제공하며 자바스크립트와 네이티브 코드를 생성할 수도 있다. 자바와 비교하면 코틀린은 더 안전하고 간결하며 명시적이다. 객체 지향 프로그래밍 외에 함수형 프로그래밍을 지원하고, 여러 가지 유용한 기능을 제공하며(확장 함수, 빌더, 코루틴, 람다 등) 널 허용 및 널 비허용 형식을 통해 널 안전성을 제공한다. 무엇보다 좋은 점은 자바를 이미 알고 있다면 금방 코틀린을 익혀 실무에 활용할 수 있다는 것이다.  editor@itworld.co.kr

CIO Korea 뉴스레터 및 IT 트랜드 보고서 무료 구독하기
추천 테크라이브러리

회사명:한국IDG 제호: CIO Korea 주소 : 서울시 중구 세종대로 23, 4층 우)04512
등록번호 : 서울 아01641 등록발행일자 : 2011년 05월 27일

발행인 : 박형미 편집인 : 천신응 청소년보호책임자 : 한정규
사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.