본문 바로가기
프로그램 개발해서 돈벌기/Android

안드로이드 코틀린에서 싱글톤과 gc 메모리 사용 단점

by ubmuhan 2023. 3. 23.
반응형

안드로이드 코틀린에서 싱글톤 패턴(Singleton Pattern)을 사용하면 객체를 전역적으로 사용할 수 있기 때문에 코드의 재사용성과 유지보수성이 높아질 수 있습니다. 하지만 싱글톤 패턴은 메모리 누수(Memory Leak)를 발생시킬 수 있는 단점이 있습니다. 싱글톤 객체가 생성된 후에는 앱이 종료될 때까지 메모리를 점유하고 있기 때문에, 객체가 사용되지 않더라도 메모리를 계속 점유하고 있을 수 있습니다. 이로 인해 메모리 사용량이 증가하여 앱의 성능에 영향을 미칠 수 있습니다.

 

또한, 가비지 컬렉션(Garbage Collection) 메모리 사용에 대한 단점도 있습니다. 안드로이드에서는 가비지 컬렉션을 통해 더 이상 사용되지 않는 객체를 메모리에서 제거합니다. 그러나 싱글톤 객체는 앱이 종료될 때까지 메모리에 유지되므로, 가비지 컬렉션이 발생하지 않아 메모리 누수가 발생할 수 있습니다.

 

따라서 싱글톤 패턴을 사용할 때에는 메모리 누수를 방지하기 위해 객체를 생성한 후에는 사용이 끝난 경우 적절하게 null로 초기화하거나, 앱이 종료될 때 명시적으로 해제해주어야 합니다. 또한, 메모리 사용량이 많은 싱글톤 객체를 사용할 때에는 메모리를 효율적으로 사용하기 위해 캐싱(Caching) 등의 기법을 적용해야 합니다.

 

싱글톤에서 캐싱 방법

인터넷에서 이미지를 가져와서 보여주는 기능을 구현한다고 가정해보겠습니다. 이 경우, 이미지를 매번 다운로드 받아서 보여주는 것은 시간과 데이터 사용량이 많아지기 때문에 적절하지 않습니다. 대신, 이미지를 한 번 다운로드 받아서 캐시에 저장해두고, 다음에 동일한 이미지를 사용할 때는 캐시에서 가져와서 보여주는 방법을 사용할 수 있습니다.

이를 싱글톤 패턴으로 구현해보겠습니다. 우선, 이미지를 캐시에 저장하기 위한 클래스를 작성합니다.

 

class ImageCache private constructor() {

    private val cache = HashMap<String, Bitmap>()

    fun put(key: String, bitmap: Bitmap) {
        cache[key] = bitmap
    }

    fun get(key: String): Bitmap? {
        return cache[key]
    }

    companion object {
        private var instance: ImageCache? = null

        fun getInstance(): ImageCache {
            if (instance == null) {
                instance = ImageCache()
            }
            return instance as ImageCache
        }
    }
}

 

위 코드에서는 ImageCache 클래스를 싱글톤 패턴으로 구현하였습니다. getInstance() 메서드를 호출하면, 이미 생성된 ImageCache 객체가 있으면 해당 객체를 반환하고, 없으면 새로운 객체를 생성하여 반환합니다.

이제, 이미지를 다운로드해서 캐시에 저장하는 코드를 작성합니다.

 

class ImageDownloader {

    fun downloadImage(url: String): Bitmap {
        val imageCache = ImageCache.getInstance()

        var bitmap = imageCache.get(url)
        if (bitmap != null) {
            return bitmap
        }

        // 이미지를 다운로드 받아서 bitmap 객체에 저장
        // ...

        imageCache.put(url, bitmap)

        return bitmap
    }
}

 

위 코드에서는 ImageCache 싱글톤 객체를 가져와서 캐시에 이미지가 있는지 확인합니다. 이미지가 있으면 해당 이미지를 반환하고, 없으면 다운로드 받아서 이미지를 생성하고 캐시에 저장합니다.

 

이렇게 싱글톤 패턴을 사용하여 캐싱을 구현하면, 이미지 다운로드를 한 번만 하고, 캐시에서 이미지를 가져와서 보여줄 수 있으므로, 시간과 데이터 사용량을 절약할 수 있습니다.

 

 

 
반응형

댓글