/ GDG, ANDROID, KOTLIN

GDG Korea Android Magazine #16

GDG Korea Slack#android 채널에서 오고간 주제를 정리한 포스트 입니다. 가입은 여기에서 하실 수 있습니다.

안드로이드가 8번째 생일을 맞았습니다.

post

안드로이드가 세상에 나온 지 벌써 8년이 되었습니다.

처음 출시된 당시만 해도 공대생스러운 디자인(하드위어/소프트웨어 모두)과 다양한 환경 지원을 위한 SDK의 부족 때문에 꽤나 고생했었는데, 그 당시에 비하면 지금은 일취월장 했네요.

이랬던 안드로이드가…

post

이렇게…!

post

8년이라는 시간이 일반적으로 그리 짧은 시간은 아니지만, 출시 후 약 2년 후부터 모바일 플랫폼 점유율에서 계속 우위를 차지하고 있는 것을 보면 대단합니다.

2년 뒤인 10년째, 그리고 그 이후 안드로이드의 행보가 어떻게 될 진 모르겠지만 안드로이드 개발자로서 부디 계속 번창했으면(?) 하는 바람입니다. :)


Android Studio 2.2 정식 버전 출시

이번 Google I/O에서 발표되었던 안드로이드 스튜디오 2.2의 정식 버전이 공개되었습니다.

그 어느 버전보다 프리뷰와 베타 버전이 많이 출시되었었는데요, 그만큼 기존에 비해 추가된 기능이 다양합니다.

공식 발표 내용은 다음 포스트를 참조하세요.

안드로이드 스튜디오 2.2를 경험해 보세요.
Link

프리뷰 버전에서 사용할 수 있던 기능들은 예전에 열린 Google I/O 2016 Extended Seoul 행사에서 발표로 진행되었습니다.

자세한 기능이 궁금하신 분은 다음 영상을 참고하세요.

추가로, 현재 2.2 정식 버전의 레이아웃 프리뷰에서 한글이 제대로 표시되지 않는 문제가 있습니다.

이에 대한 해결 방법을 GDG Korea Android 전 운영자이신 전병권님(@skyisle)께서 공유해 주셨습니다.

먼저, 안드로이드 스튜디오가 설치된 경로 내의 다음 파일을 확인합니다. (OS X의 경우 안드로이드 스튜디오 실행파일을 오른쪽 선택한 후 ‘Show Package contents’로 하위 폴더 탐색 가능)

// Windows
{Android Studio 설치경로}/plugins/android/lib/layoutlib/data/fonts/fonts.xml

// OS X
{Android Studio 설치경로}/Contents/plugins/android/lib/layoutlib/data/fonts/fonts.xml

앞의 파일을 연 후, 다음과 같이 <family lang="ko"> 블록 아래에 내용을 추가해주면 됩니다.

diff --git a/fonts.xml b/fonts1.xml
index 117e17b..6bfb328 100644
--- a/fonts.xml
+++ b/fonts1.xml
@@ -347,6 +347,9 @@
     <family lang="ko">
         <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font>
     </family>
+    <family lang="ko">
+        <font weight="400" style="normal" index="1">NanumGothic.ttf</font>
+    </family>
     <family lang="und-Zsye">
         <font weight="400" style="normal">NotoColorEmoji.ttf</font>
     </family>

(Source: gist)


Kotlin 1.0.4 출시

자바를 대체하여 사용할 수 있는 언어인 코틀린의 1.0.4 버전이 출시되었습니다.

Kotlin 1.0.4 is here
Link

이번 버전에서 기존 버전의 코틀린 사용자들에게 영향을 주는 부분은 다음과 같습니다.

try/catch 문에서 값(val) 할당하기

기존 버전에서는 다음과 같이 try/catch 문을 사용하면 값(val)에 새로운 값을 다시 할당할 수 있습니다.

val x: Int
try {
    x = 1
} catch (e: Exception) {
    // 예외가 발생할 경우 x에 새로운 값인 2가 할당됩니다.
    x = 2
}

값(val)은 자바의 final 키워드를 사용한 변수와 동일한 역할을 하며, 한 번 값이 할당되면 새로운 값을 할당할 수 없습니다. 그런데, 위와 같은 경우 새로운 값을 할당할 수 있게 되므로 앞의 규칙을 위반하게 됩니다.

따라서, 코틀린 1.0.4 부터 이와 같은 코드에 대해 컴파일시 경고를 표시하며, 다음 버전인 1.0.5 부터는 에러로 처리할 예정이라고 합니다.물론, 이를 해결하기 위한 quickfix를 IDE에서 제공한다고 하니 큰 걱정은 하지 않아도 될 것 같네요.

앞의 예제의 경우 다음과 같이 try/catch 블록에서 결과를 반환하도록 처리함으로써 해결할 수 있습니다.

val x = try {
    1
} catch (e: Exception) {
    2
}

어노테이션 프로세서 사용 방법 변경

Dagger, Retrofit 등 어노테이션 프로세서를 사용하여 코드를 생성하는 라이브러리를 사용하는 경우, 기존 버전의 코틀린에서는 빌드스크립트에 다음을 코드를 추가해야 했습니다.

kapt {
    generateStubs = true
}

코틀린 1.0.4 부터는 앞의 코드를 추가하지 않고, 대신 다음과 같이 플러그인을 적용하는 것으로 대체됩니다.

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

// 어노테이션 프로세서를 사용하기 위해 플러그인 적용
apply plugin: 'kotlin-kapt'

RxJava2, 무엇이 달라질까요?

RxJava, 아직 제대로 써 보지도 못한 것만 같은데 벌써 다음 버전 릴리즈 준비가 한창 진행되고 있습니다.

RxJava2에서 바뀌는 부분에 대해 정리한 글이 올라왔는데요, 해당 글을 간단히 정리해 보았습니다.

RxJava2: An Early Preview
Link

패키지 이름 변경

기존 버전의 RxJava와 새로운 버전을 함께 사용할 수 있도록 패키지 이름이 다음과 같이 변경됩니다.

RxJava1:

compile 'io.reactivex:rxjava:x.y.z'

RxJava2:

compile 'io.reactivex.rxjava2:rxjava:x.y.z'

null 이벤트는 더 이상..Naver

기존에는 null을 이벤트에 실어 보낼 수 있었습니다. (대표적으로 Void를 리턴하는 경우가 있음)

하지만, RxJava2부터는 이 경우 바로 NullPointerException을 발생시킨다고 합니다.

따라서 기존 버전을 사용하는 라이브러리나 서비스 중 null을 이벤트로 보내는 부분이 있다면 이를 Enum, 상수 혹은 Optional을 사용하여 null이 아닌 값을 보내도록 수정해야 합니다.

Backpressure의 압박에서 벗어나자 - Flowable

RxJava를 처음 적용하면서 가장 간과하기 쉬운 부분이 아마 백프레셔(Backpressure)일 겁니다.

백프레셔는 이벤트를 생성하는 속도보다 받아서 처리하는 속도가 느린 상황을 의미합니다.

이벤트를 구독할 때 이 상황이 발생한 경우 처리하는 방법을 명시해 주지 않으면 (onBackpressureXXX() 등을 사용) 예외가 발생하게 되는데, 안드로이드는 메인 쓰레드에서 이벤트를 구독하는 경우가 많아 이를 처리하지 않은 경우 높은 확률로 예외가 발생하곤 했습니다.

따라서, 백프레셔가 발생할 수 있는 상황일 경우 명시적으로 백프레셔 처리를 정의할 수 있도록 Flowable이라는 새로운 형태의 Observable이 추가되었습니다.

다음은 Flowable을 사용하는 간단한 예를 보여줍니다.

Flowable.create((FlowableEmitter<Integer> emitter) -> {
emitter.onNext(1);
emitter.onNext(2);
emitter.onComplete();
}, BackpressureStrategy.BUFFER);

함수 이름 변경

람다를 사용하지 않는 경우, 인자 수에 따라 이벤트를 처리하기 위해 Func0, Func1과 같은 인터페이스를 사용했습니다.

RxJava2에서는 이 이름들이 대폭 변경됩니다. 따라서 새 버전으로 업데이트 할 경우 이 부분을 대폭 수정해야 합니다.

자세한 내용은 공식 위키 페이지를 확인하세요.

블로킹 호출 처리

RxJava1 에서는 블로킹 호출을 하려면 Observable.toBlocking().first()와 같은 방식으로 처리해야 했습니다.

RxJava2에서는 이를 하나의 메서드로 통합하여 Observable.toBlockingFirst()로 사용합니다.

전체 변경 사항이 궁금하신 분들은 원문 링크 뿐 아니라 공식 위키 페이지를 함께 참고하시는 것을 추천합니다. (분량이 꽤 많습니다)


어노테이션 프로세서, 만들어서 사용하자

어노테이션 프로세서를 사용하면 코드를 좀 더 효울적이면서도 깔끔하게 작성할 수 있습니다.

다음 글에서는 자신이 필요한 어노테이션을 만들고 이를 사용하는 방법에 대해 소개합니다.

Annotation Processing in Android Studio
Aitor Viana
Link


대화에 직접 참여하고 싶으신가요? GDG Korea Slack#android 채널을 방문하세요. 아직 가입하지 않으셨나요?

kunny

커니

안드로이드와 오픈소스, 코틀린(Kotlin)에 관심이 많습니다. 한국 GDG 안드로이드 운영자 및 GDE 안드로이드로 활동했으며, 현재 구글에서 애드몹 기술 지원을 담당하고 있습니다.

Read More