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

해당 포스팅은 안드로이드 코틀린 적용 이슈와 해결법 — (1)에서 이어지는 포스팅입니다. 순차적인 코틀린 적용에 대해 이야기하고 있기 때문에 이전 포스팅을 먼저 보고 오시면 좋습니다.

매스프레소(콴다)

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

콴다의 모든 간단한 Java class들을 kotlin으로 변경하고 난 뒤, Utils, Builder, Helper 등 View 등과는 독립적으로 static한 메소드를 구현해놓고 사용하는 Util 클래스들을 먼저 변경했습니다. 그뒤엔 Builder, Helper, Factory 등 하나의 class안에 로직을 담고 있기 때문에 상대적으로 용이한 것들을 변경하였습니다. 이번 포스팅은 트러블 슈팅보다는 kotlin으로 컨버팅하면서 느낀 kotlin의 특성들에 대해 이야기하려 합니다.

Static method, value

보통 안드로이드 개발자 분들이라면 많이 쓰는 메소드나 값의 경우 하나의 클래스를 만들어 static하게 관리하고 계실거라 생각됩니다. 저의 경우도 DateUtils, StringUtils, TooltipUtils, GsonUtils, ImageUtils 등등 여러 곳에서 종종 사용되는 변수값이나 메소드를 한 곳에 모아두고 사용하고 있습니다.

// DateUtils.java public class DateUtils { public static String toKRDateFormatYYYYMMDD(Date date){ if (date == null) return "" return new SimpleDateFormat("yyyy.MM.dd").format(date) } } // DateUtils.kt fun Date?.toKRDateFormatYYYYMMDD(): String { if (this == null) return "" this.let { return SimpleDateFormat("yyyy.MM.dd").format(it) }

Kotlin에서는 static한 메소드를 companion object 안에 정의하라고 합니다. 하지만 저는 Util 함수들처럼 특정한 클래스에 종속될 필요가 없는 경우 그냥 코틀린 파일 안에 function 으로 정의하여 사용합니다.

//kotlin import your.package.name.toKRDateFormatYYYYMMDD

Date().toKRDateFormatYYYYMMDD()

그러면 코틀린 파일에서는 해당 메소드 자체를 import하여 사용할 수 있습니다.

//java import your.package.name.DateUtilsKt;

DateUtilsKt.getKoreanStringsYMD()

자바 파일에서는 해당 파일명kt를 import 해서 사용하실 수 있습니다.

Singleton

public class SingletonObject {

private static SingletonObject object; private SingletonObject(){ }

public static SingletonObject getInstance(){ if(object == null) object = new SingletonObject(); return object; } }

Java에서는 보통 Singleton 객체는 다음과 같이 생성해서 사용합니다. 객체가 필요한 시점에 생성하고 이미 생성되어 있다면 그 객체를 반환합니다.

하지만 kotlin에서 제공하는 기본적인 object는 singleton객체입니다.

object SingletonObject {

}

너무 간단하게 singleton 패턴을 사용할 수 있게 되었네요. 문화충격

Builder

코틀린 클래스의 가장 편리한 점 중 하나를 택하라면 생성자 파라미터에 초기값 설정이 가능하다는 점인데요. 사실 파이썬, JS 등의 언어에서는 당연히 지원되고 있었던 것인데 자바에 적응되어 있던 저에게는 색다른 편리함이었습니다.

public static class UserBuilder { private String firstName; private String lastName; private Int age; public UserBuilder(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public UserBuilder age(Int age) { this.age = age; return this; } public User build() { if(age!=null && age<=0) throw IllegalArgumentException("age must be positive") return new User(this); }

}

위의 모습은 흔히 Java에서 많이 보던 빌더 패턴의 예제입니다. Builder는 어떤 객체를 만들때 필요한 필수적인 값과 추가적인 값들을 초기에 입력받은 뒤 생성하는 방식인데요. 보통 빌드 시점에 해당하는 값들이 올바른 값인지 체크하고 객체에 필요한 코드들을 작성합니다.

class User(var firstName: String, var lastName: String, var age: Int? = null) { init { if (age?.let { it <= 0 } == true) throw IllegalArgumentException("age must be positive") } }

하지만 kotlin을 사용할 경우 Builder 패턴을 굳이 사용할 필요가 없습니다. kotlin에서는 생성자에서 초기값 을 설정할 수 있기 때문에 반드시 필요한 변수 값만 입력받아 사용할 수 있습니다. 또한 객체 생성 시점에 호출되는 init 메소드를 잘 활용하면, 잘못된 변수들에 대해서도 체크할 수 있기 때문에 대부분의 Builder는 굳이 사용할 필요가 없다고 느껴졌습니다.

Kotlin Builder Pattern과 telescoping constructor pattern에 대한 더 자세하고 유용한 예제는 Effective Java in Kotlin, item 2: Consider a builder when faced with many constructor parameters 링크를 참조해보시면 좋습니다.

// var user = User("Sunok", "Jang") var user1 = User(firstName = "Sunok", lastName = "Jang") var user2 = User(firstName = "Gildong", lastName = "Hong", age = 1)

다만, kotlin에서 다양한 변수를 생성자에 두고 사용한다면, 변수명을 명시하며 값을 지정하는 것이 좋습니다.

+

다음 포스팅

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

코틀린 적용 — 3. Kotlin-Android-Extension, Android-Ktx.

다음 포스팅에서는 kotlin을 실제 Activity 등 View들에도 적용하면서 겪은 트러블들과 해결법에 대해 이야기하려합니다.

코틀린을 안드로이드 프로젝트에 적용하려는 모든 분들 화이팅하세요 :)

+

https://github.com/jangsunok/TIL/blob/master/Android/Kotlin.md

개인적으로 코틀린 개발하면서 도움이 되었던 문서 링크들을 모아두고 있습니다.

기업문화 엿볼 때, 더팀스

로그인

/