차세대 안드로이드 개발자를 위한: 커니의 코틀린

By | 2017년 12월 19일

코틀린의 시대가 열렸습니다.

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

 

코틀린, 어떻게 익히면 좋을까요?

코틀린은 러닝커브가 낮다고 합니다. 그래서 경험 있는 자바 개발자들은 코틀린의 기본적인 내용을 파악하는 데 몇 시간만 투자하면 된다고 하는데요. 그렇다면 코틀린 문법을 처음부터 끝까지 나열할 게 아니라 자바와 비교하면서 한눈에 보는 게 낫지 않을까요?

자바가 코틀린 코드로 자동 변환되지만, 그 변환기가 알파고 수준은 아니랍니다(코틀린의 단점 찾았..?). 그렇다면 코틀린다운 코틀린 코드를 작성하는 방법을 익혀, 변환된 코드를 수정하는 방법을 예제로 익히는 게 도움이 되지 않을까요?

게다가 문법만 코틀린인 예제를 위한 예제가 아니라, 실무에서 바로 쓸 수 있는 코틀린다운 코틀린 코드로 구현된 예제라면?

자바에 코틀린 한 조각 넣어보시면 어떤가요?

 

차세대 안드로이드 개발자를 위한 커니의 코틀린

실무에서 쓰는 라이브러리를 활용하여 프로젝트를 개선하는 법까지 한번에!
자바와 비교해 직관적으로 문법을 익힌 후 코틀린다운 코드를 만드는 노하우를 얻는다!

저자: 김태호
출간일: 2017.12.08.

 

1. 어서와, 코틀린은 처음이지?

자바 문법과 코틀린 문법과의 1:1 비교를 통해, 코틀린 문법을 빠르고 쉽게 익힐 수 있도록 도와줍니다.

javakotlin
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. 코틀린의 유용한 기능 소개

동일한 기능을 구현하더라도, 자바보다 더 간결하고 안전하게 작성할 수 있도록 도와주는 코틀린의 유용한 기능들을 소개합니다.

javakotlin
// 반지름을 지정하지 않을 경우 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% 호환되지만, 올바르게 변환하지 않는다면 예상치 못한 문제를 겪게 될 수 있습니다. 코틀린 실무 적용 경험을 바탕으로 한 ‘올바른 자바-코틀린’ 변환 방법과, 자바-코틀린 혼용시 유의해야 할 사항을 통해 여러분의 앱에 코틀린을 적용할 수 있도록 도와줍니다.

javakotlin(변환 직후)
// 버튼 인스턴스
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 등 다양한 플랫폼에서 모든 개발을 코틀린으로 할 수 있도록 하는 목표를 가지고 태어난 언어입니다.

코틀린. 이제 <커니의 코틀린>으로 시작해 보세요.

yes24 / 교보문고 / 알라딘 / 인터파크

* 예제 Github 저장소: https://github.com/kunny/kunny-kotlin-book
* 페이스북 페이지: https://www.facebook.com/kunny.kotlin
* 페이스북 커뮤니티: https://www.facebook.com/groups/kunny.kotlin

* 정오표: 커니의 코틀린 정오표

* 출간 전, 저자(김태호)와의 인터뷰 글을 보시려면 여기로