Post

Functional Kotlin with exercises Review

도서출판 ’인사이트‘의 도서 지원을 받아 작성한 리뷰입니다

Image

나는 원래(물론 지금까지도) 문법적으로 답답한 Java 를 매우 싫어하며 안드로이드와 Spring 개발을 Scala 로 하는 (지금생각하면) 기행에 가까운 개발을 하기도 했었다. 그 후 Kotlin 이 출시되어 관심을 가지고 있다가, 현재는 Scala 를 버리고 모든 백엔드 개발을 Kotlin 로 하는 중이다. 단 JVM 기반의 Kotlin 만 사용하며, 다른 환경에 대해서는 지식이 전혀 없다. 내가 주력으로 쓰는 다른 언어인 C#과 비교 했을때는 각각 장/단점을 가지고 있어 둘의 장점만을 갖춘 무언가가 나오기를 기대하는 중이다.

하지만 자금력 넘치는 Microsoft 가 만든 C# 에 비해 비교적 돈이 없는 Jetbrains 의 Kotlin 은 비교적 책을 찾기가 어려운 편인데, 이번에 무려 한국어로 번역된 책을 지원 받게 되어 읽게 되었다.

일단 난 지금까지도 사용하기 편하고 코드가 안정적이고, 문법이 강력한 언어를 선호 하는 것이기 때문에 함수형 패러다임 자체에는 별 관심이 없다. Scala 를 쓸 때도 그냥 “좀 더 좋은 Java” 의 느낌으로 썼다.

1장에서 해당 부분을 언급 하고 있는데 난 코드를 이해하거나 수정하기 어렵게 만드는 기능들을 제외한 Kotlin 설계자들의 생각이 옳았다고 생각한다. 혼자 일 할 때는 상관 없지만, 협업을 하게 되면 꼭 한명정도는 언어의 모든 기능을 다 활용하지 않으면 죽는 병에 걸린 환자들이 있어 나를 피곤하게 만들었기 때문이다. 그래도 Delegate Type 정도는 지원 해 줬으면 좋았을텐데 하는 아쉬움은 있다(Kotlin 2.0.0 기준으로 KFunctionN 은 변수로서 선언이 불가능하다)

그 이후 초반에는 Anonymous Method 와, Lambda 에 등 Function 과 Type 참조에 문법 설명이 나온다.

6장 에서는 Java 호환성을 해결 하기 위한 Functional interfaces 에 대해서 다룬다. Kotlin 으로 클래식 안드로이드를 개발 하는 경우가 아니라면 아마 쓸 일은 없을 기능일거다. 나도 요즘은 Jetpack Compose 를 사용한다. 7장에서도 역시 JVM 의 기능 제약을 Kotlin 이 우회 하는 방법과 Java 호환성을 처리하는 방법을 다룬다. 개인적으로 같은 함수를 여러번 ByteCode 에 생성 하는 방식으로라도 inline 처리는 알아서 해 줬으면 좋겠다는 생각을 하면서 읽었다.

8장에서는 각종 컬렉션 대상 함수에 대해 다룬다. 어지간한 언어들은 다 있는 기능들이라 그냥 한번 쓱 읽고 넘어가면 문제 없을거고, Kotlin 이 처음이면 확실히 연습하고 가는 것이 좋다. 함수형 프로그래밍에서 가장 흔하게 쓰이는 기능들이니 말이다. SQL 을 알고 있다면 비슷하다고 생각하면 이해가 될 것이다(아예 해당 기능을 SQL 과 문법까지 비슷하게 만든 것으로 C# 의 Linq 와 Groovy 의 Ginq 도 있다) 나는 얼마나 일상적으로 사용했는지 Kotlin 으로 개발을 하고 몇년이 지나서야 for loop 를 사용할 기회가 생겼고 그제서야 내가 한번도 써본적이 없어 문법을 모른다는 것을 깨달았다(사실 지금도 잘 모른다. 꼭 써야할때는 다시 문법 찾아본다). 아쉬운 것은 Kotlin 자체적으로는 Parallel 을 지원 하지 않는다는 점이다(Sequence 도 마찬가지. 나는 필요하면 kotlin-parallel-operations 를 사용한다)

9장은 Sequence 에 대해 다룬다. 만약 성능을 신경 써야 한다면 꼭 읽어보도록 하자. 책에 써있기로도 (내가 확인 한 결과로는 현재의 2.0.0 까지도) Sequence 에 대한 추가적인 강력한 최적화는 해 주지 않는데(Haskell, C# 등은 해준다), 이미 컴파일이 완료된 Sequence 관련 함수들을 사용 하기 때문에 그런게 아닌가 싶긴 하다. 아마 Linq 와 비슷한 기능이 들어간다면 될지도… 그렇지만 연산 순서가 Iterable 과 다르게 원소단위이고, 재사용 가능하고, Lazy 하게 처리 가능하다는 장점 덕분에 필요 한 경우 이용한다면 연산 속도를 대폭 올릴 수 있다는 것을 알아두면 좋다.

단 초판1쇄 기준 151 페이지에는 오역이 있다. Sequence 에서 처리할때 더 “빠른” 이라고 되어 있는데 정확하게 해석하면 “느린” 으로 번역되어야 한다. 리뷰 등록 후 정오표 등록을 요청 하려고 한다.

10장은 Kotlin 의 DSL Builder 에 대해 다룬다. 언어 레벨에서 DSL 을 지원하는 케이스는 생각보다 흔치 않고 잘 쓰면 매우 강력한 기능이다. 유명한 Kotlin 관련 라이브러리들이 DSL 을 매우 적극적으로 활용하여 사용중이다.

하지만 나는 업무상 많은 DSL을 구현 해 보고, 사용 해 보았으며 결과적으로 모두 망한(…. 이유는 DSL 을 처음 설계 한 사람의 퇴사 / DSL 사용자의 교체로 인한 지식 단절, DSL 을 사용 하려면 필요한 IDE를 회사가 비 프로그래머에게 사주지 않아 사용성 나쁨, 프로그래머가 쓸거면 그냥 평소 쓰던 언어 쓰는게 러닝커브가 적음 등등…) 이유로 DSL 에 대한 트라우마가 있는 상태라 기업이 해당 DSL 을 전폭적으로 밀어주는 경우 아니면 사용 하지 않기에 이 부분은 그냥 적당히 읽고 넘어갔다.

11장은 Scope Function 에 대하여 다룬다. 해당 기능은 작지만 언어를 보기 깔끔하게 만들어 줘서(개인적으론 대부분 null check 코드를 안써도 되는 장점이 컷다) 자주 쓰게 된다. also 와 let 을 원칙적으로는 구별 해서 써야 한다는 것을 이 책을 보고 처음 알았지만… 책에서도 그냥 구별없이 쓰는경우가 많다는 식으로 설명 하고 있다. 나는 한글자 짧으니 그냥 let 을 쓰겠다.

12장은 Context Receivers 에 대하여 다룬다. 간단히 얘기하면 확장 함수 호출에 제약을 거는 방법인데… 아마 직접 만들어서 쓸일은 별로 없을 것 같다.

13장은 Arrow 에 대하여 다룬다. Kotlin 표준에서 제외된 함수형 기능들을 구현한 라이브러리인데… 직접 사용 해 본 적은 없다. 하지만 책을 보니 JVM 의 특성(Variadic template 지원 안함, Delegate 지원 안함 등..) 으로 인해 모양이 예쁘지 않다. 왜 제외되었는지 알 수 있을 정도로. Memoization 샘플코드에서는 피보나치 수열을 구할 때 DeepRecursiveFunction<> 을 사용 하고 있는데 tailrec modifier 를 써서 예제를 만들었으면 좀 더 깔끔했을 것 같다.

13장이라니 상당히 내용이 많아보이지만, 해당 책의 실제 내용 페이지는 200페이지 남짓이다. 즉 이 책은 Kotlin에 대해서도, 함수형 프로그래밍에 대해서도, Kotlin 에서의 함수형 프로그래밍에 예제에 대해서도 깊게 다루는 바이블 형식의 책이 아니며, 접한지 얼마 안된 사람들이 더 빠르게 업무에 기법을 적용할 수 있게 해주는 핸드북 형식의 책이라고 할 수 있다. Kotlin 초보가 업무를 빠르게 처리하기 위하길 위해서 보기를 강력히 추천 하는 책이다.

This post is licensed under CC BY 4.0 by the author.