슬롯 테이블 구조의 인메모리는 composition의 현재 상태릉 저장하는 데 최적화면 구조이다. 최초의 composition이 실행될 때 데이터가 구성되고, recomposition이 실행될 때마다 업데이트된다.
Composable 함수가 호출됨으로써 코드의 위치, 매개변수, remember 값, CompositionLocal 등 여러 데이터들이 추적되고 모든 히스토리는 슬롯 테이블에 저장된다.
또한 저장되는 과정에서 변경 목록들은 노드 트리에 변경된 값을 적용한다. 이는 Compose Runtime이 최종적으로 트리를 구체화하는 데 사용하는 추상체인 Applier의 책임이다.
Applier와 Recomposer는 언제, 어떤 스레드에서 recomposition 할지에 대해서도 다뤄보자.
슬롯 테이블 심층 분석
슬롯 테이블이란 텍스트 편집기에서 흔히 사용되는 갭 버퍼의 개념을 바탕으로 한 선형적인 접근에 최적화된 데이터 구조이다.
이러한 특징으로 두 개의 선형 배열에 데이터를 저장하는데, 하나의 배열에는 composition에서 사용 가능한 그룹에 대한 정보를, 다른 하나에는 각 그룹에 속한 슬롯을 저장한다.
var groups = IntArray(0)
private set
var slots = Array<Any?>(0) { null }
private set
그룹 배열은 그룹의 필드 값만 저장하기에 Int로 표현된다. 이는 부모 그룹과 자식 그룹이 필드 형태로 저장된 것이며, 그룹에 대한 메타데이터를 나타낸다.
선형 구조이기 때문에 부모 그룹의 필드가 먼저 나오고, 자식의 필드가 그다음으로 나온다. 이러한 형태는 그룹 트리를 선형적으로 모델링한 것이며 탐색 능력을 향상한다.
슬롯 배열은 그룹과 관련된 데이터를 저장한다.
모든 값을 저장하기 위해 Any로 구현되어 있으며 실제 composition 데이터를 저장한다.
슬롯 테이블은 갭을 사용하여 데이터를 읽고 쓰며, 갭은 테이블에서 일종의 범위성 포인터로 생각하면 된다. 갭이란 주변을 움직이며 데이터가 배열에서 읽고 쓰이는 위치를 결정한다.
'Android' 카테고리의 다른 글
[Android] Compose 런타임 - (3) (0) | 2024.11.27 |
---|---|
[Android] Compose 런타임 - (2) (0) | 2024.11.26 |
[Android] Compose 컴파일러 - (8) (0) | 2024.11.22 |
[Android] Compose 컴파일러 - (7) (0) | 2024.11.21 |
[Android] Compose 컴파일러 - (6) (0) | 2024.11.20 |