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 class는 equals/hashCode를 자동 생성하므로 캐시 키로 사용하기에 적합합니다.
주의할 점
플라이웨이트 객체는 불변이어야 합니다. 공유 객체를 변경하면 모든 참조자에게 영향을 미칩니다.
자주 묻는 질문
플라이웨이트 패턴 (Flyweight)란 무엇인가요?
공유 가능한 객체를 재사용하여 메모리를 절약하는 패턴입니다. 대량의 유사 객체 생성 시 유용합니다.
플라이웨이트 패턴 (Flyweight) 학습 시 주의할 점은 무엇인가요?
플라이웨이트 객체는 불변이어야 합니다. 공유 객체를 변경하면 모든 참조자에게 영향을 미칩니다.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.