전체 글 241

Android `mutate()` 메소드 : 동일한 Drawable 객체를 사용하고 있을 때 한 요소의 변경이 다른 요소에 영향을 주지 않도록

왜 mutate()를 사용해야 할까?공유되는 Drawable: 여러 UI 요소(예: 버튼, 이미지 뷰 등)가 동일한 Drawable 객체를 사용하고 있을 때, 한 곳에서 Drawable을 수정하면 다른 모든 곳에도 영향을 미칠 수 있습니다.예를 들어, 버튼과 배경이 같은 이미지를 사용하고 있는데, 버튼의 색상을 변경하면 배경도 같이 바뀔 수 있습니다. 이를 방지하기 위해 mutate()를 사용합니다.   mutate() 메소드Android의 Drawable 클래스에서 사용되는 메소드Drawable 객체의 복사본을 생성하고, 원본의 상태와는 독립적으로 변경할 수 있도록 합니다.주로 Drawable의 상태를 변경해야 할 때 유용하게 사용됩니다. 1. 목적mutate() 메소드는 Drawable의 인스턴스를 ..

Android 2024.08.11

Android Application Context

Application Context의 적절한 사용Application의 Context는 애플리케이션이 실행되는 동안 메모리에 유지됩니다.따라서 전역적으로 사용되거나 장기적인 참조가 필요한 객체들에 적합하며, UI와 관계없는 작업에서 안전하게 사용할 수 있습니다.Application 단의 Context를 확장 함수에서 사용하게 되면, 단위 테스트를 수행하기 어려워질 수 있습니다.Context에 의존하는 코드는 테스트에서 모의(Mocking) 처리가 필요하며, 이는 테스트의 복잡성을 높입니다. 1. Application Context를 사용하는 것이 적절한 경우장기적으로 유지되는 객체:장기적으로 유지되거나 전역적으로 사용되는 객체에서 Context가 필요할 때는 Application Context를 사용하는..

Android 2024.08.11

[Compose][Image]맞춤 페인터 (Custom painter), 이미지 성능 최적화

맞춤 페인터 (Custom painter) Painter 객체그릴 수 있는 항목을 나타내고(Android에서 정의된 Drawable API의 대체 API) 객체를 사용하고 있는 컴포저블의 measure 또는 layout 과정에 영향을 미치는 데 사용됩니다. Painter는 지정된 경계 내에서 엄격하게 그려진다.cf) 컴포저블의 measure 또는 layout 과정에 영향을 주지 않는DrawModifier와 다릅니다.painterResource()를 사용하면 애셋에 맞는 올바른 페인터(예: BitmapPainter 또는 VectorPainter)가 반환됩니다. (둘의 차이점에 관한 자세한 내용은 ImageBitmap과 ImageVector 섹션을 참고)BitmapPainter는 ImageBitmap을 사용..

Android/Compose 2024.06.02

[Compose][Image] 이미지 커스터마이징

이미지 커스터마이징 (Customize an image ) `Image 컴포저블`의 속성인 `contentScale` , `colorFilter`들을 사용하여 맞춤설정할 수 있습니다. 위 속성은 Image 컴포저블의 Modifiers를 사용하여 적용가능함(`contentScale` 및 `colorFilter`는 Image 컴포저블의 명시적 매개변수)   1. `contentScale` 옵션 :  콘텐츠 크기 조정 이미지를 자르거나 경계 내에서 이미지의 크기가 조정되는 방식을 변경하는 옵션 (디폴트는 ContentScale.Fit)ex) Image 컴포저블은 테두리가 있는 150dp 크기로 제한되고 배경은 Image 컴포저블에서 노란색으로 설정val imageModifier = Modifier    .s..

Android/Compose 2024.06.02

[Compose][Image] 이미지 표시, ImageBitmap vs ImageVector, Material icons

이 포스팅은 공식문서 를 보고 이해한 내용을 정리 및 번역한 글입니다.     Jetpack Compose에서 이미지 나타내기 1. 기본 이미지 로딩Image 컴포저블 : 화면에 이미지 리소스를 표시함painterResource : painterResource는 이미지 리소스를 불러오기 위해 사용하는 함수이 함수는 리소스 ID를 받아 Painter 객체를 반환합니다. 이를 Image 컴포넌트에 전달하여 이미지를 화면에 표시할 수 있습니다.디스크에서 이미지(예: PNG, JPEG, WEBP) 또는 벡터 리소스를 로드하려면, 이미지 참조와 함께 painterResource API를 사용합니다. 이미지 리소스 유형을 알 필요는 없습니다. Image 또는 paint 수정자에서 painterResource를 사용..

Android/Compose 2024.06.02

Composables Lifecycle (컴포저블 수명 주기)

용어정리Composable - UI 구성 요소를 나타내는 함수 또는 어노테이션Composable 어노테이션 (@Composable) - Composable 함수를 표시하는 어노테이션 Composable 함수- Compose에서 UI 구성을 정의하고, UI 요소의 계층 구조를 형성하며, 화면에 표시되는 뷰를 생성하는 함수 - UI를 선언적으로 정의하는 Compose에서 사용되는 기본 단위- UI 요소를 생성하고, UI 상태를 나타내며, 사용자 입력 및 상호 작용에 응답하는 등의 작업을 수행한다.Composition- UI 구성 요소들이 결합되어 화면에 표시되는 것- Compose에서는 여러 'Composable 함수'가 조합되어 화면에 나타나는 UI 구조를 형성합니다. Composition은 'Compos..

Android/Compose 2024.05.06

Compose 기초 (Compose이해, Composable function, Recomposition)

이전편에 이어 다시보는Compose 란?Jetpack Compose는 Android를 위한 현대적인 선언형 UI 도구 키트사용자 인터페이스의 상태와 레이아웃을 설명하는 구조화된 데이터나 코드를 사용하여 UI를 정의 [동작] 처음부터 화면 전체를 개념적으로 생성한 후 -> 특정 시점에선 필요한 변경사항(UI의 어떤 부분을 다시 그려야 하는지)만 지능적으로 선택하여 화면을 재구성(=Recomposition)한다.[동작 구현] 구성 가능한 함수(=Composable 함수)를 '단순히 호출'하는 형태로 UI 렌더링 및 재구성  ex) `@Composable TextView()`를 호출  Composable function (= 구성 가능한 함수)  개인적으로 '구성 가능한 함수'라는 번역은 매번 부르기 어려워 ..

Android/Compose 2024.05.05

Compose 선행 개념 (#Compose란, #선언형UI, #명령형 UI)

Compose 란?Jetpack Compose는 Android를 위한 현대적인 선언형 UI 도구 키트Compose는 프런트엔드 뷰를 명령형으로 변형하지 않고도 앱 UI를 렌더링할 수 있게 하는 선언형 API를 제공하여 앱 UI를 더 쉽게 작성하고 유지관리할 수 있도록 지원한다.   자꾸 '선언형'이 언급되는데 이에 대해 알아보자!!👇 선언형 전에는 명령형 UI를 사용했었다,, 기존  '명령형? 프로그래밍 패러다임' (= Imperative programming paradigm)뷰 계층 구조는 UI 위젯의 트리 형태사용자 상호작용 등의 이유로 인해 앱의 상태가 변경되면, 현재 데이터를 표시하기 위해 UI 계층 구조를 업데이트해야 하는데 보통 아래처럼 뷰를 찾아 접근하여 위젯 내부 상태를 업데이트 시킨다 ..

Android/Compose 2024.05.05

[Kotlin Coroutine][init] 5. kotlin.coroutines vs kotlinx.coroutines

코루틴은 하나의 라이브러리에 있을 것 같지만 아니다! 1) 코틀린은 언어 차원에서 표준 라이브러리에 최소한의 저수준 API만 제공하고, 2) 다양한 다른 라이브러리에서 코루틴을 활용할 수 있도록 되었다. 1) 코틀린은 언어 차원에서 표준 라이브러리인 kotlinx.coroutines - 자유도를 보장하기 위해 필수 언어 차원에서의 최소한만 지원함 ㄴ> 여기에는 suspendCoroutine, Continuation 등 ㄴ> 라이브러리 개발자에게 적합 2) 다양한 다른 라이브러리 - 별도의 의존성을 추가해야 한다. - 애플리케이션 개발자들에게 적합 - 이 중 JetBrains에서 개발한 kotlinx.coroutines에는 코루틴을 위한 많은 라이브러리가 대표적이다. ㄴ> 여기에는 launch, async..

Android/Coroutine 2024.02.22

[Kotlin Coroutines][init] 3. 코루틴 중단(suspend)하고 재개(resume)하기

코틀린 코루틴은 '비동기적인 작업을 수행할 때 사용되는 경량 스레드'입니다. 코루틴은 실행 중인 함수의 실행을 일시 중단하고 나중에 재개할 수 있는 기능을 제공하여 비동기적인 작업을 보다 효율적으로 관리할 수 있습니다. 이러한 일시 중단과 재개는 코루틴의 핵심 개념 중 하나인 "중단 함수"를 통해 이루어집니다. 중단 함수(suspend function) 코루틴을 중단 할 수 있는 함수 (= 코루틴에서 함수의 실행을 일시 중단하고 나중에 재개할 수 있는 기능을 제공하는 함수) 코루틴을 중단할 수 있으므로 중단 함수는 반드시 코루틴(또는 다른 중단함수)에 의해 호출되어야 한다. 중요하다 (코틀린 코루틴의 핵심적인 개념) [비유] 비디오 게임을 하다가 멈추는 상황이랑 비슷하다. 체크 포인트에서 게임을 저장하고..

Android/Coroutine 2024.02.18

[Kotlin Coroutines][init] 2. 시퀀스 빌더

다른 언어에서는 코루틴을 어떻게 사용할까?? 🤔 파이썬이나 자바스크립트를 보면 아래 2가지 같은 제한된 형태의 코루틴이 있다고 한다. 비동기 함수 (async/await와 같은 호출 방식) 제너레이터(값을 순차적으로 반환) 코틀린에서는 제너레이터 대신 시퀀스를 생성할 수 있는 시퀀스 빌더라는 것을 대신 제공한다. (Flow 빌더도 있으나 내용이 많아 추후 포스팅 예정) 시퀀스 빌더 - 시퀀스는 List, Set 같은 컬렉션과 비슷한 개념이지만 필요할 때마다 값을 하나씩 계산하는 지연 처리를 한다. - [시퀀스의 특징] 요구되는 연산을 최소한으로 수행 무한정이 될 수 있음 메모리 사용이 효율적 (이펙티브 코틀린에 Item49 '하나 이상의 처리 단계를 가진 경우 시퀀스를 사용라라'고 있으니 참고) - [시..

Android/Coroutine 2024.02.18

[Coroutine] async{}/await() 사용 시 주의사항

아래 두 코드는 다른 방식으로 동작합니다. 1) async { api호출함수() }을 여러 개 사용 후, await() 여러 개를 호출하는 코드 vs 2) async { api호출함수() }.await() 여러 개를 바로 호출하는 코드 1) async { api호출함수() }을 여러 개 사용 이후, await() 여러 개를 호출하는 코드 - getUserApi()와 getPeedApi()를 병렬로 호출하고, 각각의 작업이 완료될 때까지 대기합니다. 따라서 getUserApi()와 getPeedApi() 함수 호출은 동시에 이루어질 수 있으며, 두 작업이 완료되는 순서에 따라 데이터를 받습니다. suspend fun fetchData() { coroutineScope { val userDeferred = ..

Android/Coroutine 2024.02.18

[Kotlin Coroutine][init] 1.코틀린 코루틴? 왜 꼭 코루틴을 사용해야하나요?

* 작성 내용 : 코틀린 코루틴이란 무엇인지? 어떻게 작동하는지?? Kotlin + Coroutines 을 같이 사용하는 장점 멀티플랫폼 작동 가능 (JVM, JS, iOS 등의 모듈들에서 가능) ㄴ> 이건 코틀린 멀티플랫폼(kotlin multiplatform)의 영향이 큼 : kotlinlangSite, ,jetbrains androidDeveloper ㄴ> 더보기 안드로이드에서 코루틴을 왜 사용해야하는지? - 안드로이드에서는 메인스레드 단 하나만 뷰를 다룰 수 있음 -> 이 쓰레드가 블로킹되면 앱이 ANR 발생하며 죽음 "안드로이드에서는 하나의 앱에서 뷰를 다루는 스레드가 '단 하나'만 존재하기 때문에 Main 스레드를 블로킹되서는 안된다." - 하지만, 뷰를 다루는 작업은 엄청 많음 -> 따라서,..

Android/Coroutine 2024.02.17

[UnitTest][ch6(2/3편)] 단위테스트, 함수형 프로그래밍, 그리고 함수형 아키텍처 (그리고 헥사고날 아키텍처 첨가)

전편 포스팅에서 이어지는 내용입니다. '출력 기반 단위 테스트' 스타일을 '함수형'이라고도 한다. '출력 기반 테스트'를 적용할 수 있는 것은 '순수 함수' 뿐이다. '순수 함수'방식으로 사용한 프로그래밍을 '함수형 프로그래밍'이라고 부른다. 즉, '출력 기반 단위 테스트' 스타일은 코드를 '함수형 프로그래밍'을 이용해 '순수 함수' 방식으로 작성해야 한다. 그러므로 함수형 프로그래밍과 함수형 아키텍처에 대한 개념부터 알아보자! 함수형 프로그래밍(Functional Programming)이란? : 순수 함수(Pure function)를 사용한 프로그래밍 - 목표 : ["비즈니스 로직을 처리하는 코드와 '사이드 이펙트를 일으키는 코드'를 분리하는 것"] 순수함수(Pure function)란? - '수학적 ..

Android/TDD 2023.12.01

[UnitTest][ch6] 단위테스트 스타일(출력기반, 상태기반, 통신기반) 및 사용

단위 테스트 스타일에 대해 동일한 기준틀(3가지 스타일)을 적용하고, -> 이 스타일 중 하나인 '출력 기반 스타일'을 사용해 테스트 작성하는 방법과 -> 이렇게 작성된 '출력 기반 테스트'와 함수형 프로그래밍의 관련성을 배움 +첨가) 함수형 프로그래밍, 함수형 아키텍처 개념  단위테스트의 3가지 스타일 출력 기반 테스트(output-based testing) : "SUT에 입력을 넣고 생성되는 출력 결과만 검증하는 방식." 상태 기반 테스트(state-based testing) : 작업이 "완료된 후" 시스템 "최종 상태"를 검증하는 방식 통신 기반 테스트(communication-based testing) : SUT의 "협력자를 목으로 대체"하고 "SUT가 협력자를 올바르게 호출하..

Android/TDD 2023.11.30