Kotlin으로 Android개발 하기
구글에서 "Kotlin First"를 말하기도 하였고,
공식문서도에서도 Kotlin을 예제로 보여주기도 하는 등,
Kotlin의 시대라고 해도 과언이 아닌데요.
여전히 기존 Java프로젝트와 호환되지 않거나
특별한 방법을 추가해야 하는 경우도 있고,
혹은 Android 프레임워크의 특성상 Kotlin을 이용해,
더 쉽게 사용할 수 있는 방법들이 있는데요.
오늘은 Kotlin으로 Android를 개발하면서 알아야 하거나, 주의해야 할 부분들에 대해서 정리해 보겠습니다.
1. kapt
Kotlin에서 Java의 Glide나 Dagger의 Annotation Processing을 사용하기 위해서는 kapt compiler plugin을 사용해야 하는데요.
특히나 Glide는 개인적으로는 모든 프로젝트에 사용되고 있을 정도로 많이 사용하고 있어서,
중요한 부분인 것 같습니다.
kapt플러그인을 사용하기 위해서는, 아래와 같이,
app레벨의 build.gradle에 apply해 주어야 합니다.
많이 사용하는 Glide의 경우에도 공식페이지에 가면 아래와 같이 설정하라고 되어있는데요.
아래와 같은 java를 위한 dependency의 annotationProcessor부분을 변경해 주어야 합니다.
아래와 같이 kapt로 변경해 주어야 하는 것이지요.
그럼 kapt compiler plugin 인이 적용되어서 annotation을 원할하게 사용할 수 있습니다.
annotationProcessor를 사용하는 라이브러리에는 다 적용해 주어야 하는데요.
다만 주의할 것은 annotationProcessor를 kapt로 바꾼다고
모든 라이브러리가 정상적으로 동작을 보장하지는 않는다는 것 입니다.
해당 라이브러리에가 kotlin에서의 호환성을 보장하고 있는지 개별적인 Library에서 확인해 보아야 합니다.
2. findViewById
Java를 쓸 때는, xml에서 작성한 요소를 찾아올 때 findViewById를 했었는데요.
kotlin에서도 findViewById를 계속 이용해야 할까요?
아닙니다.이제는 그냥 view의 id로 바로 referencing할 수 있습니다.
(물론 이것은 kotlin구성시 같이 설치됬던 extension에 의한 것으로 Kotlin언어에 의한 것은 아닙니다)
예전엔 findViewById해서 레퍼런싱해와서 거기에 setText를 했어야만 했는데요.
이제는 아래와 같은 코드 한줄로 가능합니다.
이것만으로도 kotlin을 써야할 이유가 될 것 같습니다.
3. Java클래스 불러오기
안드로이드에서 Activity같은 Java클래스를 불러오기 위해서는
아래와 같이, "클래스 이름::class.java"와 같은 형식을 취하면 됩니다.
4. Util클래스
Java에서는 static클래스인 Util클래스를 많이 사용하였었는데요.
Kotlin에는 static 클래스가 존재하지 않습니다.
이에 대한 다양한 대안들이 있기는 하지만,
개인적으로는, Package 레벨 함수를 이용하는 것이 좋은 것 같은데요.
이들은 모두 Java의 static 함수로 컴파일 되기 대문입니다.
사용방법은 정말 간단합니다.
그냥 패키지안의 파일 내에, 함수를 아래와 같이 넣어주기만 하면 됩니다.
맨윗줄의 @file:JvmName("DB_Helper")은 Java파일에서 불러서 사용할 경우,
파일명이 DB_Helperkt가 되어버리므로,
file의 JvmName을 임으로 DB_Helper로 수정해 주는 것입니다.
모든 패키지내의 파일이 Kotlin이라면 상관이 없습니다.
위의 방법이외에도, 아래와 같이 companion object를 사용하는 방법도 존재합니다
@JvmStatic을 붙여서 컴파일 되거나, Java코드에서 이용할 때,
스테틱한 메소드로서 사용하기 위함입니다.
5. Intent 보내고 받기
아래와 같이 버튼을 클릭하면 메세지를 SecondActivity로 보낼 수 있습니다.
apply 메소드를 이용한 점이 특별해 보이는데요.
apply메소드는 scope function중 하나인데요.
Scope Funciton에 대해서 좀 더 자세히 알고 싶다면 아래 글을 참조해 주세요.
>> 코틀린의 Scope Function(let, with, run, apply, also)을 알아보자
SecondActivity에서 다음과 같이 받아올 수 있는데요.
참고로 java의 static을 대신하는 companin object에 const키워드가 쓰인 걸 볼 수 있습니다.
이 const는 compile타임에서의 상수임을 의미하는데요.
Java코드에서도 가져다 사용하기 위해서 붙여주었습니다.
6. Java에서 Kotlin코드 사용하기 위한 Annotation들
새롭게 모든 코드를 Kotlin으로 쓰면 좋겠지만, 현실은 그렇지 않지요.
기존의 Java코드에 Kotlin에서 만든 클래스나 객체를 사용해야 할 경우가 생기는데요.
코틀린으로 작성한 코드에 annotation들을 붙이면, Kotlin의 클래스나 객체들을 호출 해 사용할 수 있습니다.
5-1. @JvmName
이름에서 유추할 수 있듯이,
JVM에서 이름을 설정합니다.
file도 대상이 될 수 있고, 메소드 명도 대상이 될 수 있습니다.
위의 Util클래스 다룰 때, "@file: JvmName"을 사용했었습니다.
5-2. @JvmOverloads
Kotlin에서는 Primary생성자에서 값을 초기화해 놓고, 여러개 생성자를 사용한 것과 같은 효과를 낼 수 있는데요.
이 경우, Java코드에서 이 생성자를 가져다 쓰려고 하면 오류가 나게 될 것입니다.
왜냐하면, 이러한 문법은 Java에 없기 때문인데요.
클래스는 코틀린으로 리팩토링했는데,
복잡하고 긴 코드의 Java코드에서 이 클래스를 사용하고 있는 경우,
이러한 애노테이션을 이용하면 Compile Error없이 사용해 줄 수 있습니다.
5-3. Const와 @JvmStatic
아래와 같이 Const로 선언된 field는 Java에서 static field로 바뀌어 집니다.
또한 @JvmStatic으로 선언된 메소드의 경우 역시 java에서 static한 메소드로 전환되어 지구요.
사실 익숙하지 않은경우 Java와 Kotlin을 같이 쓰는 것은 쉽지만은 않은 것이 사실입니다.
컴파일 에러가 나는 경우는 안드로이드 스튜디오의 도움을 얻을 수 있지만,
그렇지 않고 exception이 나는 경우 찾기가 어려울 수도 있기 때문 입니다.
6. Java에서 사용하던 라이브러리들 대응
6-1. Realm
realm-android 플러그인 을 추가할 때, 반드시 kotlin-android 과 kotlin-kapt 뒤에 추가해 주어야 합니다.
또한 model class에는 open키워드를 붙여주어야 하구요.
Kotlin에서 Realm을 사용하는 방법에 대한 글은 아래를 참조해 주세요.
https://realm.io/docs/java/latest/#kotlin
6-2. Glide
Glide는 위에서도 다루었던는데요.
annotationProcessing부분을 kapt를 수정하는 부분이 필요합니다.
위에서 자세히 다루었으므로 여기서는 넘어가도록 하겠습니다.
6-3. RxJava
기존에 implement하던 RxAndroid대신 RxKotlin을 implement해야 합니다.
아래와 같이 rxkotlin을 rxjava와 같이 implement해주면 됩니다.
implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'
6-4. 기타
위에서 언급했던 라이브러리 이외에도,
많은 라이브러리가 있는데요.
호환이 되는 라이브러리와 그렇지 않은 라이브러리가 있을 것 입니다.
Retrofit이나 OKHttp같이 Square사의 라이브러리는
Kotlin사용에 매우 적극적이어서 그만큼 대응도 쉽습니다.
중요한 것은 Kotlin이 java에서 사용하던 라이브러리의 호환을 100%보장해 주지 않는다는 점과
이를 확인하고 사용하는 것은 개발자들에 달려있다는 사실이지요.
계속해서 공식문서를 확인하고 업데이트 상황을 주시하고 있어야 겠습니다.
7.정리
새로운 언어를 적용한다는 것은 역시 많은 변경을 필요로 하네요.
Android의 많은 부분이 코틀린을 고려한 상태로 만들어지겠지만,
여전히 호환되지 않거나 특별한 방법을 추가해야 하는 경우가 있습니다.
안드로이드에서 Kotlin을 이용할 때, 필요로 하는 대응 방법들에 대해서는 이 글을 통해 업데이트 하겠습니다.