Glacier's Daily Log

Compose Strong Skipping Mode의 람다 메모라이제이션 기능 본문

Coding/Android

Compose Strong Skipping Mode의 람다 메모라이제이션 기능

h__glacier_ 2024. 12. 13. 15:19
반응형

Strong Skipping Mode의 람다 메모라이제이션 기능

Strong Skipping Mode는 Compose가 람다를 처리하는 방식을 개선해 리컴포지션 최적화를 자동으로 지원할 수 있음. 이 기능은 Compose 1.5.0 이상에서 활성화되며, 람다 사용 시 리컴포지션을 방지할 수 있도록 자동으로 최적화를 제공할 수 있음.


람다 메모라이제이션의 기본 원리

Compose는 람다가 이전과 동일한 객체인지 확인해 리컴포지션을 건너뛸 수 있을지 판단함. 이전 Compose에서는 람다가 새로운 객체로 간주되면 리컴포지션이 발생했지만, Strong Skipping Mode에서는 이를 자동으로 메모라이제이션하여 불필요한 리컴포지션을 줄일 수 있음.

1. 람다의 안정성 판단

  • Strong Skipping Mode는 람다의 Stable 여부를 판단할 수 있음.
  • 람다가 이전 값과 동일한 동작을 수행하는지 확인해 메모라이제이션 없이도 리컴포지션을 건너뛸 수 있음.

2. 메모라이제이션 자동화

  • 기존에는 개발자가 remember를 사용해 람다를 안정화해야 했음.val onClick = remember { { item: String -> onItemClicked(item) } }
  • Strong Skipping Mode가 활성화되면 Compose가 람다를 자동으로 메모라이제이션할 수 있어 위와 같은 작업이 필요 없을 수 있음.

Strong Skipping Mode 이전 vs 이후

이전 방식

람다가 매번 새로 생성되면 Compose는 이를 새로운 객체로 간주해 리컴포지션을 트리거할 수 있음.

@Composable fun Example(item: String, onItemClicked: (String) -> Unit) { 
	Button(onClick = { onItemClicked(item) }) { Text("Click me") }
}

위 코드에서는 onClick 내부의 람다가 새롭게 생성되므로, 버튼이 리컴포지션될 가능성이 있음.

이후 방식

Strong Skipping Mode는 람다를 내부적으로 메모라이제이션해 리컴포지션을 방지할 수 있음.

@Composable fun Example(item: String, onItemClicked: (String) -> Unit) { 
	Button(onClick = { onItemClicked(item) }) { Text("Click me") }
}

동일한 람다라고 Compose가 판단하면 리컴포지션을 건너뛸 수 있음.


적용 범위와 한계

적용되는 경우

  1. 람다 내부가 간단하고 상태를 변경하지 않는 경우:
    • Compose는 람다의 내부 구조를 분석해 변경 여부를 판단할 수 있음.
    • 예를 들어, 전달된 매개변수를 사용하는 단순 람다.
  2. 람다가 Stable 객체만 사용하는 경우:
    • 람다가 불변 데이터나 Stable 객체를 참조할 경우 메모라이제이션 효과를 볼 수 있음.

적용되지 않는 경우

  1. 람다 내부에서 상태를 변경하는 경우:
    • 람다가 외부 상태를 변경하거나 Stable하지 않은 객체를 참조하면 Compose는 이를 메모라이제이션하지 않을 수 있음.
    • 이럴 때는 개발자가 명시적으로 remember로 안정화해야 할 수 있음.
  2. 람다가 복잡한 계산을 수행하는 경우:
    • Strong Skipping Mode는 복잡한 계산이 포함된 람다를 메모라이제이션하지 않을 수 있음. 명시적으로 메모라이제이션하는 것이 필요할 수 있음.

람다 메모라이제이션이 필요한 경우 vs 필요 없는 경우

필요 없는 경우

Strong Skipping Mode가 활성화된 상태에서는 아래처럼 단순한 람다는 자동으로 메모라이제이션될 수 있음.

Button(onClick = { onItemClicked(item) }) { Text("Click me") }

여전히 필요할 수 있는 경우

람다가 상태를 참조하거나 동적으로 생성되는 경우 remember로 메모라이제이션을 명시적으로 처리해야 할 수 있음.

val onClick = remember(item) { { onItemClicked(item) } } Button(onClick = onClick) { Text("Click me") }


결론

  • Strong Skipping Mode의 람다 메모라이제이션은 Compose가 개발자 대신 람다의 안정성을 자동으로 관리할 수 있도록 도와줌.
  • 대부분의 단순 람다에서는 remember 없이도 리컴포지션 최적화가 가능할 수 있음.
  • 하지만, 람다가 상태를 참조하거나 복잡한 연산을 수행하는 경우에는 여전히 명시적으로 remember를 사용하는 것이 필요할 수 있음.
반응형
Comments