PHpullh
학습 라이브러리/Kotlin/메모리 최적화

KOTLIN · 성능

메모리 최적화

객체 할당을 줄이고 메모리 사용을 최적화하는 기법입니다. 원시 타입 배열, 객체 풀, WeakReference를 다룹니다.

성능고급memoryobject-poolprimitive-arrayweak-reference

핵심 설명

객체 할당을 줄이고 메모리 사용을 최적화하는 기법입니다. 원시 타입 배열, 객체 풀, WeakReference를 다룹니다.

Kotlin code

import java.lang.ref.WeakReference

fun main() {
    // 1. 원시 타입 배열 (박싱 방지)
    val intArray = IntArray(1000) { it }    // int[] (박싱 없음)
    val intList = List(1000) { it }         // List<Integer> (박싱 발생)
    println("IntArray sum: ${intArray.sum()}")

    // 2. StringBuilder (문자열 연결 최적화)
    val slow = buildString { repeat(10000) { append("item ") } }  // 효율적
    // val slow2 = (1..10000).fold("") { acc, _ -> acc + "item " } // 비효율!

    // 3. 객체 재사용 (풀)
    class ObjectPool<T>(private val factory: () -> T, poolSize: Int = 10) {
        private val available = ArrayDeque<T>()
        init { repeat(poolSize) { available.add(factory()) } }

        fun acquire(): T = available.removeFirstOrNull() ?: factory()
        fun release(obj: T) { available.addLast(obj) }
    }

    val bufferPool = ObjectPool({ StringBuilder(256) }, 5)
    val buf = bufferPool.acquire()
    buf.append("재사용 가능!")
    println(buf.toString())
    buf.clear()
    bufferPool.release(buf)

    // 4. WeakReference (캐시)
    var largeData: ByteArray? = ByteArray(1024 * 1024)
    val weakRef = WeakReference(largeData)
    largeData = null  // 강한 참조 제거
    System.gc()
    println("WeakRef 유효: ${weakRef.get() != null}")
}

학습 팁

IntArray, LongArray 등 원시 타입 배열은 박싱 오버헤드가 없어 대량 수치 연산에 훨씬 빠릅니다.

주의할 점

문자열 연결에 +를 반복 사용하면 매번 새 String 객체가 생성됩니다. buildString이나 StringBuilder를 사용하세요.

자주 묻는 질문

메모리 최적화란 무엇인가요?

객체 할당을 줄이고 메모리 사용을 최적화하는 기법입니다. 원시 타입 배열, 객체 풀, WeakReference를 다룹니다.

메모리 최적화 학습 시 주의할 점은 무엇인가요?

문자열 연결에 + 를 반복 사용하면 매번 새 String 객체가 생성됩니다. buildString 이나 StringBuilder 를 사용하세요.