@Composable 어노테이션 사용 → 컴파일러에게 이 함수가 “데이터를 노드로 변환해 Composable 트리에 기재하겠다”
@Composable (Input) ‑> Unit에서 출력은 우리가 생각하는 함수의 반환 값이 아니라, 트리에 요소를 삽입하기 위한 동작 (action)이다.

Composable 함수를 실행하는 목적은 트리의 인메모리 표현을 만들거나 업데이트하는 것이다. Composable 함수는 읽은 데이터가 변경될 때마다 다시 실행되므로 나타내는 메모리 구조를 항상 최신 상태로 유지한다.
Compose Runtime은 Composable 함수가 사전에 정의된 특성을 준수하도록 가정하기 때문에 병렬 Composition, 우선순위에 따른 임의의 Composition 정렬, 스마트 recomposition, 위치 기억법 등 다양한 런타임 최적화 기법을 포함한다.
Compose Compiler는 Composable 함수의 중간 표현인 IR을 가로채고 변환하여 원본 소스의 모든 Composable 함수에 추가적인 정보를 부여한다. 각 함수의 매개변수 목록의 끝에 새롭게 Composer가 추가되며, Composer 매개변수의 인스턴스는 런타임에 주입되며, 모든 하위 Composable 호출로 전달되므로 트리의 모든 수준에서 접근가능하다.
// Greeting.kt
@Composable
fun Greeting(name: String) {
Text(text = name)
}
// Decompile
public static final void Greeting (
@NotNull Speaker speaker, @Nullable **Composer $composer**, int $changed
) {
TextKt.Text--4IGK_g(
name, (Modifier)null, 0L, 0L, (FontStyle)null, (FontWeight)null,
(FontFamily)null, 0L, (TextDecoration)null, (TextAlign)null,
0L, 0, false, 0, 0, (Function1)null, (TextStyle)null,
$composer, 14 & $dirty, 0, 131070
);
}
Compose Compiler는 Composable 함수에 엄격한 규칙을 부과하는데, Composable 함수는 오로지 다른 Composable 함수에서만 호출될 수 있다.
동일한 입력 매개변수로 Composable 함수를 여러 번 다시 실행하더라도 동일한 트리가 생성되어야 한다.
Compose에서 Recomposition이란 입력값이 변경될 때마다 Composable 함수를 다시 실행하여 업데이트된 정보를 방출시키고 트리를 업데이트하는 작업이다.
Recomposition 과정은 트리를 아래로 순회하면서 어떤 노드를 재구성 해야하는지 확인한다. 이 과정에서 입력값이 변경된 노드만 recomposition을 수행하고 나머지는 생략한다. 동일한 입력값에 대한 결과는 이미 메모리에 적재되어 있기 때문이다.
Side Effect는 호출된 함수의 제어를 벗어나서 발생할 수 있는 예상치 못한 모든 동작을 의미한다.