| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 깃허브
- OS
- JetPack
- Compose
- 더티비트
- 데드락
- Di
- Constraint Layout
- readme
- SOLID
- android study jam
- coroutine flow
- design pattern
- github
- 운영체제
- Android
- Class.class
- Spring Boot
- spring
- kotlin
- O.S
- test
- LiveData
- git
- 마크다운
- 리드미
- 다단계 큐
- markdown
- Data Binding
- JUnit
- Today
- Total
목록Android (11)
차지
프레임의 3가지 단계 Composition → Layout → Drawing 1. Composition Composable이 생성되는 단계입니다. 생성이 되면 다음 단계를 수행합니다. 2. Layout measurement, placement 두 단계가 존재합니다. 재배치를 하더라도 재측정을 하지는 않습니다. 3. Drawing Canvas를 호출하거나 draw관련 메서드를 호출하면 실행합니다. State 읽기 최적화 Box { val listState = rememberLazyListState() Image( // Non-optimal implementation! Modifier.offset( with(LocalDensity.current) { // State read of firstVisibleIte..
Side effects 일반적인 수명주기에서 더 복잡한 작업을 수행할 때 Side Effects를 필요로 합니다. LaunchedEffect Composable 내에서 suspend 함수를 호출할 때 사용 매개변수 중 하나가 변경되면 재호출 ex) 스낵바 호출, 스크롤 등의 일반적인 동작 rememberCoroutineScope Composable 외부에서 코루틴 실행할 때 사용 ex) 다른 composable을 취소시키는 비동기 동작 rememberUpdatedState 값이 변경되더라도 recomposition되지 않는 효과에서 값 참조 @Composable fun LandingScreen(onTimeout: () -> Unit) { // This will always refer to the late..
이 글은 RecyclerView로 구성된 한 화면을 Compose로 변경해보며 느낀점과 compose의 기본 개념을 서술합니다. Compose의 특징 적은 수의 코드 손쉬운 유지보수 실시간 미리보기 기능 빠른 개발시간 선언형 프로그래밍 화면 전체를 개념적으로 재생성한 후 변경사항만 적용하는 방식을 적용할 수 있었습니다. 적용 이유와 후기 기존 코드를 migration하며 차이를 느껴보고 싶었습니다. RecyclerView를 작성하는 과정에서 코드 수가 크게 감소했다. compose는 성능이 좋지 않다는 이야기가 있습니다. 성능 이슈는 타인의 말을 들어서는 크게 와닿지 않았습니다. 직접 비교하기 위해 기존 코드를 compose로 변경했습니다. 의도한 대로 성능의 차이를 느끼지는 못했다. 하지만 성능을 생각..
데이터 바인딩 이전에 포스팅했던 View binding과 같이 뷰 속성을 참조하는 방식 중 하나입니다. View binding보다 성능은 떨어질 수 있습니다. 사용 전 build.gradle에서 android 블록에 dataBindinbg { enabled = true } 를 추가해야 합니다. plugin 블록에 `id 'kotlin-kapt' 를 추가해야 합니다. 컴파일될 때 바인딩 클래스가 자동으로 구현됩니다. layout.xml에선 최상위에 layout 블록이 놓여집니다. 그리고 data 블록 안에 바인딩할 데이터를 작성합니다. 사용 Activity, Fragment에서 binding 변수를 만듭니다. view에 해당하는 xml파일을 매칭시켜 주면서 binding 변수에 할당합니다. ..
클래스를 테스트할 때 private 변수는 외부에서 참조가 되지 않기 때문에 테스트에서 역시 참조할 수 없습니다. 하지만 해당 필드를 접근 가능하게 변경하고, 접근해서 참조하는 방법이 있습니다. val field = className.javaClass.getDeclaredField("filed_name") field.isAccessible = true field.set(className, value) getDeclaredField 메서드로 참조합니다. isAccessible 값을 true로 지정해 접근을 허용합니다. filed.get 또는 filed.set 메서드로 접근합니다. filed.set의 매개변수로는 접근할 클래스와 set할 값을 입력합니다.
Junit Test Android 에서 단위 테스트를 진행할 때에는 Junit 라이브러리를 사용합니다. 이 글은 Junit4 버전으로 작성했습니다. build.gradle에 코드를 추가하면 사용할 수 있습니다. dependencies { ... testImplementation 'junit:junit:4.+' ... } 테스트할 객체나 함수에 커서를 올리고 cmd(ctrl) + shift + T 단축키를 사용하면 테스트 파일을 생성하거나, 이미 존재한다면 테스트 파일로 이동합니다. @Test 어노테이션을 붙인 함수를 작성하면, 테스트를 진행할 수 있습니다. Test Annotation @Test 작성할 테스트 코드입니다. 함수 이름에는 여러가지 컨벤션이 있습니다. snake_case를 사용해서 Metho..
Recycler View 영어 뜻 그대로 재활용하는 뷰를 의미합니다. 스크롤을 자동으로 지원하며 화면에서 사라지거나 생겨나는 뷰를 재사용합니다. 구성 ViewHolder: View의 래퍼입니다. Adapter: View를 데이터와 바인딩합니다. 확장이 가능해 개발자가 어댑터를 정의할 수 있습니다. 구현 사전에 라이브러리를 추가합니다. 재사용할 view를 xml파일로 만듭니다. Linear, Grid 등의 Layout을 설정합니다. 세 함수를 override 해서 작성합니다. onCreateViewHolder() // viewHolder를 만들 때 호출 onBindViewHolder() // ViewHolder와 data를 bind 할 때 호출 getItemCount() // 데이터 세트 크기를 가져올 때..
아키텍처 패턴 프로젝트의 규모가 점점 커지다보면 유지보수를 고려해야 합니다. 객체지향적인 개념을 다시 생각해보기도 하고, 디자인 패턴을 적용해보기도 하고 아키텍쳐 패턴을 고려하기도 합니다. 그 중 아키텍쳐 패턴은 파일을 구조화하고 각 파일을 묶는 패키지의 역할을 분류합니다. MVC Model - View - Controller 로 파일 구조를 나누는 방법을 의미합니다. 주로 웹에서 사용하며 Android에서는 MVC - MVP - MVVM 의 순서로 유행해왔습니다. MVC 패턴을 따르면 Controller에 코드가 몰려 결합도가 커지는 단점을 갖습니다. 저는 Controller에 있는 코드는 테스트를 진행하기 어려워 MVC 패턴을 지양하지만 구조를 나누는 공부를 접하기 좋았습니다. Model 데이터를 갖..