Details: rememberUpdatedState 내부 구현
rememberUpdatedState는 내부적으로 어떻게 구현되어 있나요?
rememberUpdatedState의 동작 방식은 처음에는 복잡해 보일 수 있지만, 내부 구현은 놀랍도록 단순합니다. 그 구현을 직접 살펴보면 동작 원리를 명확히 이해할 수 있습니다.
내부 구현 코드
동작 원리 분석
rememberUpdatedState의 구현은 두 가지 핵심 동작으로 구성됩니다.
1. remember { mutableStateOf(newValue) }
remember를 사용하여 MutableState<T> 객체를 최초 Composition 시 한 번만 생성하고 기억합니다. 이 객체는 리컴포지션이 발생해도 새로 생성되지 않고 동일한 인스턴스가 유지됩니다.
2. .apply { value = newValue }
apply 스코프 함수를 통해 리컴포지션마다 기억된 MutableState의 value를 최신 newValue로 갱신합니다. Composable 함수가 리컴포지션될 때마다 rememberUpdatedState가 호출되고, 이때 이전에 기억된 상태가 새로운 값으로 업데이트됩니다.
remember만 사용했을 때와의 차이
단순히 remember { mutableStateOf(newValue) }만 사용하면 초기값만 기억되고 이후 newValue가 변경되어도 상태가 갱신되지 않습니다. rememberUpdatedState는 여기에 .apply { value = newValue }를 추가하여 리컴포지션마다 값을 동기화합니다.
요약
- Q) rememberUpdatedState를 직접 구현한다면 어떻게 작성할 수 있나요?
내부 구현을 이해하면 동일한 동작을 직접 작성할 수 있습니다.
@Composable fun <T> myRememberUpdatedState(newValue: T): State<T> { // 1. 최초 Composition 시 MutableState 생성 (이후 리컴포지션에서는 재사용) val state = remember { mutableStateOf(newValue) } // 2. 매 리컴포지션마다 최신 값으로 갱신 state.value = newValue return state }이는 공식 구현인
remember { mutableStateOf(newValue) }.apply { value = newValue }와 완전히 동일하게 동작합니다. 핵심은remember로 상태 인스턴스의 수명을 Composition에 연결하면서, 동시에 매 리컴포지션마다 값을 갱신하는 것입니다.