kotlin을 공부하기 시작했다
Android개발자이면서 이제서야 Kotlin을 공부하기 시작했다.
Kotlin을 공부할 시간이 부족했다. (swift는 공부했으면서... 핑계는 다양하다.)
회사에서는 아직 JAVA를 사용하고 있기 때문에 조금 많이 늦어진 경향이 있다.
Kotlin In Action 이라는 책과 Toy Project를 하면서 공부하고 있다.
Kotlin In Action은 코틀린 컴파일러 개발자가 작성했다고 한다.
Kotlin 철학, 특성, 기초, 기타 중요한 사항들은 이 책에서 모두 볼수 있다.
https://play.google.com/store/apps/details?id=com.danchoo.tagalbum&hl=ko
하기 링크에서 Kotlin을 테스트 할수 있다.
요즘 JAVA 를 벗어나서 Kotlin으로 많이 전향을 하고 있는 것으로 알고있다.
주변에 필자 빼고 다 Kotlin을 사용한다. (흐으으윽....)
회사에서 절대로 Kotlin을 사용안한다고 못을 박아버렸기 때문에 더이상 할말이 없다...
혼자라도 공부를 하고있다.
Kotlin은 NullPointException을 없애기 위해 노력했다고 한다.
?, !! 와 같은 타입 시스템을 적용하여 null이 될수 있는 변수와 없는 변수를 구분하여 실행시점에 알수 있게 해준다.
하지만 절대적으로 NullPointException이 발생하지 않는 다는 것은 아니다.
Runtime중 null이 들어가지 말아야 하는 변수에 null이 들어가는 경우도 있다. JAVA와 혼용해서 사용했을때 발생 할수 있다고한다.
Swift도 null이 들어가지 말아야 하는 변수에 null이 들어가는것을 경험했다. (DB를 연동하다 발생한것 같은데 자세히 기억은 안난다.)
분명 NullPointException이 발생할 수 있다. 하지만 JAVA 보다는 NullPointException에 자유로울 것 같다는 생각이 든다. (컴파일시 체크를 해주기 때문에)
(JAVA에서는 Annotation @NonNull을 사용 해서 null이 들어가지 않는 것을 어느정도 보장해 줄 수 있다.)
JAVA보다 코드가 간결하다.
조금밖에 사용해보지 않았지만 간결하다는 것을 느낀다.
- Null Check가 JAVA보다는 적게 사용하는 것처럼 느껴진다. (Swift로 했을 경우 Objective C 보다 null check문이 확연히 줄었다.)
개발스타일 마다 다를것으로 예상한다. 지인은 더 많이한다고 한다.
함수로 인자값을 전달 했을 때 Annotation을 사용하지 않고 NonNull을 만들수가 있다.
- Jetpack의 일부인 KTX를 사용함현 DataBinding보다 View를 Bind하는 것이 간결하다.
toy project에있는 Fragment 에서 RecyclerView를 사용하는 것을 예제코드로 가져왔다.
RecyclerView의 id는 recyler 이고 변수와 Bind하는 것은 아무것도 없다.
그냥 사용하면 된다.
https://smartstore.naver.com/happysiso
private lateinit var adapter: BucketListAdapter
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initRecycler()
}
private fun initRecycler() {
recycler.layoutManager = LinearLayoutManager(context)
adapter = BucketListAdapter()
adapter.listener = object : BucketListAdapter.BucketListListener {
override fun onClickItem(item: BucketItem, position: Int) {
}
}
recycler.adapter = adapter
}
Fragment에서 KTX를 사용할때 주의해야 할 점이 있다.
onCreateView에서 View와 bind되어있는 변수를 사용하면 NullPointException이 발생하면서 crash가 발생한다.
View가 Create된 이후에 변수를 사용하면 NullPointException이 발생하지 않는다.
위와같은 문제로 onCreateView에서는 inflate만 하고 onViewCreated이후에 변수들을 사용했다.
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_bucket_list, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initTitle()
initRecycler()
initViewModel()
}
- extention이 있기 때문에 Custom을 하지 않고 Object들을 확장할 수 있다. (추후 Posting에서 자세히 다룰것이다.)
상속받지 않고 Object들을 확장하기 때문에 확장에 필요한 이것저것 들을 제외시키고 필요한 코드만 들어간다는 것이다.
- getter / setter 가 자동으로 생성 된다. (추후 property관련 Posting에서 자세히 다룰것이다.)
getter / setter를 함수로 정의하지 않아도 된다. 멤버변수가 10개 이상 선언되어있는 class 를 상상하면 엄청난 것이다.
- 기타 등등....
너무 많다...그냥 라인수가 줄어든다......
개발속도가 빠르다고 한다.
사실 잘 모르겠다. 라인수가 줄어서 그런것일까??
라인수가 줄면 코드가 간결해지기 때문에 보기도 편하고 디버깅하기도 쉬워진다. 그런 이유인지... Kotlin으로 실무를 해보지 않아서 체감은 안된다.
함수형 언어이다
하기 코드를 보자 funtion을 인자값으로 넘겨서 해당 코드를 실행할 수있다.
private fun test() {
// runFunction에 actionFunction 함수를 인자값으로 넘긴다.
runFunction(this::actionFunction)
runFunction {
// function 실행 내용
}
}
private fun actionFunction() {
// function 실행 내용
}
private fun runFunction(func : () -> Unit) {
// 인자로 받은 function실행
func()
}
필자가 함수형 언어의 가장 좋은점이라고 생각하는 것은 Thread에 안전하고 재사용성을 높인다.
JAVA와 호환성이 좋다.
JAVA -> Kotlin, Kotlin -> JAVA 함수및 Object들을 사용할때 변환하는 과정이 필요없다.
JAVA에서 Object생성하듯이, 함수 호출하듯이 사용하면 된다.
Interface도 마찬가지다 Java처럼 Kotlin처럼 사용하면 된다.
JAVA -> Kotlin , Kotlin -> JAVA로 함수호출 및 변수를 참조할때 NullPointException을 조심하자.
JAVA에서 Kotlin으로 처음 변환을 할때 가장 큰 함정이 있다.
Android Studio기능중에 하나가 Java코드에서 Kotlin으로 클릭 몇번으로 변환해준다고 한다.
절대 믿지 말자!!!!
변환은 되긴 한다. 아마 실행도 될것이다.
하지만 실행해보면 결과가 처참하다는 것을 알게 될것이다.
여러명이 롤백시키고 다시 구성하는 것을 보았다.
변환툴을 믿고 나중에 변경하자.... 라는 마인드를 가지고 있으면 위험하다.
JAVA와 kotlin은 철학부터가 다른 언어다. 특징도 당연히 다르다.
JAVA와 비슷한 언어라고 할수도 있고 완전 다르다고 할수 있다.
Kotlin은 JAVA 보다 Javascrip나 Swift와 더 비슷하다고 느낀다.
'Android > Kotlin' 카테고리의 다른 글
[Android] Compose State, Statefull, Stateless, State Hoisting (0) | 2022.03.26 |
---|---|
[Android] Compose 와 선언형 UI (0) | 2022.03.26 |
[Android] Kotlin Object keyword (singleton, companion, anonymous inner class) (0) | 2019.09.01 |
[Android] Kotlin Property (프로퍼티) (0) | 2019.08.23 |
[Android] Kotlin 지연 초기화(lazy initialization - lateinit, by lazy) (0) | 2019.08.15 |
댓글