Summary of #31DaysOfKotlin Day 26 ~ Day 31

3월 동안, @Androiddev 계정에서 #31DaysOfKotlin 트윗을 올렸었는데, 31일동안 올려진 포스트를 간직하려고 정리하였습니다.

본 포스트의 순서는 다음과 같습니다. 한 개의 글 마다 5일씩 소개합니다.

  1. Day 1 ~ Day 5 : Elvis Operator, String Templates, Destructuring Declarations, When Expression, For loops -> https://blog.uzuki.live/summary-of-31days-of-kotlin-1/
  2. Day 6 ~ Day 10 : Properties and Fields, Data classes, Visibility Modifiers, Default Arguments, Sealed Classes -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-6-day-10/
  3. Day 11 ~ Day 15: Delegate Properties with Lazy, Late-Initialized Properties and Variables, Checking Arguments, Inline, Calling Kotlin from Java -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-11-day-15/
  4. Day 16 ~ Day 20: Reified, Delegation, Extensions, Drawable to Bitamp, Sequences -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-16-day-20/
  5. Day 21 ~ Day 25: Operator overloading, Basic Syntax, KTX iterators, KTX Content Values, DSL -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-21-day-25/
  6. Day 26 ~ Day 31: KTX Bundles, Lambdas,  KTX Spannable String, Parcelable, Extending existing APIs, Scope functions -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-26-day-31/

Day 26 – KTX Bundles

Android KTX 에 있는 간결한 번들 생성기를 기대하세요. putString, putInt 등등 20개의 친구들을 부를 필요가 없습니다. 한번의 선언으로 새 번들을 생성합니다. 물론, array 까지도 관리합니다.

Day 27 – Lambdas

람다는 달콤합니다. 마지막 파라미터가 람다로 제공되면 콜백, Callable, Runnable 를 깔끔하게 정리할 수 있습니다. 예제로 Android KTX는 postDelayed 에 대해 wrapper 를 제공합니다.

Day 28 – KTX Spannable String

강력하지만 사용하기가 어려운- Span API 를 보고 있는 시점입니다. Android KTX 는 SpannbleString 에 대해 가장 많이 쓰는 span 에 대해 확장 함수를 추가하였고, API를 좀 더 사용하기 쉽게 만들었습니다.

Day 29 – Parcelable

Parcelable 의 속도를 사랑하지만, 코드를 작성하기에는 싫다고요? Parcelize 에게 인사하세요.

Day 30 – Extending existing APIs

기본 파라미터와 함께 기존 API를 확장시키는 것은 모두를 행복하게 합니다. Android KTX 는 기본 파라미터를 사용해 한 쪽에만 padding 를 설정할 수 있게 만들었습니다.

Day 31 – Scope functions

 

코틀린의 기본 함수를 실행시켜보죠. let, apply, with, run 의 짧고 강력한 기능은 receiver (this) 를 가지고 있고, arguments 를 가질 수 있고 (it) 값을 반환할 수도 있습니다. 차이점을 살펴보세요.

 

Summary of #31DaysOfKotlin Day 21 ~ Day 25

3월 동안, @Androiddev 계정에서 #31DaysOfKotlin 트윗을 올렸었는데, 31일동안 올려진 포스트를 간직하려고 정리하였습니다.

본 포스트의 순서는 다음과 같습니다. 한 개의 글 마다 5일씩 소개합니다.

  1. Day 1 ~ Day 5 : Elvis Operator, String Templates, Destructuring Declarations, When Expression, For loops -> https://blog.uzuki.live/summary-of-31days-of-kotlin-1/
  2. Day 6 ~ Day 10 : Properties and Fields, Data classes, Visibility Modifiers, Default Arguments, Sealed Classes -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-6-day-10/
  3. Day 11 ~ Day 15: Delegate Properties with Lazy, Late-Initialized Properties and Variables, Checking Arguments, Inline, Calling Kotlin from Java -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-11-day-15/
  4. Day 16 ~ Day 20: Reified, Delegation, Extensions, Drawable to Bitamp, Sequences -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-16-day-20/
  5. Day 21 ~ Day 25: Operator overloading, Basic Syntax, KTX iterators, KTX Content Values, DSL -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-21-day-25/
  6. Day 26 ~ Day 31: KTX Bundles, Lambdas,  KTX Spannable String, Parcelable, Extending existing APIs, Scope functions -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-26-day-31/

Day 21 – Operator overloading

 

연산자 오버로딩을 사용해 코틀린을 (times * 2) 만큼 빠르게 작성하세요. Path, Range, SpannableString 등이 이미 연산자 오버로딩을 사용해 기능을 제공하고 있습니다. Kotlin 과 함께라면, 자기 자신의 연산자를 가질 수 있습니다.

C++ 에서도 있던 기능인 연산자 자체를 오버로딩 하여 작성하는 기능이다. 특히 SpannableString 를 적용할 때 span 을 설정하는 작업을 간단히 할 수 있게 하거나, 어떻게 보면 그리운 Ternary Operator 를 비슷하게나마 재현시킬 수도 있다.

Day 22 – Basic Syntax

[1/2]

클래스를 위한 유틸 함수를 작성하고 싶다면, 코드 파일의 최상단에 넣으세요. 클래스의 static 메서드로서 컴파일됩니다.

[2/2]

클래스에 상수 값을 작성하고 계신가요? 최상단 프로퍼티로 작성하세요. 자동으로 static field 로 컴파일됩니다.

Day 23 – KTX Iterators

 

신기한 곳에 iterator 가 있다? Android KTX 는 ViewGroup, SparseArray 에 iterator 를 추가했습니다. operator 키워드를 이용해 iterator 확장을 선언하세요. Foreach loops 가 iterator 확장을 사용할 것입니다.

Day 24 – KTX Content Values

 

코틀린의 간결함으로 Content Values 에 힘을 더하세요. Android KTX Content Values 생성기를 사용하고, Pair<StringKey, Value> 를 얻으세요.

Day 25 – DSL

[1/4]

무시무시하게 명확한가요? Type-safe 빌더를 이용해 DSL 을 만들 수 있습니다. DSL는 깨끗한 API 를 만들 수 있도록 도와주는데, 물론 당신도 만들 수 있습니다.

[2/4]

Spek는 코틀린 DSL 로 만들어진 테스트 라이브러리입니다. @Annotations 를 사용하는 대신 reflection magic 에 의존하지 않고도 테스트 코드를 선언할 수 있게 해줍니다.

[3/4]

Gradle DSL 가 정적으로 타이핑되길 원하세요? 더 이상 원하지 마세요. Kotlin Gradle DSL 을 사용하면 android gradle plugin 와 통합되는 type-safe build 파일을 만들 수 있습니다. build.gradle.kts 를 참고하세요.

[4/4]

또 다른 DSL의 예제는 Anko 입니다. Anko 는 선언적 코드를 이용해 안드로이드 뷰를 만들 수 있습니다.

Summary of #31DaysOfKotlin Day 16 ~ Day 20

3월 동안, @Androiddev 계정에서 #31DaysOfKotlin 트윗을 올렸었는데, 31일동안 올려진 포스트를 간직하려고 정리하였습니다.

본 포스트의 순서는 다음과 같습니다. 한 개의 글 마다 5일씩 소개합니다.

  1. Day 1 ~ Day 5 : Elvis Operator, String Templates, Destructuring Declarations, When Expression, For loops -> https://blog.uzuki.live/summary-of-31days-of-kotlin-1/
  2. Day 6 ~ Day 10 : Properties and Fields, Data classes, Visibility Modifiers, Default Arguments, Sealed Classes -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-6-day-10/
  3. Day 11 ~ Day 15: Delegate Properties with Lazy, Late-Initialized Properties and Variables, Checking Arguments, Inline, Calling Kotlin from Java -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-11-day-15/
  4. Day 16 ~ Day 20: Reified, Delegation, Extensions, Drawable to Bitamp, Sequences -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-16-day-20/
  5. Day 21 ~ Day 25: Operator overloading, Basic Syntax, KTX iterators, KTX Content Values, DSL -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-21-day-25/
  6. Day 26 ~ Day 31: KTX Bundles, Lambdas,  KTX Spannable String, Parcelable, Extending existing APIs, Scope functions -> https://blog.uzuki.live/summary-of-31daysofkotlin-day-26-day-31/

Day 16 – Reified

 

reified 에 대한 컨셉을 설명하려면 Context.systemService() 가 있습니다. Android KTX 는 타입 파라미터에 reified 를 사용하여 제너릭을 통해 실제 타입을 전달합니다. 이제 더 이상 getSystemService 에 클래스를 전달할 필요가 없습니다!

reified 와 그 근간이 된 Type ereasure 에 대해서는 기존에 블로그 글로 통해 설명한 것이 있다.

Day 17 – Delegation

 

by 를 이용하여 작업을 다른 클래스에 위임하세요. 클래스 위임을 사용하여 상속에 대한 Favor composition 을 행하고, 위임된 프로퍼티를 사용한 프로퍼티 접근 로직을 재사용하세요.

위임 패턴은 자바에서도 자주 쓰이나, 코틀린에서는 어떤 boiler-plate 코드 없이 완전히 지원한다.

Day 18 – Extensions

[1/2]

더 이상의 Util 클래스는 그만! 확장 함수 기능을 사용하여 함수의 기능성을 확장하세요. 함수의 이름을 넣기 전 클래스의 이름을 넣는 것 만으로도, 사용이 가능합니다.
[2/2]

확장 함수는, 소속된 함수가 아니며 원본 클래스를 수정하지도 않고, 컴파일 시간에 static type로서 제공되고, Java 의 static 함수로 통해 컴파일되고, 다형성을 행하지 않는다.

더 이상 설명이 필요 없는, 자바가 할 수 없는 코틀린의 기능이다. 특히 android 의 Context 를 확장 함수 기능을 사용시켜 기능을 구현하면 그 자체로도 훌륭한 Util가 된다.

Day 19 – Drawable to Bitmap

여기서부터는 Android-KTX 에 관한 설명이 많으므로 짧게 넘어갑니다.

Drawable 를 Bitmap 로 변환해보셨다면, 얼마나 boilerplate 가 들어가는지는 당신도 잘 알 것입니다. Android KTX 는 graphics package 를 사용할 때 코드를 좀 더 간결하게 만들어 줄 강력한 기능을 가지고 있습니다.

Day 20 – Sequences

[1/2]

Sequences 는 절대로 존재하지 않는 리스트입니다. Sequence 는 Iterator 의 사촌이며, 시간마다 값을 늦게 생성합니다. map 와 filter 를 사용할 때, 매 단계마다 list 를 생성하지 않고 Sequences 를 생성합니다.

다음 함수로부터 list 에서 Sequence 를 생성할 수 있습니다. Sequence 를 절대로 종료시키지 않는 한,  메모리에서 사라지지 않고 계속해서 남아있습니다. 코틀린의 코루틴을 이용해서 generator 를 사용할 수 있습니다.

이른 바, ‘게으른 평가(Lazy Evaluation)’ 이다. 메서드를 실행할 때 마다 행동을 실행시키는 것이 아닌, 저장해두고 있다가 최종적으로 작업을 시행함으로서 그로 인해 이득을 취하는 것이다.

예전에 Stream 에 대해 설명할 때 아래의 글을 작성했었는데, 그 중 일부만 발췌한다.


함수형 처리에는 중간 작업과 종결 작업이 있다.

위에서 언급되었던 설명 중 ‘스트림 파이프라인을 생성한다’ 라는 설명이 있다.

이 그림 하나로 설명이 가능하다. .filter(), .map() 는 파이프라인 중간에 있어 중간 작업이고, collect() 는 끝에 있으므로 종결 작업이다.

하지만 이 구분이 함수형 패러다임에서의 중요한 부분 중 ‘게으른 평가(Lazy Evaluation)’ 를 설명하는 데에 가장 쉬운 방법이 된다.

물리학을 예로 들어서 설명해보면, 에너지는 사용을 위해 저장되는 위치에너지와 에너지 사용에 해당하는 운동에너지로 분류된다.

명령형 처리 방식에서는 모든 리스트가 운동에너지와 같아, 중간 상태 없이 값을 바로 준다. 함수형 처리에서의 스트림은 나중에 사용하기 위해 저장해두는 위치에너지와 같다.

스트림은 자료의 원천(원본 자료) 에 필터 작업과 같은 스트림에 주어진 조건을 넣어두고, 종결 작업으로 값을 요구하기 전 까지는 위치에너지를 운동에너지로 변환하지 않는다.

이 것을 다시 말하면 파이프라인 객체인 Stream<String> 같은 것을 파라미터로 넘길 수도 있으며, 이 Stream에는 미리 설정한 조건을 가지고 있다.

즉, 불완전한 결과값을 다른 메소드에 넘겨 다른 메소드로 하여금 종결 작업을 처리하게 함으로서 여러 메소드에 있어서 공통된 작업을 캐시해놓거나 필드로 저장하고 있지 않아도 하나의 메소드에서 해결할 수 있다.