안드로이드 코틀린 적용 이슈와 해결법 — (1)

최근 코틀린은 자바를 대체할만한 강력한 안드로이드 개발 언어로 부상중입니다. 작년 구글I/O에서 코틀린을 공식적인 안드로이드 개발언어로 지원하기로 한 뒤 더욱 안드로이드 코틀린 적용에 대한 사람들의 관심이 증가한 것 같습니다.

매스프레소(콴다)

사람마다 코틀린을 사용하는 많은 이유가 있겠지만, 제가 코틀린을 적용하기로 결심하게된 가장 큰 이유는 간결한 코드 작성이 가능하기 때문입니다. 간결한 코드 작성은 가독성을 높이고 코드의 품질을 높이고 생산성을 향상시키기 때문에 코틀린 도입에 있어서는 단기적으로도 장기적으로도 큰 장점이 있을 것이라 생각하였습니다. 이는 제가 코틀린을 도입 하기로 하면서 가장 중요하게 생각한 부분이고 실제로 코틀린을 사용하면서 가장 만족하고 있는 부분입니다. 최근 안드로이드 관련 발표나 문서들도 코틀린 기반으로 되어 있는 이유 또한 이러한 간결성 때문이라고 생각합니다.

github에서 language 비율을 확인할 수 있어요!

현재 콴다 앱에는 코틀린을 10% 정도 적용하였고 점진적으로 확장하고 있습니다. 또한, 서브 프로젝트나 샘플 프로젝트를 만들때엔 거의 코틀린만 사용해 개발하고 있습니다. 그동안 겪는 이슈들과 그 해결법들을 공유하려 합니다. 더불어 제가 코틀린을 적용하며 도움을 많이 받았던 참조 링크들도 함께 공유하려합니다.

코틀린 적용 — 1. Class

가장 먼저 만만하게 코틀린을 적용한 곳은 간단한 자바 클래스들이었습니다.

//Java

public class Person { private String firstName; private String lastName;

public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }

우리가 흔히 알고 있는 클래스는 private한 변수들과 그 변수들에 대한 getter/setter메소드들로 이루어져있는데 kotlin은 getter/setter 메소드는 자동 생성 되고, property에 직접 접근하는 것을 기본으로 하기 때문에 다음과 같이 간결한 코드로 작성이 가능합니다.

//Kotlin

class Person(firstName : String? = null, lastName : String? = null)

코틀린 클래스는 굉장히 간결한만큼 사소한 파라미터가 클래스의 특징을 완전히 바꿔버립니다.

var? val? internal?

class Person1(var firstName : String? = null)

class Person2(val firstName : String? = null) // Person2("a").firstName = "SUNOK" >> error

class Person3(firstName : String? = null){ init { //can access firstName System.out.println("My FirstName is $firstName") } } // Person3("a").firstName >> cannot access firstName

코틀린에는 자바에도 존재하는 public, private와 더불어 internal, var, val 등의 접근 제어자들이 있는데 이부분에 대한 정확한 개념이 없어 초반에 약간의 삽질을 겪었습니다. 특히 var, val등의 전혀 아무런 제어자를 부과하지 않은 변수는 객체를 통해 접근할수 없으며 init{} 메소드 안에서만 접근 가능합니다.

class? data class?

We frequently create classes whose main purpose is to hold data. In such a class some standard functionality and utility functions are often mechanically derivable from the data. In Kotlin, this is called a data class and is marked as data

코틀린에서 데이터를 담고, 전달하는 목적을 갖는 클래스들 data 클래스라고 부릅니다. data class는 컴파일 시점에 equals(), hashcode(), toString(), copy() 등의 메소드를 지원합니다. 엄청 강력한 기능인데 class 앞에 data 마크하나만 달면 된다니 정말 신세계였습니다.

Issue — 1. Class

콴다 프로젝트 내 java class들을 전부 kotlin class로 바꾸면서 제일 즐거웠던 점은 4개의 파일 안에 있던 4개의 클래스를 하나의 코틀린 파일에 4줄의 문장으로 변경할 때 였던 것 같습니다. 모락모락 코틀린에 대한 기대감의 씨를 뿌리고 새싹이 자라나는 시기라 더 즐거웠습니다. 하지만 역시 코틀린은 호락호락하지 않습니다. 이런 작은 변화에도 오류를 뿜어내기 시작했습니다.

NonNull is Null

자바개발자라면 피할수 없는 nullPointException이 숨어있다가 코틀린으로 컨버팅하면서 ‘NonNull is Null’라는 이름으로 나타난거죠. 그 전에는 변수들의 nullable에 대한 큰 고민을 하지 않았는데 kotlin 덕분에 nullable한 변수들을 많이 발견하고 처리할 수 있었습니다.ㅠㅠ

Android Studio Kotlin Conveter

친절한 안드로이드 스튜디오에서는 자동으로 kotlin convert를 해주는 툴이 내장되어있습니다. 저의 코틀린 적용도 대부분 이 툴을 활용해서 변경을 하고 오류를 잡아주는 방식으로 시작하였는데요. 하지만 친절한 안드로이드 스튜디오가 너무 친절한 나머지 변수명을 예쁘게(..) 바꿔주는 문제를 발견했습니다.

List question //Java questions : List //Kotlin

//Java boolean available; public boolean isAvailable() { return available; } //Kotlin isAvailable : Boolean

위는 안드로이드 스튜디오 내 코틀린 컨버팅 툴이 범한 오류 중에 일부인데, 물론 Question의 List인데 변수명이 question인 것은 개발자의 잘못입니다. 하지만 친절한 컨버팅 툴 덕분에 List가 텅비는 오류가 발생했습니다. 또, boolean 값 available이란 변수명을 isAvailable이란 예쁜 이름으로 바꿔주어 학생들의 무료 질문권이 사용가능하지만 사용하지못하는 아름다운 오류를 발생시키기도 했답니다.

따라서, 안드로이드 스튜디오 컨버팅 툴을 무조건적으로 신뢰하면 안되고 반드시 기존 Java 코드와 변경사항을 확인하면서 개발자의 의도에 맞게 올바르게 바뀌는지 꼭 확인하여야 합니다!

+

다음 포스팅

안드로이드 코틀린 적용 이슈와 해결법 — (2)

코틀린 적용 — 2. Utils, Builder, Helper, etc.

다음 포스팅에서는 kotlin 개발 패턴에 대해 이야기할예정입니다. 아마 이 포스팅은 코틀린을 100% 적용하는 그날까지 쭉 이어질것 같습니다. :)

기업문화 엿볼 때, 더팀스

로그인

/