안녕하세요. 점냥입니다 :) 오늘의 주제는 Android Q에 도입된 굉장히 인기가 많았던 기능으로 저 또한 평소에 선호하고 있는 Dark Theme입니다!! Dark Theme 다크 테마는 안드로이드 스튜디오, 크롬과 최근에 GitHub에서 다크 테마를 공식적으로 지원해주면서 Mash-UP 전체 톡방에 한번 이슈가 되었던 기능이기도 합니다. 다크 테마를 앱에서 사용하면 어떤 점이 좋을까요? 다크 테마의 장점 전력 사용량을 상당히 절약할 수 있습니다(기기 화면 기술에 따라 다름). 시력이 낮은 사용자와 밝은 빛에 민감한 사용자를 위한 가시성을 개선합니다. 누구나 어두운 환경에서 쉽게 기기를 사용할 수 있습니다. 필수적인 기능은 아니지만 다크 테마를 좋아하는 저와 같은 사람들을 위해, Dark Mode 기..
Android Ui Test 안녕하세요. 점냥입니다 :) 여러분은 Android 개발 과정에서 테스트를 도입하시나요? 저도 이번 포스팅을 공부 하면서 처음 도입했는데요. 테스트는 Android 프로젝트를 생성할 때 기본으로 생성되어 있을 정도로 구글에서 권장하고 있습니다. 개발 과정에서 테스트를 도입하면 어떤 점이 좋을 까요? 이 질문에 대한 구글의 공식 답변은 아래와 같습니다. 서비스 장애를 초기에 신속한 발견 기존 코드의 호환성을 신경 쓰지 않고 코드 수정/ 기능 추가 가능 코드의 안전성 보장 테스트는 작성한 코드에 대한 안정성과 정확성, 기능 동작이 올바르게 동작하는지 확인해주고, 무엇보다 이미 테스트로 정확성을 인정된 코드를 수정한 이후 기존 코드와 호환성을 확인할 때 유용하게 사용할 수 있습니다..
안녕하세요. 점냥 입니다!!! Testing your app is an integral part of the app development process Android Developer 사이트의 원문입니다. 앱 개발하는 과정에 있어서 테스트는 핵심 적인 부분을 차지한다고 하는데요. 프로젝트 구조가 복잡해지는 만큼 기능의 확장 및 유지 보수 측면에서 테스트는 변경된 코드가 기존 기능을 망가뜨리지 않는 지 미리 체크 할 수 있다는 점에서 많은 이점을 주기 때문입니다. 부끄럽게도 저도 지금 껏 개발 했던 프로젝트에 제대로된 테스트를 수행해본 적이 없는데요. 여러분도 저와 같다면 함께 천천히 테스트에 대해서 알아가 봅시다:) Unit Test Unit Test는 테스트 종류 중 가장 작은 단위이며 로컬 기기(개발..
사건 발생하기 전 개인 프로젝트에 Dagger2를 적용하려고 한 필자는 아래와 같이 프로젝트를 설정했다. apply plugin: 'kotlin-kapt' dependencies { def daggerVersion = '2.30.1' implementation "com.google.dagger:dagger:$daggerVersion" kapt "com.google.dagger:dagger-compiler:$daggerVersion" } sync는 무리 없이 통과가 되자 필자는 Component와 Module를 만들며 열심히 기존 프로젝트에 Dagger 라이브러리를 적용하고 있었다. 문제는 Build를 하고 나서 시작되었다. 사건 해결 노력 Step 1. dagger2 추가된 후 문제 발생한 것이 맞나? ..
안녕하세요. 점냥입니다:) 이번 포스팅에서는 MVP 아키텍처 패턴에서 Model에 관하여 알아보려고 합니다. 구글의 Blueprints v2 다양한 아키텍처 샘플 코드와 안드로이드 개발자 사이트의 예제를 보면 데이터를 관리하는 부분의 클래스 이름이 Model이 아니란 것을 느낄 수 있다. data, source 등 새로운 개념이 등장하여 이것이 모델인가?라는 의문이 필자도 들었다. 해당 개념은 Repository Pattern이라는 디자인 패턴 개념이다. Repository Repository pattern은 Model에 대해서 관심사 분리를 수행한 개념이라고 할 수있습니다. MVP에서 Model이랑 데이터를 요청하고 받는 Presenter는 최대 관심사가 뭘까요? 바로 View에게 넘겨줄 Data를 받..
들어가기 전 이번 포스팅에서는 Android 앱에서 가장 많이 사용한다고 볼 수 있는 RecyclerView의 성능 개선에 대해서 알아보자. 하지만 먼저 알아야 할 도구가 있다. 바로 GPU 렌더링 막대기 개발자 옵션 -> 프로필 GPU 렌더링에서 킬 수 있는 이 기능은 기기의 렌더링 상황을 시각적으로 확인하여 어느 부분에서 지연이 되고 있는지 알 수 있다. 아래는 예시 사진으로 왼쪽은 갤럭시 설정 앱, 오른쪽은 필자가 만든 WASK 앱이다. 가로 막대기 안드로이드는 초당 60fps를 가져야 사용자는 부드럽다고 느낀다. 프레임 기준으로 계산해보면 1000ms / 60 fps = 16.66...로 프레임 하나당 16ms내에 생성돼야 한다. 가로 막대기는 16ms를 뜻한다. 세로 막대기 세로 막대기는 한 프..
RxJava의 다양한 연산자를 알고 가기 전, 꼭 알아야 하는 개념이 있다고 한다. 바로 Hot Observable 과 Cold Observable 이다. Cold Observable 데이터 소스에서 발행되는 Data들은 구독자가 구독을 하고 나서부터 발행을 시작한다. 즉, 구독자는 데이터 소스의 Data를 모두 받음을 보장한다. 사실 Cold Observable은 이전 포스팅에서 다루었던 Observable, Flowable, Single 등 거의 대부분 해당된다. 하지만 이번 포스팅에서 '데이터를 모두 받음을 보장한다는 것이 뭘까'에 대해 알아보자. String[] strings = new String[]{"딸기", "소스", "치킨"}; Flowable source = Flowable.fromArr..
ReativeX는 Data를 스트림 형식으로 전달하면서 여러 이벤트를 발생하고 관찰자는 해당 이벤트일 때 어떤 행동을 할 것인지 정의할 수 있다. 그리고 그 스트림과 이벤트는 Rx의 BaseClasses에 따라 차이를 보인다. Observable Observable은 RxJava 1.x에서 유일하게 수의 제한 없는 (0.. N flows) Data의 흐름을 명시하기 위해 사용했던 클래스이다. 하지만 Observable은 자동으로 Backpressure를 지원하지 않아서 별도의 함수 호출로 해당 기능을 지원하게 만들어야 했고, 그렇지만 Rx를 잘 알지 못하는 초보 개발자들을 위해 버전 2.x부터 Backpressure를 자동으로 지원하는 Flowable 클래스가 나왔다. 그래서 요즘 최신 RxJava 글들..
문제본문 문제 난이도를 제공해주는 것은 나에게 오히려 독이 되는 것 같다. 이 문제는 골드 1 문제로 시작부터.. 내가 풀 수 있을까? 하던 문제 그래서 조금 고민하다 힌트를 우선 보았었다 ㅜㅜ 재귀호출이 자주 쓰이는 분할정복 문제인 것을 알기 때문에 함수부터 작성했다. 2차원 배열인 board에서 불순물이 하나도 없고 결정이 오직 1개 존재하도록 매 재귀호출 마다 board를 탐색해야 한다. 그런데 문제는 쿼드 트리처럼 정사각형으로 잘리는 것이 아닌 불순물의 위치에 따라 잘리기 때문에 분할된 문제의 크기를 정수로 나타내기 어려워서 가로와 높이 모두 시작과 끝을 매개변수로 넘겨주었다. public int division(int startX, int endX, int startY, int endY, int..
요즘 신입 채용 조건에 RxJava 사용 경험이 많이 포함되어 있다. 옆에서 주워들은 조언으로 Rx는 신입 기준으로 마스터하기엔 힘든 라이브러리이며 "우리 회사에서 Rx를 사용하니 한번 뭔지 알아는 와라"라는 뜻이라고 한다. 그러니 편한 마음으로 RxJava를 알아보자 RxJava란? Rx는 ReactiveX의 약자로 Rxjava는 명령형 프로그램인 Java 언어 방식을 반응형 프로그래밍으로 사용할 수 있게끔 도와주는 라이브러리이며 이벤트에 대해서 조건 처리하거나, 조합하거나 오류를 처리 하는등 복잡한 비동기 연산에 대해 효율성을 높여준다. 반응형 프로그래밍이라고 정의하면 낯설어 할 수 있는 데 우리는 이미 반응형 프로그래밍과 유사한 코드를 경험해 보았다. Button의 클릭 이벤트, 클래스간 인터페이스..