글 목록 보기

2018.02.07 02:50

Kotlin 공부 후기

Lyn
조회 수 469 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

코틀린 혼자서 사용해 본 지 한달이 좀 넘은거 같아서 일단 느낀점 정리..

 

1. property 는 자바 Bean과 호환성이 있는건 좋다. 문제는 자바에서 만든 property 를 코틀린쪽에서 부를 때인데 setFoo / getFoo 를 호출 하는 것도 가능하고, 대입도 가능하다 보니 혼란이 온다...

 

1-2. 대체 안드로이드 API가 왜 이딴식으로 만들어져 있는지는 모르겠지만 ... set / get 이 아니라 set / is 로 매칭되는 애들이 많은데 이런 경우에는 코틀린에서 property 취급을 해주지 않아서 setFoo 를 호출해야 한다..

 

2. 이유는 모르겠지만 JVM 이 delegate를 지원하지 않고 (자바보다 먼저 나온 언어들도 되는건데 ㅡㅡ;) 인터페이스를 구현해서 넘기는 식으로 구현해 오니 생긴 사이드이펙트인데 자바의 lambda 와 마찬가지로 kotlin의 lambda 도 매소드가 하나인 interface 구현의 syntax suger 라서 여러개의 함수를 가진 인터페이스를 구현해서 넘겨야 하는 라이브러리들을 사용할때 별 도움이 안된다. (Ex : 안드로이드의 ViewPager.OnPageChangeListener 같은거...) 

 

3. Java는 기본이 상속가능 / 오버라이딩 가능인데 코틀린은 반대라서 기존 리플렉션을 이용하는 라이브러리를 사용하려면 기껏 언어의 안정성을 위해 설계한 기본을 무시하고 일일히 다 open 해줘야 한다. 특히 Spring 같은 유명 프레임워크를 사용할때 치명적이다.. (뭐 몽땅 open 해주는 후처리용 도구가 있다고 하는데 난 개인적으로 컴파일 끝난 다음에 바이너리를 수정하는 식의 도구 별로 안좋아한다..)

 

4. Java는 기본이 Nullable 인데 코틀린은 기본이 NotNull이라서 기존 라이브러리를 호출할 때 foo?.boo?.zoo 처럼 ?!의 향연이 되거나 foo!! 와 같은 연산자로 언어가 도배가 되기 시작한다.

 

5. 이름으로 Parameter 호출하는 기능이 Java로 만든 코드에서는 동작하지 않는다. (IntelliJ 에서는 예쁘게 이름 띄워 주는데 내가 쓰는건 안된다 =_=)

 

6. 아직 kapt 가 불안정한듯. clean 하고 나면 잘 되는경우가 많다

 

7. 내가 서버프로그래머라서 그럴지 모르겠는데 NotNull이 막상 써보니 그다지 메리트가 없다. 무의미한 값이 나타나는 것 보다는 차라리 죽어주는게 버그를 빨리 찾아주는 것 같다

 

7-2. NotNull이 코틀린의 스펙일뿐 VM 에서 전혀 지원 하지 않다보니 리플렉션을 통해서 Null을 넣어버리면 NullPointerException 이 뜬다 (심지어 코틀린 입장에선 익셉션 발생 하기 전에 체크도 못한다... 어쩌라고) 문제는 데이터를 다루는 많은 라이브러리들이 그렇게 한다는거다

 

8. 확장 함수는 정말 편하다... Delphi 쓰던 시절부터 C#을 쓰는 지금까지 애용하던 기능. C++에서도 Mixin 같은 기법을 이용해서 많이들 썼었는데..

 

9. TypeSafety는 JVM의 한계 때문인지 별로 나아진게 없다

 

https://realm.io/products/realm-database/ 와 https://realm.io/blog/realm-4-3-0-released-w-first-class-support-for-kotlin/ 

에서 가져온 예제코드를 언어별로 보면

 

C#의 경우 Name 이라는 변수명을 컴파일타임에 체크 할 수 있다.(사실 linq 를 지원해도 되는데 relam 이 안하는거같다... 사실 앱스토어의 제약때문에 linq의 기능중 일부가 먹통이라 일부러 뺐을수도 있지만... iOS 지원할 안할경우엔 편한데)

var dogs = realm.All<Dog>().Where(d => d.Name.Contains("Fido"));

 

자바의 경우는 

RealmResults dogs = realm.where(Dog.class).in("name", new String[] {"Larry","Curly","Moe"}).findAll();

 

코틀린의 경우도 

val dogs = realm.where<Dog>().in("name", arrayOf("Larry", "Curly", "Moe"))

 

처럼 "name" 이라는 변수가 문자열로 넘어가게 되어 오타와 같은 실수에서 자유롭지 못하다

 

10. 자바쪽 라이브러리에서 type을 사용해야 할때 Foo::class.java 처럼 추가적인 키워드를 넘겨줘야 하는건 귀찮다... java라는 이름을 볼 때 마다 커피가 땡긴다.

 

11. var, val 은 편하다. 일단 type 추론을 해줘서 길고 긴 클래스명 안써도 된다는건 기본이고, mutable 과 immutable 을 구별 해 놓은것은 실수를 방지하는데 큰 도움이 된다. 문제는 이것도 Reflection을 사용하는 라이브러리에 변수가 넘어가면 사실상 무의미하다는거다 =_=;

 

결론 : 코틀린 언어 자체는 괜찮다. 난 C#이 최고의 언어라고 생각하고 있는데 만약 JVM 위에서 개발 해야 하는데 java는 병신같아서 못쓰겠다면 scala 보다는 kotlin 이 좀 더 나은선택이라고 생각한다. 일단 제작사가 개발툴회사다보니 지원이 빵빵하고, 안드로이드의 공식 언어이기도 하니 확실하게 써먹을만한 플랫폼도 있다.

 

하지만 현실적으론 안드로이드가 아닌 다른 용도로 쓸 거라면 좀 더 고민을 해야할 것 같다. ORM도 아직 JetBrain 에서 만드는 Exposed 조차 알파버전 수준이고 웹프레임워크인 ktor 역시 마찬가지다. java 와의 차이점 때문에 기존 java 라이브러리나 프레임워크를 쓰려면 불편함이 많은 상태에서(scala 보단 낫지만) kotlin 으로 만들어진 베이스 코드가 없다는건 치명적이다. play framework 라는 걸출한 킬러어플리케이션이 있는 scala와는 차이가 심하다. 물론 모든 코드를 밑바닥부터 직접 다 만들어서 쓸 거라면 아무 상관 없겠다.

 

fin

 
TAG •
?

Board Pagination Prev 1 Next
/ 1