본 포스팅은 DroidKaigi 既存のAndroidプロジェクトに Kotlinを導入した話 을 기본으로 번역하여 작성했습니다
제 일본어 실력으로 인하여 오역이나 오타가 발생할 수 있습니다.
실제 슬라이드의 일본어
부분을 번역했다는 점 양해바랍니다.
기존 Android 프로젝트에 Kotlin을 도입한 이야기
#DroidKaigi #DroidKaigiB Jumpei Yamamoto
자기소개
Eight의 Android 앱 개발
Android로 Kotlin 스터디 @Sansan
2016년 1월 15일 Kotlin 에반젤리스트인 타로씨를 초대했습니다!
Kotlin 1.0
Programming Language for JVM and Android
제2회 Kotlin 스터디 @Sansan 3/23 개최결정!!
이야기할 내용
Sansan사의 Eight앱에서의 개발사례를 예로서 Kotlin을 기존 Java 프로젝트에 도입할 때에 배웠던 것을 이야기합니다.
Agenda
Eight
2015년 Google Play Store에 베스트 앱으로 선정되었다! (2년 연속)
Eight Android 앱
Files | Total Lines | |
---|---|---|
Java | 429 | 68527 |
Kotlin | 140 | 10687 |
도입 경위
도입 계기
첫 커밋
class SampleClass {
val name; String? = null
}
손을 대기 시작하고서 궤도에 오르기까지 2-2.5개월
도입 시작 멤버의 반응
시작은 힘들지만 사격하면서 전진!!
도입 추진력
좋았던 부분
Java
Ave. 160lines / File
Kotlin
Ave. 76lines / File
압도적인 효율과 안정성
코드 리뷰가 효율적
함정에 빠진 부분
버전 업에 관한 문제
SNAPSHOT 버전 지정 문제
compile 'com.jakewharton:kotterknife:0.1.0-SNAPSHOT'
JitPack
JVM / Android 라이브러리의 특정 커밋을 얻어서 jar을 빌드해서 배포해주는 서비스
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
dependencies {
compile 'com.github.JakeWharton:kotterknife:36ae5d5ecb'
}
Kotlin 1.0
Programming Language for JVM and Android
함정에 빠진 라이브러리
kotterknife
Jake Wharton씨가 작성한 view injection 라이브러리 Kotlin 버전 Butter Knife
class MainActivity : AppCompatActivity() {
val textView: TextView by bindView(R.id.textView)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Fragment에서는
class MyFragment : Fragment() {
// View에서 재생성되어도 재생성전의 View가 남는다
val textView: TextView by bindView(R.id.textView)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// retainInstance = true를 하면 화면이 회전했을 때에는 Fragment 인스턴스는 해방되지 않고 View가 재생성된다
retainInstance = true
}
override fun onCreateView(
inflater: LayoutInflater?,
container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater?.inflate(R.layout.fragment_main, container, false);
}
}
Kotter Knife에서는 issue 등록된 상태
https://github.com/JakeWharton/kotterknife/issues/5
kapt
Java와 Kotlin의 공존
Kotlin은 100% Java 호환
@JvmField
class Bar {
val name = "name"
@JvmField val password = "password"
companion object {
val staticName = "name"
@JvmField val staticPassword = "password"
}
}
// Java
Bar bar = new Bar();
String name = bar.getName();
String password = bar.password;
String staticName = Bar.Companion.getStaticName()
String staticPassword = Bar.staticPassword
Parcelable
class MyParcelable(var name: String) : Parcelable {
protected constructor(src: Parcel) : this(src.readString())
override fun describeContents(): Int = 0
override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeString(name)
}
companion object {
@JvmField
val CREATOR: Parcelable.Creator<MyParcelable> =
object : Parcelable.Creator<MyParcelable> {
override fun createFromParcel('in': Parcel): MyParcelable {
return MyParcelable('in')
}
override fun newArray(size: Int): Array<MyParcelable?> {
return arrayOfNulls(size)
}
}
}
}
@file:JvmName()
// KotlinExtensions.kt
@file:JvmName("StringUtil")
fun String.prepend(str:String) = str + this
"Kotlin".prepend("Hello! ") // -> Hello! Kotlin
// Java
StringUtil.prepend("Kotlin", "Hello! ");
// > Hello! Kotlin
Null 안전과 Java
Null safety
val nullable: String? = null // Null을 대입할 수 있다
val nonNull: String = "string" // Null을 대입할 수 없다
val nonNull: String = null // 컴파일 에러
notNull한 파라매터에 null을 대입하려고 하면 컴파일 에러
Kotlin관련의 crash원인 TOP
Parameter specified as non-null is null;
non-null으로 지정된 변수가 null
사실은 Java에서 넘겨진 변수
// Java
public class Hoge {
public String getString() {
return null;
}
}
String!은 String으로도 String?으로도 참조 가능하다
@Nullable / @NotNull Annotation
// Java
public class Hoge {
@NonNull
public String getString() {
return "hoge";
}
@Nullable
public String getNullable() {
return null;
}
}
// Kotlin
var hoge = Hoge()
val s0:String? = hoge.nullable
val s2:String = hoge.nullable // @Nullable Annotation을 붙이는 것으로 Kotlin에서 NonNull한 프로퍼티로 받고자 한다면 컴파일 에러
하지만
Java에서는 @NonNull Annotation을 붙인 프로퍼티가 null을 반환해도 정적 체크에 걸려도 에러는 안되므로 주의.
// Java
public class Hoge {
@NonNull
public String getString() {
return null;
}
}
정리
comments powered by Disqus
Subscribe to this blog via RSS.