2018.02.07 11:20

Kotlin 공부 후기

Lyn
조회 수 1466 추천 수 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 •
?

List of Articles
번호 제목 글쓴이 날짜 조회 수
158 현재 MSDN Download Page file Lyn 2013.09.23 19681
157 폰트 TTF와 OTF 그 역사의 아이러니함. Lyn 2015.06.30 3046
156 특정 Thread가 Wait계열 함수에 의해 Block 중인지 확인하기 file Lyn 2012.06.28 27436
155 컨테이너가 파괴될 때 소유한 객체 자동으로 파괴하기 Lyn 2008.10.22 36911
154 잠시후 한국시각 21일 0시부터 VS 2015 런칭행사를 합니다. Lyn 2015.07.21 2456
153 웹 개발 문서가 MDN으로 통합 Lyn 2017.12.05 915
152 요즘 공부를 안하니 쓸게 없네요 Lyn 2018.06.02 737
151 외주도 안하고 공부도 안하니 이 서버가 무용지물이 되어가고 있군요 Lyn 2018.09.18 950
150 왜 MemberFunction Pointer 를 cout 으로 출력하면 1이 나올까 Lyn 2017.03.27 1916
149 오랫만에 인증서 업데이트와 서버 이전 Lyn 2018.07.07 683
148 오랫만에 서버 업데이트... 인데 Lyn 2015.03.03 5929
147 프로그래밍 대회 알고리즘 파트 문제 2 secret Lyn 2008.11.22 15485
146 심심해서 만들어본 폰 요금 계산기 Lyn 2019.08.18 609
145 서버를 이전했습니다. Lyn 2014.08.19 28894
144 서버를 Windows 2012 R2로 교체 하였습니다. 1 Lyn 2013.09.29 22223
143 새해복 많이받으세요 Lyn 2019.02.05 613
142 새해다 ... Lyn 2012.01.01 28255
141 사이트에서 http2 프로토콜을 지원 하기 시작 했습니다. Lyn 2016.10.01 4604
140 사이트에 SSL 인증서를 적용 했습니다... 적용 방법 Lyn 2016.09.07 2290
139 사용중인 FireFox 플러그인. Lyn 2010.05.18 42534
Board Pagination Prev 1 2 3 4 5 6 7 ... 8 Next
/ 8