성장기록지
Compose Stability란? 본문
Stability
Compose는 타입을 stable과 unstable로 간주한다.
stable은 mutable이여도 값의 변경을 알 수 있는 경우나 immutable 타입일 때 이다.
composable에 변경되지 않은 안정적인 매개변수가 있는 경우 컴포저블은 해당 매개변수를 스킵한다.
unstable은 값의 변경을 알기 어려운 경우이다.
Compose는 composable에 unstable 파라미터가 있는 경우 매번 recomposition을 하므로
성능 문제가 발생할 수 있따.
Immutable한 객체 예시 (Stable)
파라미터가 전부 val로 정의된 원시타입이기 떄문에 변경을 할 수 없다. 따라서 immutable 하고, stable class이다
참고) 모든 원시 타입은 immutable이다. ex) String, Int, Float
data class Contact(val name: String, val number: String)
mutable한 객체 예시 (Unstable)
파라미터가 전부 var로 정의된 원시타입이기 떄문에 변경이 가능하므로 mutable 한 객체이다. (unstable class)
data class Contact(var name: String, var number: String)
그렇다면 파라미터로 set이나 list, Map은 어떨까?
이들은 unstable하다고 간주한다.
왜냐면 Set과 List는 기본적으로 Interface이기 때문에, 컴파일러 입장에선 런타임 시점에 상속받아 어떻게 변할 지 모르므로 unstable이다.
공식문서도 아래와 같은 예시 클래스로 Set이 unstable 하다고 알려주고 있다.
stable 타입으로 만드는 법
위와 같이 모두 immutable 타입임에도 unstable로 간주되는 억울한 상황이 있을 수 있다.
그렇다면 stable로 만드는 방법은 없을까 고민하게 될 것이다.
아래에선 stable로 변경시키는 방법 몇가지를 안내하겠다.
1. Immutable collections 활용
위의 예시인 tags 때문에 unstable이 되었던 snack 클래스를 다시 봐보자,
Set을 변경할 수 없다고 알려준다면 stable이 될 것이다.
이런 경우에는 Kotlinx Immutable Collections 을 활용하면 된다.
아래의 예시에선 불변임을 알려주는 ImmutableSet을 활용하는 예시이다.
2. Annotation 활용
아래 코드와 같은 방식으로 @Immutable이나 @Stable을 달아주면 stable하다고 인식하게 된다.
@Immutable
data class Snack(
…
)
어노테이션은 클래스를 자체적으로 변경 불가능하거나 안정적으로 만드는 것은 아니다.
대신 코틀린의 !!과 같이 컴파일러에게 안전하다고 알리는 것이다.
그러므로 클래스에 주석을 잘못 달면 재구성이 중단될 수 있으니, 유의해야 한다!
어노테이션을 달아도 되는 경우는 다음과 같이 정리 할 수 있다.
- immutable 클래스를 만드는 클래스에서 사용
- 프로퍼티 값이 절대 변경될 수 없는 경우 사용
- 위와같이 값이 변경되지 않는다는 가정에 composition 최적화를 수행 할 수 있는 경우 사용
참고 자료
https://developer.android.com/develop/ui/compose/performance/stability
https://developer.android.com/develop/ui/compose/performance/stability/diagnose?hl=ko
https://developer.android.com/develop/ui/compose/performance/stability/fix?hl=ko
'안드로이드 > 안드로이드 지식' 카테고리의 다른 글
Compose Structure 정리하기 (compiler, Runtime, UI) (0) | 2025.01.22 |
---|---|
Compose Stability 자세히 알아보기! (0) | 2025.01.21 |
안드로이드 MVVM 아키텍쳐란? (0) | 2025.01.13 |
data binding이란? (0) | 2025.01.11 |
State hoisting 탐구 (재사용성, plain state holder class) (0) | 2025.01.10 |