-->

[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 함수를 이용해서 객체의 상태를 변경할 수 있다.

itemName이 null이 아니라면 이벤트함수 발생

T?. let { } 형태에서의 let 블록 안에는 non-null 만 들어올 수 있어 non-null 체크 시에 유용하게 쓸 수 있다. 객체를 선언하는 상황일 경우에는 elvis operator(?:)를 사용해서 기본값을 지정해줄 수도 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<참조 문서>

hongku.tistory.com/345

 

코틀린의 문자열 템플릿(Kotlin String Templates)

코틀린에는 문자열 템플릿이란 것이 있습니다. 문자열 안에서 외부에 있는 변수를 가져올 수 있는 방법입니다. 예를들어서 Java에서 "Hello, Kotlin!"을 찍어본다고 합시다. (이때 "Kotlin"은 name이라는

hongku.tistory.com

www.androidhuman.com/2016-07-10-kotlin_companion_object

 

코틀린에는 static이 없다? - companion object

#Android, #Kotlin, and #Tesla

www.androidhuman.com

wdprogrammer.tistory.com/9

 

[Java][Kotlin] Fragment 간단 사용법

2018-10-13-android-fragment 로그인 Fragment를 만들고 메인 액티비티에서 보여주는 것을 한 번 해보자. 추가적으로 java 코드로 보고 코틀린으로 변환해보자. 1. Java 1. Fragment 생성 Fragment는 Android Stud..

wdprogrammer.tistory.com

withhamit.tistory.com/92

 

[kotlin] Smart cast to 'Type' is impossible, because 'xxx' is a mutable property that could have been changed by this time.

data class People(var name: String) // name이 변경될 수 있는 var people: People val names: MutableList  = mutableListOf() people.name?.let {     names.add(people.name) // error..

withhamit.tistory.com

 

blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html

+ Recent posts