🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Android 성능 최적화 가이드 - 슬라이드 1/11
A

AI Generated

2025. 11. 3. · 27 Views

Android 성능 최적화 가이드

Android 앱의 성능을 향상시키는 핵심 기법들을 코드로 배워봅니다. 메모리 관리, UI 최적화, 네트워크 효율화 등 실전에서 바로 적용할 수 있는 최적화 방법을 다룹니다.


카테고리:Java
언어:Kotlin
메인 태그:#Android
서브 태그:
#RecyclerView#ViewModel#Coroutines#MemoryOptimization

들어가며

이 글에서는 Android 성능 최적화 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. RecyclerView_ViewHolder_재활용
  2. 이미지_로딩_최적화
  3. 메모리_누수_방지_ViewModel
  4. 코루틴으로_백그라운드_작업
  5. LazyColumn_지연_로딩
  6. 데이터베이스_쿼리_최적화
  7. Bitmap_메모리_관리
  8. Flow로_데이터_스트림_최적화
  9. 레이아웃_계층_평탄화
  10. ProGuard_코드_난독화_및_최적화

1. RecyclerView ViewHolder 재활용

개요

ViewHolder 패턴을 사용하여 리스트 스크롤 성능을 크게 향상시킵니다. findViewById 호출을 최소화하여 UI 렌더링 속도를 개선합니다.

코드 예제

class MyAdapter : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val textView: TextView = view.findViewById(R.id.textView)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.textView.text = items[position]
    }
}

설명

ViewHolder를 재사용하여 스크롤 시 매번 뷰를 생성하지 않고 기존 뷰를 재활용합니다. 이는 메모리 사용량과 CPU 부하를 크게 줄여줍니다.


2. 이미지 로딩 최적화

개요

Glide 라이브러리를 사용하여 이미지를 효율적으로 로드하고 캐싱합니다. 메모리 부족 오류를 방지하고 로딩 속도를 향상시킵니다.

코드 예제

Glide.with(context)
    .load(imageUrl)
    .placeholder(R.drawable.placeholder)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .override(800, 600)
    .into(imageView)

설명

이미지 크기를 제한하고 디스크 캐싱을 활용하여 네트워크 요청을 줄입니다. placeholder를 사용해 사용자 경험도 개선합니다.


3. 메모리 누수 방지 ViewModel

개요

ViewModel을 사용하여 액티비티/프래그먼트의 생명주기와 독립적으로 데이터를 관리합니다. 화면 회전 시 데이터 유지와 메모리 누수를 방지합니다.

코드 예제

class MyViewModel : ViewModel() {
    private val _data = MutableLiveData<List<Item>>()
    val data: LiveData<List<Item>> = _data

    override fun onCleared() {
        // 리소스 정리
        super.onCleared()
    }
}

설명

ViewModel은 구성 변경 시에도 살아있어 불필요한 데이터 재로드를 방지합니다. onCleared()에서 리소스를 정리하여 메모리 누수를 막습니다.


4. 코루틴으로 백그라운드 작업

개요

Kotlin Coroutines를 사용하여 메인 스레드를 블로킹하지 않고 비동기 작업을 처리합니다. ANR(Application Not Responding) 오류를 방지합니다.

코드 예제

viewModelScope.launch {
    val result = withContext(Dispatchers.IO) {
        // 네트워크 또는 DB 작업
        repository.fetchData()
    }
    _data.value = result
}

설명

IO 작업은 Dispatchers.IO에서 실행하고 결과를 메인 스레드에서 안전하게 UI에 반영합니다. 앱이 멈추지 않고 부드럽게 동작합니다.


5. LazyColumn 지연 로딩

개요

Jetpack Compose에서 대량의 리스트를 효율적으로 표시합니다. 화면에 보이는 항목만 렌더링하여 성능을 최적화합니다.

코드 예제

LazyColumn {
    items(itemsList) { item ->
        Text(
            text = item.name,
            modifier = Modifier.padding(16.dp)
        )
    }
}

설명

RecyclerView처럼 LazyColumn도 뷰 재활용을 자동으로 처리합니다. 천 개의 항목도 메모리 효율적으로 표시할 수 있습니다.


6. 데이터베이스 쿼리 최적화

개요

Room 데이터베이스에서 필요한 컬럼만 조회하여 쿼리 성능을 향상시킵니다. 불필요한 데이터 로드를 방지합니다.

코드 예제

@Query("SELECT id, name FROM users WHERE age > :minAge")
suspend fun getActiveUsers(minAge: Int): List<UserBasic>

data class UserBasic(
    val id: Int,
    val name: String
)

설명

모든 컬럼(*)을 가져오지 않고 필요한 컬럼만 선택하여 쿼리 속도와 메모리 사용량을 개선합니다.


7. Bitmap 메모리 관리

개요

큰 이미지를 로드할 때 적절한 크기로 샘플링하여 OutOfMemory 오류를 방지합니다. 메모리를 효율적으로 사용합니다.

코드 예제

val options = BitmapFactory.Options().apply {
    inJustDecodeBounds = true
    BitmapFactory.decodeResource(resources, R.drawable.large, this)
    inSampleSize = calculateInSampleSize(this, 100, 100)
    inJustDecodeBounds = false
}
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.large, options)

설명

inSampleSize를 사용하여 이미지를 축소 로드합니다. 원본 크기의 1/4, 1/8 등으로 줄여 메모리 사용을 최소화합니다.


8. Flow로 데이터 스트림 최적화

개요

Kotlin Flow를 사용하여 데이터 스트림을 효율적으로 처리합니다. 불필요한 업데이트를 필터링하고 백프레셔를 관리합니다.

코드 예제

val searchResults = searchQuery
    .debounce(300)
    .distinctUntilChanged()
    .flatMapLatest { query ->
        repository.search(query)
    }
    .flowOn(Dispatchers.IO)

설명

debounce로 연속된 입력을 제한하고, distinctUntilChanged로 중복 검색을 방지합니다. 네트워크 요청 횟수를 크게 줄입니다.


9. 레이아웃 계층 평탄화

개요

ConstraintLayout을 사용하여 중첩된 레이아웃을 평탄화합니다. 레이아웃 측정 시간을 줄여 UI 렌더링 성능을 향상시킵니다.

코드 예제

<androidx.constraintlayout.widget.ConstraintLayout>
    <TextView
        android:id="@+id/title"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
    <TextView
        app:layout_constraintTop_toBottomOf="@id/title" />
</androidx.constraintlayout.widget.ConstraintLayout>

설명

LinearLayout이나 RelativeLayout을 중첩하는 대신 ConstraintLayout 하나로 복잡한 UI를 구성합니다. 레이아웃 계층을 줄여 렌더링 속도가 빨라집니다.


10. ProGuard 코드 난독화 및 최적화

개요

ProGuard를 사용하여 사용하지 않는 코드를 제거하고 APK 크기를 줄입니다. 앱 다운로드 속도와 설치 시간이 개선됩니다.

코드 예제

// build.gradle
buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

설명

minifyEnabled로 코드 최적화, shrinkResources로 리소스 최적화를 활성화합니다. APK 크기가 30-50% 감소할 수 있습니다.


마치며

이번 글에서는 Android 성능 최적화 가이드에 대해 알아보았습니다. 총 10가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#Android #RecyclerView #ViewModel #Coroutines #MemoryOptimization

#Android#RecyclerView#ViewModel#Coroutines#MemoryOptimization#Java

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.
이전3/3
다음