Compose Internal을 읽어보면서 궁금했던 점에 자료를 찾아보면서
이해한 내용을 정리한 글입니다. ☺️
혹시 잘못된 점이 있다면 댓글 부탁드립니다!! 🙇🏻♀️
@Composable
fun Header (
text: String,
$composer: Composer<*>,
$changed: Int
) {
var $dirty = $changed
if ($changed and 0b0110 === 0) {
$dirty = $dirty or if ($composer.changed(text)) 0b0010 else 0b0100
}
if ($dirty and 0b1011 xor 0b1010 !== 0 || !$composer.skipping) {
f(text)
} else {
$composer.skipToGroupEnd()
}
}
1. $changed and 0b0110 === 0
parameter로 전달된 text의 변경사항이 아직 확인되지 않았으므로 확인이 필요하다는 의미
만약 text의 변경사항이 확인되지 않았다면, $dirty에 text의 변경사항을 적용해주는 다음 코드를 실행하게 됩니다.
이 때, text의 변경사항은 $composer.changed(text)에서 확인!
- text에 변경사항이 있다면 2번째 bit를 1로 toggle -> 0b0010
- text에 변경사항이 없다면 3번째 bit를 1로 toggle -> 0b0100
위 작업을 통해 $dirth에 변경사항 여부 Flag가 적용되어 집니다.
2. $dirty and 0b1011
위에서 3번째 bit는 text에 변경사항이 없는 경우에 1로 toggle하는 점을 확인하였습니다.
0b1011은 $dirty에서 3번째 bit가 무엇이든 상관 없이 0으로 clear 시키므로,
즉 위 연산은 text가 변경되었을 경우에 해당하는 ( 또는 recomposition이 필요한 경우에 해당하는 ) bit를 제외하고 clear하는 연산이라고 생각합니다.
3. xor 0b1010 !== 0
xor는 동일한 bit인 경우에는 0을 반환하는 비트 연산자 입니다.
즉, 3번째 bit는 (2)에서 0으로 clear 되었기 때문에 text의 값이 변경되었거나(2번째 bit가 1) compose 내부적으로 recomposition이 변경된 상태일 때(1번째와 4번째 bit가 1)인 경우 0과 다릅니다.
4. 결론
Compose는 changed parameter를 통해 smart recomposition을 제공합니다.
parameter의 변경 사항을 확인이 필요한 경우(1) parameter의 변경 여부에 따라 알맞은 bit를
toggling 해줍니다.
이후 $dirty 값을 이용하여 값이 변경되었거나, skippable 하지 않은 Composable에 경우
f 메서드를 호출하여 recomposition을 실행하고 아닐 경우 skip 하는 방향으로 진행하게 됩니다.
'Android > Android' 카테고리의 다른 글
[Test] Hamcrest를 위한 Junit의 assertThat이 Deprecated된 건에 대해 (0) | 2024.11.19 |
---|---|
[Android] 실행시점에 Permission 요청하기 (0) | 2023.04.23 |
[Android] 2023 Google Play Policy Bytes (0) | 2023.04.12 |
[Compose] Custom BoxShadow를 만들어보자! (1) | 2023.04.04 |
[Compose] Font에 적용되는 Padding 제거하기 (0) | 2023.04.04 |