새로운 포스트 시리즈 – Advanced Kotlin Programming

소개

Kotlin이 안드로이드 주 언어가 된지 1개월 정도 지났습니다. 그래서 틈틈히 코틀린을 공부하면서 인터넷에 JetBrains에 일하고 계신 Hadi Hariri님의 강의를 찾아 공부할 예정입니다.
O’Reillt Media 에서 내놓은 강의로 러닝타임 3시간의 영상 강의로 제목은 ‘Advanced Kotlin Programming From Nested Functions to Asynchronous Programming’ 입니다. 한글로 번역하자면 ‘고급 Kotlin 프로그래밍, 중첩 함수에서 비동기 프로그래밍에 이르기까지‘ 입니다.

주로 강의에 대한 내용을 메모, 차후 설명을 덧붙일 예정입니다.

강의 목적

  • Kotlin을 다른 JVM와 비교하여 확장 가능하고 독창적인 접근법을 이해한다.
  • 중위(infix)함수, Tail 재귀 및 람다 확당과 같은 고급 주제 검토
  • 클래스를 위해 제공하는 창의적 기능에 대한 탐색
  • Delegation에 대한 것을 코틀린이 어떻게 컨트롤 하는지
  • 제너릭 관련 문제에 대한 심층적인 연구 – 제약조건, 공분산 등
  • 코틀린이 메타 프로그래밍 및 introspection을 위해 사용하는 기술
  • 코루틴을 이용한 비동기 프로그래밍

강의는 http://shop.oreilly.com/product/0636920052999.do 에서 볼 수 있습니다.
이번 기회로 코틀린에 대해 더 자세히 알고 실전에서 사용할 수 있으면 좋겠다고 생각합니다.

Android Studio 3.0 – Java 8 language feature

2017년 3월 15일, Android Studio 내부에서 Java 8 language feature을 활성화하기 위해 사용하던 Jack compiler 가 Deprecated 되었다.

처음엔 Jack toolchain 을 통해 Java 8 지원 추가를 테스트하였으나, 시간이 지남에 따라 Annotation processors(어노테이션 처리기), Bytecode analyzers and rewriters(바이트 코드 분석, 작성기) 들이 Jack로 전환하는 비용이 높아서 앞으로 Java 8 언어 기능들이 안드로이드 빌드 시스템에서 기본적으로 지원되게 할 예정이라고 한다.

물론 Jack 대신 Retrolambda를 쓰고 있었기에 문제 없었다. 그리고 안드로이드 스튜디오 3.0 Preview가 나오면서 위에 밝혀진 ‘Java 8 언어 기능에 대한 안드로이드 빌드 시스템 내부 지원’ 이 Desugar 란 이름으로 돌아왔다.

Desugar 구조

Desugar 의 구조는 아래와 같다. (출처: Android Developer, Use Java 8 language features)

desugar structure

 

.java 가 javac 를 통해 컴파일 되면 class가 나오는데, 이 class를 기반으로 desugar 작업을 통하여 나온 결과물을 dex 화 시키는 것이다.

즉 desugar를 말로 표현하자면 javac – dex 사이에 Java 8 언어 기능을 사용한 코드를 하위 호환에 맞게 변환시키는 과정이다.

물론 기존과 같이 SDK 버전(minSdkVersion)에 따라 작동 범위 차이는 있다.

Java 8 Language Feature, API

Java 8 언어 기능 / API호환되는 minSdkVersion
람다식모두 지원됨. 하지만 람다에 잡히는 모든 값이 serializable 해야함
메서드 참조모두 지원됨.
형식 주석모두 지원됨. 하지만 타입 어노테이션에 대한 정보는 컴파일 시간에 활성화된다. (런타임 상 정보는 나오지 않음) ElementType.TYPE_USE, ElementType.TYPE_PARAMETER 외의 TYPE들은 24 이상부터 사용 가능
기본, 정적 인터페이스모두 지원됨
반복 가능한 주석모두 지원됨
annotation.Repeatable24 이상
AnnotatedElement.getAnnotationByType(Class)24 이상
스트림24 이상
Functional Interface24 이상
Method.isDefault()24 이상
Function util24 이상

desugar 가 도입되면서 그레들 플러그인에도 변경점이 생겼는데, 바로 Retrolambda 와 Jack, DexGuard를 사용중일 경우 desugar를 도입하도록 경고를 표시하는 점이다.

warning of using desugar

아직까지는 위 3개를 사용중이면 위 3개가 우선적으로 작동하지만 좀 더 desugar가 안정화 되면 마이그레이션 할 예정이다.

결국은 Java8를 컴파일 옵션으로 두는 프로젝트면 기본적으로 활성화되게 되어, 별도 플러그인이 필요없어진 셈이다.

만일 비활성화 하고 싶다면 gradle.properties 파일에 android.enableDesugar=false 를 두면 되는거같다.

 

Android – setLocalOnly (Notification) 정리

setLocalOnly

NotificationCompat.Builder setLocalOnly (boolean b)

기본적으로 안드로이드의 알림은 원격 기기(블루투스 기기 등)에 전송될 수 있는데, 전송되지 않게 하는 메소드이다. 즉 로컬 안드로이드 기기에서만 표시하게 하는 것이다.

알림창에 상주할 필요가 있는 앱에서 많이 필요할 것 같다. 최근 스마트워치 같은게 빠르게 추세화 되기도 하고.

출처: Android Developer / NotificationCompat.Builder.html#setLocalOnly(boolean)