Android

패스트캠퍼스 환급챌린지 9일차: UPSKILL : 상위 1% 개발자들의 생산성 향상을 위한 Jetpack Compose 강의 후기

dsungc 2025. 7. 9. 23:32
728x90
반응형

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

 

패스트캠퍼스 → https://fastcampus.info/4n8ztzq

 

1. 학습 인증샷

 

a. 공부 시작 시간

b. 공부 종료 시간

c. 수강 인증 사진

 

d. 학습 인증샷

 

e. 학습 통계 완강률 캡쳐 사진


2. 학습 후기

이번 강의에선 Kotlin Compose에서 상태(State)는 UI와 값을 관리하는 개념에대해 학습했습니다. 이전에도 잠간 정리한 적이 있었는데, 다시 한 번 정리해보겠습니다.

 

mutableStateOf나 remember { mutableStateOf(...) }로 선언한 상태값이 변경되면, 이를 참조하는 컴포저블이 자동으로 재컴포지션을 수행해 UI가 갱신됩니다. 이 동작 방식은 SwiftUI의 @State와 유사하고, SwiftUI도 값이 바뀌면 뷰가 자동으로 업데이트된다는 점에서 유사합니다. 다만 Compose는 remember 스코프를 통해 상태의 수명 주기(lifecycle)를 보다 명시적으로 관리할 수 있고, Kotlin의 델리게이트 문법(by)을 활용해 코드가 간결하다는 장점이 있습니다.

 

상태 호이스팅(State Hoisting)은 컴포저블 내부에서 상태를 직접 관리하지 않고 상위 계층으로 끌어올려(hoist) 관리하는 패턴으로, UI 로직과 상태 로직을 분리해 재사용성과 테스트 용이성을 높여 줍니다. 이를테면 ‘Stateless’ 컴포저블은 순수하게 화면을 그리기만 하고, count: Int와 onIncrement: () -> Unit을 파라미터로 받아 처리하며, 실제 상태 보유는 ‘Stateful’ 컴포저블이 remember { mutableStateOf(0) }로 담당합니다. SwiftUI에서도 상위 뷰가 @State를 관리하고, 하위 뷰엔 @Binding을 통해 상태를 전달하는 구조가 권장되므로 개념적으로 완전히 동일하다고 느꼈습니다.

 

애니메이션 측면에서 Compose는 animate*AsState(예: animateFloatAsState)를 통해 단일 값 애니메이션을 손쉽게 만들고, updateTransition이나 rememberInfiniteTransition으로 더 복합적인 상태 전환과 반복 애니메이션을 구현할 수 있는 강력한 API를 제공합니다. 또한 AnimatedVisibility, Crossfade, animateContentSize 같은 빌트인 컴포저블로 화면 요소의 등장·소멸이나 크기 변화를 매끄럽게 처리할 수 있죠. SwiftUI에서는 withAnimation { ... } 블록이나 .animation() 수식어, Animation.spring(), Animation.easeInOut 같은 프로퍼티를 사용해 상태 변경 시 자동으로 애니메이션을 연동하며, matchedGeometryEffect로 뷰 간 매칭 애니메이션을 지원합니다.

 

비교를 덧붙이면, Compose는 Kotlin의 함수형 스타일과 확장 함수를 활용한 DSL이 직관적이고, remember·mutableStateOf 조합으로 상태 선언이 매우 간결해 빠르게 적응할 수 있었습니다. State Hoisting 덕분에 UI 테스트 시 상태를 외부에서 주입하기 편리했고, 애니메이션 API로 세밀한 제어가 가능해 복잡한 효과도 손쉽게 구현할 수 있었습니다. 반면 SwiftUI는 Apple 플랫폼에 최적화된 안정성이 돋보이고, 런타임에 발생할 수 있는 오류가 적습니다. 전반적으로 두 프레임워크는 개념이 비슷해 iOS 개발자가 Compose로 넘어오는 데 장벽이 낮고, 양쪽을 모두 다룰 수 있다면 각 플랫폼의 특성과 장점을 최대한 활용할 수 있다고 느꼈습니다.

728x90
반응형