분류 전체보기 56

[Kotlin] String 핸들링을 위한, 코틀린의 String 클래스를 뜯어보자

실제 서비스를 위해 코딩하다보면 String 다뤄야할 때가 많다. 또한 내가 기업 코테를 많이 본 것은 아니지만 코테 볼 때마다 매번 간접적으로나 직접적으로나 String 핸들링 문제가 나온 걸로 기억한다. 매우 쉬운 거라고 생각해서 방심하다가 뒷통수 맞기 딱 좋다. (사실 최근에 맞고 울었다.) 자주 만나는 문제일 수록 많은 코드를 작성하게 되니, 그 코드를 간결하게, 우아하게 그리고 정확하게 코딩하기 위해 String 클래스와 확장함수를 뜯어보며 정리해보려고한다. 실제 서비스이든 알고리즘 테스트이든 도구를 사용해서 시간을 아끼고 로직에 집중하자는 내 스스로의 취지이다. 또한 내부구현을 살펴보면 내가 커스텀 기능을 만들어야할 때 좋은 귀감이 될 수 있다고 생각한다. 일단 넓고 얇게 다루어 상황에 맞게 ..

[Android] WorkManager 로 복잡한 백그라운드 작업을 쉽게 해결한다고? (기본 사용법과 예시코드 포함)

[공부하게된 계기] 안드로이드 공부를 시작하고 스레드를 이용한 적은 있지만 앱 프로세스가 죽어서도 백그라운드에서 작업하게 할 일이 없었다. 하지만 최근 타이머 관련 오픈소스 작업을 시도하며, 그리고 과제전형 문제를 풀면서도 백그라운드 작업을 공부하게 되었는데 백그라운드 관련 라이브러리 중에서 최근 가장 핫한 WorkManager 를 공부해야겠다고 생각했다. [그래서 WorkManager 뭘 하는 건가?] 백그라운드 세 가지 작업종류의 persistent work 를 다루는데 추천되는 라이브러리이다. 백그라운드 작업의 종류에 관해서는 내가 전에 써놓은 아래링크를 참고하면 된다. [Android] 안드로이드의 Background 작업 Background 작업이 필요할 때! UI 스레드로 실행이 오래걸리는 작..

[Android] Service 의 타입과 사용법 그리고 권장사항

[서비스란?] 안드로이드 앱 4대 컴포넌트 중하나이다. 즉 앱 프로세스의 진입점 중 하나이다. (유저가 앱과 상호작용하고 있지 않아도) 백그라운드에서 길게 실행되는 연산들을 수행할 수 있다. (Activity 와는 다르게 UI 제공 x) 그러니 어플리케이션이 실행 중이지 않을 때도 ((아마) 앱 프로세스를 강제 종료 하지 않는 한) 작업해야하는 경우 서비스를 사용. (어플리케이션이 실행 중일 때만 작업해야하는 경운 스레드권장) 다른 앱으로 이동해도 한동안 실행을 지속할 수 있다. 한 컴포넌트와 bind 하여 소통할 수 있고, IPC(interprocess communication) 도 가능 주의할 점은 위 설명에서 백그라운드라는 말이 나왔다고 해서 서비스가 메인스레드(UI스레드) 외의 다른 스레드에서 작..

[Android/Kotlin] Intent 에 커스텀 객체 전달하기? 직렬화, 역직렬화 Serializable 과 Parcelable, @Parcelize

[시작하며 (반성)] 한 화면에서 다른 화면으로 이동할 때 데이터를 전달하려고하는 데, Primitive type 이 아닌 내가 만든 data class(디자인 패턴을 관점에서는 POJO 클래스, Model) 을 통째로 전달하고 싶을 수 있다. 액티비티 객체는 안드로이드 시스템에서 관리하는 컴포넌트로 데이터 전달에는 Intent 를 사용하기 때문! 그리고 최근에 Jetpack navigation 으로 프로젝트를 진행해왔는데, navigation 라이브러리에서도 Serializable 과 Parcelable 을 지원해서 Fragment 간 객체를 전달할 수 있었다. Serializable 과 Parcelable 의 개념을 안드로이드 공부 시작하고 초반에 접하고 따로 더 공부한 적이 없이 자연스레 사용해서 ..

[Android/Kotlin] startForActivityForResult 가 Deprecated 라고? Activity Result APIs 를 써보자

[시작 전 반성] 한동안 Jetpack navigation 을 사용해서 프로젝트를 진행해서 startForActivityForResult 가 Deprecated 인지 몰랐다. (알게된 건 작년 여름쯤) Deprecated 라는 것은 더이상 개발되지 않고 사라질 수 있으니 사용을 지양하라는 의미로 알고 있어서 대체제를 찾았다. 찾아보니 Activity 를 시작하고 값을 받아오는 기능 뿐만 아니라 Permission 을 받아오는 기능을 깔끔한 콜백코드로 대체할 수 있어서 좋았다. 프로젝트에 치여 기록을 잊지말자는 반성으로 쓰기 시작해야겠다. 활동에서 결과 가져오기 | Android 개발자 | Android Developers 활동에서 결과 가져오기 개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시..

[Android] Hilt 의 다양한 어노테이션을 알아보자

[DI 가 무엇인지 모른다면?] 아래 링크를 먼저 참고하자 [Android] 안드로이드의 DI (Dependency Injection) [DI 개념과 필요한 이유] 한 클래스는 다른 클래스를 참조해야하는 일이 빈번하다. (특히 디자인패턴을 다루면서) 예를 들어 Computer 클래스를 실행시키려면 Computer 클래스 내에서 Cpu 클래스 객체 nosorae.tistory.com [Hilt 란?] 힐트는 제트팩에서 권장하는 DI 라이브러리이다. 힐트는 Dagger 위에 구축되어있고 대거 컴포넌트를 만든다. (compile-time correctness, runtime performance, scalability 측면에서 이득) 따라서 힐트 역시 compile-time dependencies, runti..

[Android] 안드로이드의 DI (Dependency Injection)

[DI 개념과 필요한 이유] 한 클래스는 다른 클래스를 참조해야하는 일이 빈번하다. (특히 디자인패턴을 다루면서) 예를 들어 Computer 클래스를 실행시키려면 Computer 클래스 내에서 Cpu 클래스 객체를 참조해야한다고 해보자. 이 상황에서 Computer 클래스가 Cpu 클래스에 의존한다고 한다. 이 방법에는 당장 생각나는 두 가지가 있을 것이다. Cpu 객체를 클래스 내부에서 직접 생성하기 Computer 클래스가 한 타입의 Cpu 객체만 사용해버린다. 즉 서브클래스를 쉽게 사용할 수 없다. 그렇다면 Intel Cpu, AMD Cpu 각각을 사용하는 Computer 클래스를 각각 만들어야 할 것이다. Computer 에서 Cpu 객체를 직접 생성하면 테스트도 어렵게 함 생성자나 메소드 파라미..

[Android] 안드로이드의 Background 작업

Background 작업이 필요할 때! UI 스레드로 실행이 오래걸리는 작업을 진행한다면 UI 블로킹으로 좋지 못한 UX 를 제공할 것이다. 따라서 bitmap 을 디코딩한다든지, 네트워크 요청이나 저장소에 접근 그리고 머신러닝 모델을 동작시키는 등의 무거운 작업을 할 때는 따로 백그라운드 작업이 필요할 것이다. Background 작업의 3 가지 카테고리와 각 2 가지 타입 백그라운드 작업은 기본적으로 아래 세 가지 카테고리로 분류됨 Immediate 당장 실행해야하고 금방 끝나는 작업 Long-running 끝나는 데 시간이 걸리는 작업, 약 10분 이상 Impersistent 권장 x Persistent 권장 o (따라서 WorkManager 사용 권장) ex 청크할 수 없는 큰 파일 다운로드하는 ..

[Android] Activity 의 Life cycle 과 App Life cycle 을 연관지어 생각해보기

본 글은 아래 링크에서 이어지는 글입니다. [Android] 안드로이드의 Processes 와 App Life-cycle 안드로이드 프로세스 관리 기본원리 안드로이드 어플리케이션은 리눅스 프로세스 상에서 동작한다. 프로세스는 앱의 코드가 실행되어야할 때 만들어지고, 더이상 필요하지 않거나 시스템이 다 nosorae.tistory.com [Activity 소개] 안드로이드 앱의 중요한 컴포넌트 중 하나로 유저와 소통하기 위한 시작점이 되어준다. UI 를 그리기 위한 window 를 제공한다. [Activity 관점] 액티비티의 생명주기를 단순 나열하면 다음과 같다. (onCreate - onStart - onResume - onPause - onStop - onDestroy) 위 process 종류 섹션에..

[Android] 안드로이드의 Processes 와 App Life-cycle

안드로이드 프로세스 관리 기본원리 안드로이드 어플리케이션은 리눅스 프로세스 상에서 동작한다. 한 앱 컴포넌트가 시작하고 다른 앱의 컴포넌트가 실행중이지 않으면 안드로이드 시스템은 하나의 스레드 실행과 함께 새로운 리눅스 프로세스를 시작 컴포넌트 실행 시작하려는데 이미 그 앱의 다른 컴포넌트의 프로세스가 존재한다면 같은 프로세스, 같은 스레드에서 실행되는 것이 디폴트 하지만 하나의 앱에 이는 다른 각 컴포넌트를 다른 프로세스, 다른 추가적인 스레드를 만들어서 실행시킬 수 있다. 방법은 매니페스트에 , , , 엔트리를 넣고 android:process 속성값을 주어 각 컴포넌트가 어느 프로세스에서 실행되어야하는지 명시할 수 있다. 프로세스는 앱의 코드가 실행되어야할 때 만들어지고, 더이상 필요하지 않거나 시..