PHpullh
학습 라이브러리/Kotlin/플라이웨이트 패턴 (Flyweight)

KOTLIN · 디자인패턴

플라이웨이트 패턴 (Flyweight)

공유 가능한 객체를 재사용하여 메모리를 절약하는 패턴입니다. 대량의 유사 객체 생성 시 유용합니다.

디자인패턴고급flyweightobject-poolmemory-optimizationcaching

핵심 설명

공유 가능한 객체를 재사용하여 메모리를 절약하는 패턴입니다. 대량의 유사 객체 생성 시 유용합니다.

Kotlin code

data class CharStyle(val font: String, val size: Int, val color: String)

class StyleFactory {
    private val cache = mutableMapOf<String, CharStyle>()
    var cacheHits = 0; var cacheMisses = 0

    fun getStyle(font: String, size: Int, color: String): CharStyle {
        val key = "$font-$size-$color"
        return cache.getOrPut(key) {
            cacheMisses++
            CharStyle(font, size, color)
        }.also { if (cache.containsKey(key) && cacheMisses < cache.size) cacheHits++ }
    }

    fun stats() = "캐시 크기: ${cache.size}, 히트: $cacheHits, 미스: $cacheMisses"
}

data class Character(val char: Char, val x: Int, val y: Int, val style: CharStyle)

fun main() {
    val factory = StyleFactory()
    val document = mutableListOf<Character>()

    // 대량 문자 생성 (스타일은 공유)
    val text = "Hello Kotlin World! 안녕하세요 코틀린!"
    text.forEachIndexed { i, c ->
        val style = when {
            c.isUpperCase() -> factory.getStyle("Bold", 14, "red")
            c.isLetter() -> factory.getStyle("Normal", 12, "black")
            else -> factory.getStyle("Normal", 12, "gray")
        }
        document.add(Character(c, i * 10, 0, style))
    }

    println("문자 수: ${document.size}")
    println("스타일 ${factory.stats()}")
    println("고유 스타일: ${document.map { it.style }.distinct().size}")
}

학습 팁

Kotlin의 data classequals/hashCode를 자동 생성하므로 캐시 키로 사용하기에 적합합니다.

주의할 점

플라이웨이트 객체는 불변이어야 합니다. 공유 객체를 변경하면 모든 참조자에게 영향을 미칩니다.

자주 묻는 질문

플라이웨이트 패턴 (Flyweight)란 무엇인가요?

공유 가능한 객체를 재사용하여 메모리를 절약하는 패턴입니다. 대량의 유사 객체 생성 시 유용합니다.

플라이웨이트 패턴 (Flyweight) 학습 시 주의할 점은 무엇인가요?

플라이웨이트 객체는 불변이어야 합니다. 공유 객체를 변경하면 모든 참조자에게 영향을 미칩니다.