컴포즈 런타임(The Compose Runtime)
Compose Runtime 내부 동작 정리: SlotTable → ChangeList → Applier → setContent Compose를 쓰다 보면 “상태 바뀌면 알아서 UI가 갱신된다” 정도로 이해하고 넘어가기 쉬운데, 내부에서는 꽤 체계적인 파이프라인이 돌아간다. 핵심은 한 문장으로 요약하면 이렇다. SlotTable에 컴포지션 상태를 저장하고, 변경은 ChangeList에 모아뒀다가, Applier가 실제 노드 트리에 반영한다. 이 글은 그 흐름을 SlotTable/ChangeList/Applier/setContent 관점에서 정리한 내용이다. 1) SlotTable: “현재 컴포지션 상태 저장소” SlotTable은 Compose Runtime이 Composition의 현재 상태 를 들고 있기 위해 사용하는 인메모리 구조다. 초기 composition 때 테이블을 채우고 이후 recomposition 때마다 갱신한다 remember 값, 호출 위치 기반 그룹 정보, 매개변수 관련 정보 등이 여기 쌓인다 즉, 런타임이 “지금 UI가 어떤 구조/상태인지”를 판단하는 기준이 SlotTable이다. 2) 내부 구조: 갭 버퍼 기반 + (groups, slots) 2개 배열 SlotTable은 “빠르게 읽고/수정”하기 위해 갭 버퍼(gap buffer) 아이디어를 활용한다. 구현 관점에서 크게 두 덩어리로 나뉜다. groups : 그룹(Composable 단위) 메타데이터를 저장하는 영역 slots : 그 그룹에 속하는 실제 데이터(예: remember 값)를 저장하는 영역 그리고 갭(gap) 이라는 “비어 있는 연속 구간”을 두고, 삽입/삭제/교체가 일어나면 갭을 이동시키면서 덮어쓰는 방식으로 비용을 줄인다. 예를 들어 조건 분기 UI가 있다면, 조건이 바뀔 때마다 트리를 다 갈아엎는 대신 기존 위치로 갭이 이동한 뒤 필요한 부분만 덮어쓰기 에 가까운 방식이 가능해진다. 3) NonRestartableComposable과 “그룹 타입” 감각 잡...