안드로이드 프로젝트를 하면서 코틀린으로 코드를 짜는 동시에 스칼라도 동시에 이용해보았다. 두 코드 모드 자바와 코드가 뒤섞여 있다.
왜 이런 코드가 나왔능가하면 코틀린은 자바로 짜다가 코틀린으로 옮겨타는 과정에서 그러했고
스칼라는 스칼라로만 출발했는데 안드로이드 개발 자체가 스칼라와 잘 맞지않는 부분이 있었기 때문에 어쩔수없이 자바 인터페이스등을 만들어야할 필요성이 생겼기 때문이다.
스칼라로 안드로이드 어플리케이션을 만드는것은 쉽게 할짓은 아니다. 그 이유를 몇가지 대보면 아래와 같다.
1. 스칼라 - 안드로이드 스튜디오의 지원미약
은근히 인텔리제이 툴 자체에서 코틀린으로 밀고있기 때문에 스칼라를 쓰려면 따로 설정을 해주어야 한다. 개인이 만든 플러그인을 가져다 쓰고있는데 현재는 2.11버전에서만 작동하는것으로 보인다.
2. 비동기 처리와 AsyncTask 버그
아무도 이 복잡한것을 쓰지 않는다고는 하는데, 그래도 네트워크를 태워 비동기를 구현할때 바로 생각해볼수 있는 방법이다. 근데 스칼라는 허무맹랑하게 NPE를 태워보낸다. 그렇다고 해서 Actor모델을 이용하는것도 쉬워보이지 않는다. 시간이 아까워 삽질시간을 적게 가져갔으나 어쨌든 좀 그렇다.
그래서 결정적으로는 스칼라 자체 Future를 이용하면 나름 깔끔하게 처리할수는 있다.
코틀린에서는 아직 정식지원은 아닌 coroutine을 지원하는데, 이 방법도 깔끔해서 좋지만, 스칼라 Future가 객체지향에 더 가까운듯 보인다.
3. null처리
스칼라는 Option이 있고 코틀린은 ?이 있다. 스위프트도 비슷하다. ?가 존재한다.
결과적으로 스칼라 코드는 null을 제거해버리려면 다 제거할수는 있다. 귀찮아서 그렇지.
코틀린에서는 ?을 잘 이용하면 편안하게 NPE에서 좀 벗어날수 있도록 보이지만, 자바와 연결된 코틀린에서는 NPE가 많이 뜨며, 그 외 버그가 확 줄어보이지는 않는다.
스칼라 코딩하시는분들도 한자라도 더 쓰는걸 귀찮아 하는듯 보인다. Option은 구조 잡기가 조금 귀찮다.
4. 어노테이션
스칼라로 개발할때는 어노테이션이 잘 안먹는다. Retrofit과 같은 라이브러리는 스칼라로만 작성할수가 없는것으로 보인다.
5. 인자가 하나인 인터페이스 구현
자바 1.8이나 코틀린에서는 심플하게 그냥 () => 이런식으로 박아주면 된다. 스칼라를 이용할때는 고쳐놨더라도 컴파일러가 또 에러를 뱉어내는 상황이 있다.
findViewById 을 줄여보려고 공통으로 빼서 함수리러럴형태로 이용할수도 있으나 해보면 알겠지만 그다지 안줄여진다.
6. findViewById
스칼라는 코틀린보다 길다. 코틀린은 바로바로 그냥 냅다 id를 이용해 바로 코딩을 할수있다. 예전에는 코털나이프인지 코틀나이트인지 하는 버터나이프 대체재가 필요한것으로 보이나, 지금은 그냥 코틀린 익스텐션을 통해 바로바로 불러올수있다.
다만 게터, 세터도 축약해 버리며 모든것을 그냥 바로 쓸수있게 해놓아서 가끔 헷갈리는 부분이 있기는 하다.
7. new
코틀린은 new가 없다. 솔직히 new가 없어야 코드안에서 뭔가 결합되는것 없이 테스타블 코드가 나오는건 알겠고, 코드관습으로 대충 알아먹을수 있는건 알겠는데 굳이 이렇게까지 해야되는지는 잘 모르겠다.
크게 불편한건 아닌듯.
스칼라에서는 좀 불편하다. apply()를 예상하기가 좀 힘들어 직관적으로 이용하기도 불편하며 new가 동반되는 코드를 짜고 있다. 할거면 하고 말거면 말면 좋겠는데 짜다보면 그렇게 변한다.
8. 그외
다음 프로젝트를 한다면 코틀린으로 할지, 스칼라로 할지 고민중이다. 스칼라는 책을 써버려서 뭔가 열심히 해야할것같고, 코틀린은 편해서 끌릴수밖에 없다.
현재는 20:80 정도로 코틀린으로 기울어져 있다. 스칼라에서 아까운 기능은 scala Future정도만 좀 아깝고 나머지는 코틀린이 훨 나은걸로 느껴진다.
스칼라는 이러한 느낌이다.
함수형도 좋고, 지향하는바도 좋은데 언어 자체가 개발을 더 어렵게하는 느낌이다. '굳이?' 라는 생각이 아직도 있다.
코틀린은 이러한 느낌이다.
아 안드로이드를 다 먹어버리려고 작정을 했구나. 확실히 편하다. 다만 모 블로그 글처럼 생산성이 확 오르는건 아닌것 같다. 그건 사람마다 다르므로 좀 오버같다.
'모바일 > Android' 카테고리의 다른 글
코드안에 파이리 (1) | 2017.05.08 |
---|---|
android.content.res.Resources$NotFoundException (0) | 2017.05.08 |
android 버전 sdk 매칭 (0) | 2017.04.18 |
Material Design (0) | 2017.04.17 |
vector image, ArrayIndexOutOfBoundException (0) | 2017.04.17 |