[Kotlin] / [코틀린]
Java에서 Kotlin으로 Conversion 작업하기(1)
- [import, String templates, Companion Object, Fragment, ListView Adapter, Lamda, let]
안드로이드에서 100번 강조해도 모자를 코틀린의 사용.
그동안 항상 미뤄왔지만 코드의 간결성, 유지보수적인 측면, 개발자로서의 역량강화 등의 이유로 코틀린 변환 작업을 시작해보려고 한다.
오늘부터 코틀린을 시작할 것이기에 모르는 것 투성이고 코틀린의 컴파일 원리도 잘 모르지만 하나하나 시행착오를 겪어가며 글을 계속 수정할 생각이다.
일단 내가 겪었던 현상 위주로 이 글에 간략히 기록하고 관련 정보를 찾아 업데이트하는 방식으로 진행해보겠다.
가장 먼저 안드로이드 스튜디오의 Code메뉴에서 Conevert Java File to Kotlin File을 눌러 컨버전을 실행해보자.
후.. 이제 하나하나 Java와의 차이점을 기록해보자.
1. Import
//In Java
import com.m3s.skylark.model.Employee
//In Kotlin
import com.m3s.skylark.modelimport.Employee
import 하는 것 부터 다르다.. 해당 Employee Class는 model이라는 패키지 안에 저장되어 있는데, 안의 package 경로가 modelimport로 바뀌었다. 분명 같은 패키지안에 있었는데... 폴더명은 model그대로 인데도 말이다.
Employee Class를 열고 package 부분을 수정하였다.
2. String Templates
코틀린에서의 문자열 템플릿이 바뀌었다.
String 간의 연결을 + 연산자로 나타내지 않는 것이다. 바로 변수에 '$' 기호를 붙이는 것만으로 해당 변수를 찾아 매핑한다.
단, 띄어쓰기가 없을 경우에 뒤의 문자열까지 인식해 에러를 발생시킬 수 있다.
그래서 다음과 같이 중괄호를 같이 써주면 좋다.
val MING = "Minggu"
println("제 이름은 $MING라고 합니다.)
println("제 이름은 ${MING}라고 합니다.)
또 중괄호 안에는 if문과 같은 식을 넣을 수도 있다.
println("제 이름은 ${if (MING.length > 2) MING else "Nothing"} 입니다")
//$표시를 넣고 싶다면 백슬래쉬를 추가
println("\$")
3. Companion Obeject
코틀린에는 정적(static) 변수 혹은 메서드가 없고, 대신 패키지 내에 함수를 선언하여 사용할 수 있다.
바로 그것이 Companion Object 인데, 해당 클래스 가장 밑부분에 추가하는 것이 규칙이다.
const가 상수 선언이다.
4. Fragment 호출하기
Java에서 Fragment를 호출할 때와의 차이가 존재한다.
//In Java
fragmentManager = getSupportFragmentManager();
if (findViewById(R.id.fragment_container) != null) {
if (savedInstanceState != null) {
return;
}
fragmentManager.beginTransaction().add(R.id.fragment_container, new DashBoardFragment()).commit();
}
//In Kotlin
if (findViewById<View?>(R.id.fragment_container) != null) {
if (savedInstanceState != null) {
return
}
supportFragmentManager.beginTransaction().add(R.id.fragment_container, DashBoardFragment()).commit()
}
원래 getSupportFragmentManager()를 호출해서 인스턴스 얻어 사용했지만 여기서는 supportFragmentManager와 같이 변수처럼 사용한다는 점이다. Kotlin으로 변경되면서 싱글톤 패턴을 언어 차원에서 지원하게 되었다. object나 companion object를 사용하면 이것이 가능해진다. 다른 예시로 getActivity()도 activity와 같이 사용할 수 있다.
5. ListView에 Adapter 연결
Smart cast to 'ListView!' is impossible, because 'mDrawerListView' is a mutable property that could have been changed by this time
변경될 수 있는 var 타입을 다른 변수에 대입하려고 할 때 에러가 발생한다.
따라서 add 하기 전에 변경 불가능한 val 변수에 먼저 값을 세팅한 뒤 val 변수를 add 해주는 방법이 있고
변수 자체에 Non-null 표시인 느낌표 두개를 붙여준다.
Adapter 연결 또한 방식이 다음과 같다.
//In Java
mDrawerListView.setAdapter(customDrawerAdapter);
//In Kotlin
mDrawerListView!!.adapter = customDrawerAdapter
6. Lamda 표현식에서 '_' (언더바, 언더스코어)의 사용
람다 식에서 사용하지 않는 변수는 언더바 표시로 바꾼다.
7. 확장함수 let
let 함수를 이용해서 객체의 상태를 변경할 수 있다.
T?. let { } 형태에서의 let 블록 안에는 non-null 만 들어올 수 있어 non-null 체크 시에 유용하게 쓸 수 있다. 객체를 선언하는 상황일 경우에는 elvis operator(?:)를 사용해서 기본값을 지정해줄 수도 있다.
<참조 문서>
www.androidhuman.com/2016-07-10-kotlin_companion_object
blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html
'Andorid' 카테고리의 다른 글
[Kotlin] applicationContext 가져오기 (0) | 2021.02.10 |
---|---|
[Kotlin] Java에서 Kotlin 으로 Migration 작업 (2) (0) | 2021.02.08 |
[Android / Java] ListView 특정 아이템 클릭 이벤트 막기 (0) | 2021.01.18 |
[Android / Java] TextWatcher 클래스를 이용한 계산기 로직 만들기 (0) | 2021.01.12 |
[Android / Java] 심플한 Log TAG 설정 (1) | 2021.01.08 |