Kotlin(7)
-
Fatal Exception: java.util.ConcurrentModificationException에 대한 간단 정리
비정상 종료를 줄이기 위해서 앱에 파이어베이스를 추가하고나서, 간간히 java.util.ConcurrentModificationException 예외가 발생한 것을 볼 수 있었다. 이름에 Concurrent가 들어가있는만큼, 비동기 문제겠거니...하고 추측하고 있었는데 아무리봐도 해당 코드는 메인 스레드에서 리스트 내용을 업데이트하는 코드가 아닌가. 동시성 문제가 발생할만한 상황이 아닌데 어째서 이런 예외가 발생하는거지... 하는 의문에 빠져서 java.util.ConcurrentModificationException에 대해 찾아봤다. ConcurrentModificationException을 구글에 검색하면 수많은 블로그가 나온다. 다들 숱하게 경험한 문제란 얘기인 셈. 누군가 잘 정리해놓은 자료를 보..
2024.02.16 -
[Flutter] Flutter에서 SharedPreferences에 저장한 값을, Android 네이티브 영역에서 참조해보자.
여기서는 Flutter 패키지 중 SharedPreferences를 지원하는 shared_preferences 패키지를 사용합니다. 다른 패키지를 사용하는 경우, 이 글의 내용은 별 다른 쓸모가 없을 가능성이 높습니다. Flutter에서의 Shared Preferences 요구사항을 구현하다보면 값을 저장해야되는 경우가 생깁니다. 복잡한 데이터라면 데이터베이스를 사용하는 방법이 좋겠지만, 간단한 플래그나 설정값 등을 저장하기 위해서 데이터베이스를 사용하긴 아무래도 부담되기 마련입니다. 이럴 때 우리는 Shared Preferences를 사용하곤 합니다. Flutter에서도 이런 요구사항은 당연히 필요하기 마련인지, shared_preferences 패키지가 제공됩니다. 이번 글에서는 shared_pref..
2021.10.28 -
Kotlin에서 JSONObject .get*의 확장 함수를 만들어봤다. (reflection, generics, reified)
반복 구문의 발생 Java, Kotlin에서 JSONObject을 사용하여 JSON으로 작성된 데이터 구조를 파싱할 때, getInt, getString 등을 사용하는 경우가 많았다. 이 메서드는 문자열 키를 받아서 매칭되는 값을 반환하는데, 매칭되는 값이 없을 경우 Exception을 던지게 되어있다. Exception이 발생한 경우에는 null을 반환하도록 코드를 작성하면, 아래와 같다. try { JSONObject.getInt("key") } catch (JSONException e) { e.printStackTrace() null } try { JSONObject.getString("key") } catch (JSONException e) { e.printStackTrace() null }위에서..
2020.09.07 -
코틀린으로 배우는 함수형 프로그래밍 연습문제 #3 [푸는 중]
[연습문제 3-2] X의 n승을 구하는 함수를 재귀로 표현해보자. 함수의 선언 타입은 다음과 같다. fun power(x: Double, n:Int): Double fun power(x: Double, n:Int): Double { return when(n) { 1 -> x else -> power(x*x, n-1) } }[연습문제 3-3] 입력n의 팩터리얼인 n!을 구하는 함수를 재귀로 구현해보자. tailrec fun factorial(x: Int, result: Int = x): Int { return when(x) { 1 -> result else -> factorial(x-1, result*(x-1)) } }[연습문제 3-4] 10진수 숫자를 입력받아서 2진수 문자열로 변환하는 함수를 작성하라...
2020.01.19 -
Kotlin <-> Java 클래스를 서로 참조 못할 때(Can not find symbol)
gradle에 다음과 같은 설정을 빼먹으면, Java로 선언한 클래스가 빌드 타임에 Kotlin으로 생성한 클래스를 참조하지 못한다. 빌드하기 전 IDE상에서는 잘 참조하고 있는 것처럼 표시하며, app의 build.gradle에서 선언해줬다 하더라도 하위 모듈에서는 해당 플러그인을 적용하도록 다시 선언해줘야 한다. 일반적으로 프로젝트 생성 시점에 언어를 Kotlin으로 선택하면 자동으로 적용되는 항목이기에 몰라도 크게 문제가 될 상황은 없지만, 레거시 코드를 부분적으로 참조한다거나 리펙토링할 때 헤멜 수 있는 문제이다. apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions'
2019.11.03 -
[Android] Parcelable in Kotlin
[스마이트]일단 뼈대는 완성했다.를 만들면서 Activity간에 Data Class를 전달해야 할 일이 발생했다. 사실 아이템과 관련된 내용들을 전체 Activity에서 사용하기 때문에, 굳이 Data Class를 전달하지 않고도 사용할 방법을 찾으려면 찾을 수는 있었겠지만… 예전에는 Serializable을 사용했던 걸로 기억하지만, Serializable은 내부적으로 많은 리플렉션과 다량의 오브젝트를 생성하기 때문에, 안드로이드 앱의 전체적인 성능을 낮추며 배터리를 소모하는 원인이 된다고 한다. (Parcelable과 Serializable 비교, Charles 님) 물론 Kotlin이 Java Wrapper는 아니지만, Serializable을 사용하더라도 크게 다르지는 않을 듯 싶다. - (Kot..
2019.03.06