성장기록지

Compose Stability란? 본문

안드로이드/안드로이드 지식

Compose Stability란?

pengcon 2025. 1. 20. 20:10

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

 

Compose의 안정성  |  Jetpack Compose  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Compose의 안정성 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Compose는 유형을 안정적이거나 불안정

developer.android.com

https://developer.android.com/develop/ui/compose/performance/stability/diagnose?hl=ko

 

안정성 문제 진단  |  Jetpack Compose  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 안정성 문제 진단 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 불필요하거나 과도한 리컴포지션이

developer.android.com

https://developer.android.com/develop/ui/compose/performance/stability/fix?hl=ko

 

안정성 문제 해결  |  Jetpack Compose  |  Android Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 안정성 문제 해결 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 성능 문제를 일으키는 불안정한 클

developer.android.com