코틀린의 시대가 열렸습니다.
모바일 데이터베이스 업체 렐름(Realm)에서는 자사 데이터베이스 사용자 10만 명을 대상으로 익명 조사를 실시했다. 이 조사에 따르면, 코틀린을 공식 지원하기 전 자바로 개발하던 앱의 20%가 이제 코틀린으로 개발되고 있다. – 관련기사

코틀린, 어떻게 익히면 좋을까요?
코틀린은 러닝커브가 낮다고 합니다. 그래서 경험 있는 자바 개발자들은 코틀린의 기본적인 내용을 파악하는 데 몇 시간만 투자하면 된다고 하는데요. 그렇다면 코틀린 문법을 처음부터 끝까지 나열할 게 아니라 자바와 비교하면서 한눈에 보는 게 낫지 않을까요?
자바가 코틀린 코드로 자동 변환되지만, 그 변환기가 알파고 수준은 아니랍니다(코틀린의 단점 찾았..?). 그렇다면 코틀린다운 코틀린 코드를 작성하는 방법을 익혀, 변환된 코드를 수정하는 방법을 예제로 익히는 게 도움이 되지 않을까요?

게다가 문법만 코틀린인 예제를 위한 예제가 아니라, 실무에서 바로 쓸 수 있는 코틀린다운 코틀린 코드로 구현된 예제라면?
자바에 코틀린 한 조각 넣어보시면 어떤가요?
차세대 안드로이드 개발자를 위한 커니의 코틀린
실무에서 쓰는 라이브러리를 활용하여 프로젝트를 개선하는 법까지 한번에!
자바와 비교해 직관적으로 문법을 익힌 후 코틀린다운 코드를 만드는 노하우를 얻는다!
1. 어서와, 코틀린은 처음이지?
자바 문법과 코틀린 문법과의 1:1 비교를 통해, 코틀린 문법을 빠르고 쉽게 익힐 수 있도록 도와줍니다.
java | kotlin |
---|---|
public class Foo { int a; char b; public Foo(int a, char b) { this.a = a; this.b = b; } // a의 값만 인자로 받는 추가 생성자 public Foo(int a) { this(a, 0); } // 두 인자의 값을 모두 0으로 // 지정하는 생성자 public Foo() { this(0, 0); } } | class Foo(val a: Int, var b: Char) {
// a의 값만 인자로 받는 추가 생성자 // 기본 생성자를 반드시 호출해야 함 constructor(a: Int) : this(a, 0) // 두 인자의 값을 모두 0으로 // 지정하는 생성자 constructor(): this(0, 0) } |
2. 코틀린의 유용한 기능 소개
동일한 기능을 구현하더라도, 자바보다 더 간결하고 안전하게 작성할 수 있도록 도와주는 코틀린의 유용한 기능들을 소개합니다.
java | kotlin |
---|---|
// 반지름을 지정하지 않을 경우 25로 설정합니다. void drawCircle(int x, int y) { // 원본 메서드를 호출합니다. drawCircle(x, y, 25); } // 모든 매개변수를 갖는 원본 메서드 void drawCircle(int x, int y, int radius) { … } // 중심축이 (10, 5)인 원을 그립니다. // 반지름을 지정하지 않았으므로 원의 반지름은 25 drawCircle(10, 5); | // 반지름의 기본값으로 25를 갖는 함수 fun drawCircle(x: Int, y: Int, radius: Int = 25) { … } // 중심축이 (10, 5)인 원을 그립니다. // 반지름을 지정하지 않았으므로 원의 반지름은 25 drawCircle(10, 5) |
메서드의 매개변수가 많으면 축약된 매개변수를 갖는 메서드와 전체 매개변수를 갖는 메서드를 별도로 만들어 사용했습니다. 매개변수에 아무 값이 대입되지 않을 경우 기본값을 지정할 수 없어서 두 종류의 메서드를 만들어야 했습니다. | 코틀린에서는 함수의 매개변수에 기본값을 지정할 수 있습니다. 왼쪽 자바 코드와 역할이 동일합니다. |
3. 자바 코드, 코틀린으로 어떻게 변환해야 할까요?
코틀린은 자바와 100% 호환되지만, 올바르게 변환하지 않는다면 예상치 못한 문제를 겪게 될 수 있습니다. 코틀린 실무 적용 경험을 바탕으로 한 ‘올바른 자바-코틀린’ 변환 방법과, 자바-코틀린 혼용시 유의해야 할 사항을 통해 여러분의 앱에 코틀린을 적용할 수 있도록 도와줍니다.
java | kotlin(변환 직후) |
---|---|
// 버튼 인스턴스 Button button = … // 버튼에 리스너를 설정합니다. button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { … } }); | // 버튼 인스턴스 val button = … // 버튼에 리스너를 설정합니다. button.setOnClickListener(object: View.OnClickListener{ override fun onClick(v: View) { … } }) |
뷰의 클릭 리스너를 설정하는 예입니다. | 여기서 View.OnClickListener 인터페이스는 단 하나의 함수만 포함하고 있습니다. |
kotlin(다시 변경) | kotlin(수정 후) |
---|---|
// 버튼 인스턴스 val button = … // onClick() 함수는 View를 인자로 받고 아무 인자도 // 반환하지 않으므로(void) // 다음과 같이 함수형으로 표현할 수 있습니다. button.setOnClickListener({ view: View -> Unit … }) | // 함수형 인자를 전달하므로 괄호를 생략하고 // 간략히 표현할 수 있습니다. button.setOnClickListener { … } |
이 경우 SAM 변환이 지원되므로, 인터페이스 구현 대신 onClick() 함수만 전달할 수 있습니다. setOnClickListener() 함수의 인자로 인터페이스 대신 함수 구현을 전달하도록 변경한 코드입니다. | onClick() 함수의 인자가 하나이므로 람다 표현식에서 인자를 생략할 수 있고, 람다 표현식에서 Unit을 반환하므로 반환 타입 또한 생략할 수 있습니다. 또한, setOnClickListener() 함수의 유일한 인자이자 마지막 인자로 함수형 인자가 전달되므로, 괄호를 생략할 수 있습니다. |
4. 실무에 바로 쓰는 예제
‘예제를 위한 예제’가 아닌, 실무 프로젝트에 바로 적용할 수 있는 수준의 예제를 제공합니다. 예제에서는 안드로이드 애플리케이션에서 사실상 표준으로 사용하는 라이브러리인 Glide, Retrofit, RxJava, 안드로이드 아키텍처 컴포넌트(Android Architecture Components), 대거(Dagger)를 코틀린과 함께 사용하는 방법을 다룹니다.
코틀린은 단순히 안드로이드 개발만을 위해 존재하는 게 아닙니다. iOS 앱뿐 아니라 풀스택 웹 개발, 임베디드와 IoT 등 다양한 플랫폼에서 모든 개발을 코틀린으로 할 수 있도록 하는 목표를 가지고 태어난 언어입니다.
코틀린. 이제 <커니의 코틀린>으로 시작해 보세요.
* 예제 Github 저장소: https://github.com/kunny/kunny-kotlin-book
* 페이스북 페이지: https://www.facebook.com/kunny.kotlin
* 페이스북 커뮤니티: https://www.facebook.com/groups/kunny.kotlin
* 정오표: 커니의 코틀린 정오표
* 출간 전, 저자(김태호)와의 인터뷰 글을 보시려면 여기로