스타일은 설계에 따라 수정자와 다릅니다. 스타일은 수정자를 대체하지 않습니다. 대신 두 시스템은 서로 다른 목표를 가지고 공존합니다. 내부적으로 스타일은 수정자입니다. 수정자로 스타일이 할 수 있는 모든 작업을 할 수 있지만 수정자의 모든 기능을 스타일에서 사용할 수 있는 것은 아닙니다.
다음은 스타일과 수정자를 비교한 것입니다.
| 기능 | 수정자 | 스타일 |
|---|---|---|
| 기본 목표 | 동작, 시맨틱스, 복잡한 레이아웃을 정의합니다. 수정자는 특정 컴포저블의 개별 요소를 즉석에서 조작하며 테마에서 아래로 전달되지 않습니다. | 시각적 모양, 개별 항목 크기 조정, 테마 지정 가능한 속성을 정의합니다. 스타일은 테마 수준에서 작동하며 구성요소 수준에서 덮어쓸 수 있습니다. 아래로 전달되어 다양한 컴포저블에 스타일을 적용합니다. |
| 로직 | 추가 - 수정자가 결합되어 새로운 결과를 형성합니다. | 덮어쓸 수 있음 - 스타일에서 설정된 마지막 속성이 우선합니다. 스타일은 정의된 우선순위 계층 구조에 따라 서로 재정의하는 단일 속성 레이어 역할을 합니다. |
| 테마 설정 | 테마로 가져오기 어렵고 일반적으로 개별적으로 사용됩니다. | 스타일은 기본적으로 테마 지정이 가능하며 (CompositionLocal에 액세스할 수 있음) 한 번 정의하여 구성요소 전반에서 사용할 수 있습니다. |
| 성능 | 업데이트에는 Compose의 세 가지 단계(컴포지션, 레이아웃, 그리기)가 모두 필요한 경우가 많습니다. 수정자의 우수한 애니메이션 성능을 달성하려면 람다 기반 버전을 작성해야 하는 경우가 많습니다. | 컴포지션 단계를 건너뛰고 레이아웃 및 그리기 단계에서만 활성화되어 재구성을 줄입니다. 객체 할당이 덜 필요합니다. |
| 애니메이션 | animate*AsState와 같은 별도의 애니메이션 기본 요소를 사용해야 합니다. |
일부 애니메이션을 처리하는 기본 제공 animate { } API가 있습니다. |
수정자의 제한사항
수정자는 현재 Compose 환경에서 많은 이점을 제공합니다. 하지만 스타일은 수정자의 일부 제한사항을 해결하며, 다음 목록에서 설명합니다.
- 수정자는 일반적으로 컴포지션 단계에서 생성됩니다. 람다 기반 수정자를 만들지 않는 한 색상과 같은 작은 시각적 변경사항에도 컴포지션, 레이아웃, 그리기를 완전히 다시 실행해야 할 수 있습니다.
- 조건부 수정자는 유창한 체인 내에서 중단적인 if-else 로직이 필요합니다. 애니메이션을 적용하려면 수동 상태 상용구 코드가 필요하며 고성능 '자동 애니메이션' 메커니즘이 없습니다.
- 수정자는 대체하는 것이 아니라 스택됩니다. 구성요소의 기본 테두리를 재정의할 수 없습니다. 위에 두 번째 테두리만 그릴 수 있습니다.
- 수정자는 전역 테마로 추상화하기 어렵습니다. 따라서 테마는 일반적으로 재사용 가능한 수정자 구성 대신 원시 값을 저장합니다.
스타일의 제한사항
스타일은 수정자의 일부 격차를 메울 수 있지만 수정자를 완전히 대체할 수 없는 몇 가지 제한사항도 있습니다.
- 스타일은 전문화된 수정자입니다. 수정자는 스타일이 하는 모든 작업을 할 수 있지만 그 반대는 사실이 아닙니다. 따라서 스타일은 수정자를 보완할 수 있지만 대체할 수는 없습니다.
- 스타일은 시각적 구성 (배경, 패딩, 테두리)으로 제한됩니다. 클릭 로직, 제스처 감지, 접근성 시맨틱스와 같은 동작을 처리할 수 없습니다.
- 스타일을 최종 상태로 확인하는 것은 단일 수정자를 적용하는 것보다 비용이 많이 듭니다. 시스템은 가능한 모든 속성 값을 포함하는 데이터 구조를 생성해야 하며 상속된 속성의 조회는 이를 더욱 복잡하게 만듭니다.
수정자보다 스타일을 사용해야 하는 경우
스타일 사용 여부는 앱과 사용 사례에 따라 크게 달라지지만 다음 가이드라인은 수정자보다 스타일을 선호해야 하는 경우를 결정하는 데 도움이 됩니다.
- 테마 전체 일관성을 달성하려면: 스타일은 전역 테마로 '가져오기'하도록 설계되었습니다. 반복되는 수정자를 모든 구성요소에 전달하는 대신 테마에서 단일 스타일을 정의하여 전체 앱에서 통합된 모양을 만들 수 있습니다.
- 잦은 애니메이션을 실행할 때: 스타일은 레이아웃 및 그리기 단계에서 평가되므로 컴포지션 단계를 완전히 우회하면서 색상 또는 크기와 같은 속성을 애니메이션으로 만들 수 있습니다. 이렇게 하면 성능 오버헤드가 크게 줄어듭니다. 시각적 속성 애니메이션을 실행할 때는 수정자 대신 스타일을 사용하세요.
- 재정의 대 스택: 기본 속성을 대체해야 하는 경우 스타일을 사용합니다. 수정자는 추가적이지만 (테두리를 추가하면 두 번째 테두리가 스택됨) 스타일은 '마지막 쓰기 우선' 로직을 사용하므로 시각적 혼란 없이 배경이나 패딩을 더 쉽게 교체할 수 있습니다.
- Material 구성요소 맞춤설정: Material 구성요소가 스타일 매개변수를 제공하는 경우 맞춤설정을 위한 권장 접근 방식입니다. 이러한 스타일을 사용하면 컴포저블의 내부 구조 내에서 액세스하거나 수정할 수 없는 특정 속성에 액세스하고 수정할 수 있습니다.