• JvmStatic with Synchronized

    JvmStatic & Synchronized 어노테이션이 동시에 선언된 정적 함수를 어디에서 (자바 or 코틀린) 호출하느냐에 따라 lock을 거는 객체가 달라지는 점을 주의해야 한다. 아래는 간략한 예시 코드이다. sealed class A { object A1 : A() object A2 : A() companion object { @JvmStatic @Synchronized fun getInstance(): A { return if (/* ......


  • Android 11 GROUP BY 동작 변경

    일반적으로 GROUP BY 절은 반드시 그룹 함수(COUNT, MIN, SUM 등…)와 함께 쓰여야 한다. 다른 데이터베이스는 SELECT * FROM {table} GROUP BY {column} 같은 쿼리를 허용하지 않는다. SQLite는 이를 허용하고 있지만 이러한 쿼리의 결과는 예측할 수 없다. 이와 별개로 SQLite 버전에 따른 동작 변경 사항이 있어서 기록해둔다. TABLE dog SELECT *...


  • Duplicate class found in modules

    의존성 충돌 문제가 발생했을 때를 위한 기록… Error: Duplicate class {clazz} found in modules {moduleA} and {moduleB}. Error: Conflict with dependency {dependency} in project ‘:app’. Gradle을 사용하여 안드로이드 프로젝트의 dependency tree를 확인한다. ./gradlew app:dependencies 만약 출력을 텍스트 파일로 쓰고 싶다면 아래와 같이 입력한다. ./gradlew :app:dependencies > filename.txt 만약 HTML 파일...


  • Git 저장소마다 다른 사용자 정보 설정하기

    Git을 설치하고 나서 사용자 정보(이름과 이메일 주소)를 설정할 수 있다. 커밋 할 때마다 이 정보를 사용하며 모든 저장소에 적용되어 우리는 딱 한 번만 설정해 주면 된다. $ git config --global user.name "dudmy" $ git config --global user.email dudmy@example.com 만약 저장소마다 다른 사용자 정보를 사용하고 싶다면, 해당 저장소에서 –global 옵션을 빼고...


  • 마지막 Commit Message 수정하기

    가장 최근의 커밋 메시지는 아래의 명령을 사용하여 변경할 수 있다. git commit --amend 위 명령어에 -m을 추가하면 텍스트 편집기로 넘어가지 않고 메시지를 바로 변경할 수도 있다. git commit --amend -m "new commit message" GitHub에 이미 푸시 한 경우에는 수정된 메시지와 함께 커밋을 강제로 푸시해야 한다. 다만 강제로 푸시하면 repository history가...


  • ViewPager2 간단히 사용해보기

    안드로이드 ViewPager2의 알파 버전이 2019년 2월 7일에 릴리즈되었다. 새로운 기능으로는 RTL 레이아웃과 수직 스크롤링이 지원되고 기존 ViewPager 버그 수정으로 notifyDataSetChanged 기능이 완전히 동작한다. 샘플 코드 : https://github.com/dudmy/blog-sample 우선 build.gradle에 의존성을 추가한다. ViewPager2는 Android X 용으로 출시되어서 사용하려면 프로젝트가 Android X로 마이그레이션 되어야 한다. implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha01' 그리고 Activity 또는 Fragment에 ViewPager2...


  • .gitignore 동작하지 않을 때

    간혹 .gitignore 파일에 작성한 untracked 파일이 무시되지 않고 changes에 포함되는 경우가 있다. 이를 해결하기 위해서 하드디스크에 있는 파일은 그대로 두고 Git만 추적하지 않도록 해야 한다. 즉 git rm으로 tracked 상태의 파일을 삭제한 후에 git add으로 다시 파일을 추가한다. 이때 .gitignore 파일에 포함된 untracked 파일은 추가되지 않는다. git rm -r --cached...


  • Drag and Swipe RecyclerView

    RecyclerView에서 아이템을 편집할 때 사용하는 대표적인 제스처 2가지가 있다. Drag & Drop : 아이템 순서 바꾸기 Swipe to Dismiss : 아이템 제거하기 Android Support Library에는 RecyclerView에 위 기능 추가를 지원하는 유틸리티 클래스가 포함되어 있다. ItemTouchHelper ItemTouchHelper는 RecyclerView.ItemDecoration의 서브 클래스이다. RecyclerView 및 Callback 클래스와 함께 작동하며, 사용자가 이러한 액션을 수행할 때...


  • CharSequence와 String의 차이 (feat. StringSpannableBuilder)

    String? String은 하나의 클래스이다. Java 프로그램의 모든 문자열 리터럴은 이 클래스의 인스턴스로 구현된다. 중요한 점은 문자열 값은 작성된 후에 변경할 수 없다는 것이다. String 객체에 보관하는 문자열은 유니코드로 변형되므로 HTML과 같은 마크업 문자를 입출력할 때 문제가 발생한다. 이와 같이 마크업 문자를 입력하여 사용할 수 없기 때문에 변경할 수 없는 문자열이라고...


  • 코드 페스티벌 STAFF로 참여하다

    어제 즉, 9월 9일에 카카오 코드 페스티벌 본선이 진행되었다. 카카오에서 준비한 대학(원)생 프로그래밍 경진대회로 온라인 예선을 걸쳐서 오프라인 본선에 진출한 참가자들이 참여하였다. 나는 대회 참가자는 아니고 STAFF로서 참여하게 되었다. 그동안 행사나 컨퍼런스에는 항상 관람자(?)로서 아무도 모르게 조용히 가서 아무도 모르게 조용히 듣고 오는 입장이었다. 하지만 이번에는 STAFF로 지원했는데, 여러 가지...