스타일과 수정자

스타일은 설계상 수정자와 다릅니다. 스타일은 수정자를 대체하지 않습니다. 대신 두 시스템은 서로 다른 목표를 가지고 공존합니다. 내부적으로 스타일은 수정자입니다. 수정자를 사용하면 스타일로 할 수 있는 모든 작업을 할 수 있지만 수정자의 일부 기능은 스타일에서 사용할 수 없습니다.

스타일과 수정자를 비교하면 다음과 같습니다.

기능 수정자 스타일
기본 목표 동작, 시맨틱, 복잡한 레이아웃을 정의합니다. 수정자는 특정 컴포저블의 개별 요소를 즉시 조작하며 테마에서 아래로 전달되지 않습니다. 시각적 모양, 개별 항목 크기, 테마 설정 가능 속성을 정의합니다. 스타일은 테마 수준에서 작동하며 구성요소 수준에서 덮어쓸 수 있습니다. 이러한 스타일은 여러 컴포저블에 걸쳐 적용됩니다.
논리 부가적 - 수정자가 결합되어 새로운 결과를 형성합니다. 덮어쓸 수 있음 - 스타일에서 마지막으로 설정된 속성이 우선합니다. 스타일은 정의된 우선순위 계층 구조에 따라 서로 재정의하는 단일 속성 레이어 역할을 합니다.
테마 설정 테마로 가져오기 어려우며 일반적으로 개별적으로 사용됩니다. 스타일은 테마를 지정할 수 있고 (CompositionLocal에 액세스할 수 있음) 한 번 정의하여 여러 구성요소에서 사용할 수 있습니다.
성능 업데이트에는 컴포지션, 레이아웃, 그리기 등 Compose의 세 단계가 모두 필요한 경우가 많습니다. 수정자의 애니메이션 성능을 높이려면 람다 기반 버전을 작성해야 하는 경우가 많습니다. 컴포지션 단계를 건너뛰고 레이아웃 및 그리기 단계에서만 활성화되어 재구성을 줄입니다. 객체 할당이 적게 필요합니다.
애니메이션 animate*AsState와 같은 별도의 애니메이션 기본 요소를 사용해야 합니다. 일부 애니메이션을 처리하는 기본 제공 animate { } API가 있습니다.

수정자의 제한사항

수정자는 현재 Compose 환경에서 여러 이점이 있습니다. 하지만 스타일은 다음 목록에 설명된 수정자의 일부 제한사항을 해결합니다.

  • 수정자는 일반적으로 컴포지션 단계에서 생성됩니다. 람다 기반 수정자를 만들지 않으면 업데이트로 인해 색상과 같은 작은 시각적 변경사항이 있는 경우에도 컴포지션, 레이아웃, 그리기가 완전히 다시 실행될 수 있습니다.
  • 조건부 수정자는 유연한 체인 내에서 중단되는 if-else 논리가 필요합니다. 애니메이션을 적용하려면 수동 상태 상용구가 필요하며 고성능 '자동 애니메이션' 메커니즘이 없습니다.
  • 수정자는 대체되지 않고 스택됩니다. 구성요소의 기본 테두리를 재정의할 수는 없으며, 위에 두 번째 테두리만 그릴 수 있습니다.
  • 수정자는 전역 테마로 추상화하기 어렵습니다. 따라서 테마는 재사용 가능한 수정자 구성 대신 원시 값을 저장하는 경우가 많습니다.

스타일의 제한사항

스타일은 수정자에 있는 일부 격차를 채울 수 있지만 수정자를 완전히 대체할 수 없는 몇 가지 제한사항도 있습니다.

  • 스타일은 특수 수정자입니다. 수정자는 스타일이 하는 모든 작업을 할 수 있지만 그 반대는 아닙니다. 따라서 스타일은 수정자를 보완할 수는 있지만 대체할 수는 없습니다.
  • 스타일은 시각적 구성 (배경, 패딩, 테두리)으로 제한됩니다. 클릭 로직, 동작 감지, 접근성 시맨틱과 같은 동작은 처리할 수 없습니다.
  • 스타일을 최종 상태로 변환하는 것은 단일 수정자를 적용하는 것보다 비용이 많이 듭니다. 시스템은 가능한 모든 속성 값을 포함하는 데이터 구조를 생성해야 하며 상속된 속성의 조회는 이를 더욱 복잡하게 만듭니다.

수정자보다 스타일을 사용해야 하는 경우

스타일 사용 여부는 앱과 사용 사례에 따라 크게 달라지지만 다음 가이드를 통해 수정자보다 스타일을 선호해야 하는 경우를 파악할 수 있습니다.

  • 테마 전반의 일관성 유지: 스타일은 전역 테마로 '리프트'되도록 설계되었습니다. 반복되는 수정자를 모든 구성요소에 전달하는 대신 테마에서 단일 스타일을 정의하여 앱 전체에서 통일된 디자인을 만들 수 있습니다.
  • 애니메이션을 자주 실행하는 경우: 스타일은 레이아웃 및 그리기 단계에서 평가되므로 컴포지션 단계를 완전히 우회하면서 색상이나 크기와 같은 속성을 애니메이션으로 만들 수 있습니다. 이렇게 하면 성능 오버헤드가 크게 줄어듭니다. 시각적 속성 애니메이션을 실행할 때는 수정자 대신 스타일을 사용하세요.
  • 재정의와 스태킹: 기본 속성을 대체해야 하는 경우 스타일을 사용합니다. 수정자는 추가적 (테두리를 추가하면 두 번째 테두리가 스택됨)인 반면 스타일은 '마지막 쓰기 우선' 로직을 사용하여 시각적 혼란 없이 배경이나 패딩을 쉽게 바꿀 수 있습니다.
  • Material 구성요소 맞춤설정: Material 구성요소가 스타일 매개변수를 제공하는 경우 맞춤설정을 위한 권장 접근 방식입니다. 이러한 스타일을 사용하면 액세스할 수 없는 컴포저블의 내부 구조 내에서 특정 속성에 액세스하고 수정할 수 있습니다.