전체 글
![[Kotlin] Flow<List<T>> 에서 List<T>로 변환하기.](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5EwxH%2FbtrL9b2GcKN%2FUiJRS7xN4ne3kPJdoOGr01%2Fimg.png)
[Kotlin] Flow<List<T>> 에서 List<T>로 변환하기.
간혹 코루틴에서 Flow를 사용하여 데이터의 흐름을 제어하는 경우에 Flow 내부에 List를 사용하는 경우가 종종 있다. 이러한 상황에서 Flow 내부 List를 얻기 위해서는 flat-mapping 을 사용하여 얻을 수 있다. suspend fun Flow.flattenToList() = flatMapConcat { it.asFlow() }.toList() suspend fun test() { val flowOfLists: Flow = flowOf(listOf(1, 2), listOf(3, 4)) val flatList: List = flowOfLists.flattenToList() println(flatList) }
![[Android/Testing] #2. 좋은 테스트는 어떻게 작성해야 할까?](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr8RaO%2FbtrLWmbrqHc%2FNd2MYixWmrxUOOe7YBWbek%2Fimg.png)
[Android/Testing] #2. 좋은 테스트는 어떻게 작성해야 할까?
처음 프로젝트를 시작하며 테스트를 작성하는 것 보다 기존의 작성된 코드(Legacy Code, 이하 레거시 코드)를 테스트하기 위한 테스트 코드를 만드는 것은 매우 어려운 일이다. 이 점은 많은 개발자가 실제 경험하면서도 이해하고 있을거라 생각한다. 레거시 코드를 테스트 하기 위해 만들어지는 테스트는 모든 비지니스 로직을 커버하기란 사실상 불가능하다. 테스트 코드는 신규 비지니스 로직보다 먼저 말들어 져야하고, 레거시 코드를 수정하는 경우에도 실패하는 테스트케이스(Failed Testcase)가 먼저 작성되어야 한다. TDD : 실제 구현 코드 작성 전에 테스트부터 작성하자 테스트 주도 개발(Test Driven Development, 이하 TDD)은 애자일 개발 방법론 중 하나인 익스트림 프로그래밍(e..
![[Android/Testing] #1. 왜 테스트를 해야 하는가?](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTEzqP%2FbtrLuCndt2b%2FCDOMrEIMJybxnFjooFlPjk%2Fimg.png)
[Android/Testing] #1. 왜 테스트를 해야 하는가?
테스트는 개발자들이 소프트웨어를 개발하는 과정에서 매우 중요한 부분이다. 개발하는 소프트웨어가 출시되기 전에 치명적인 오류와 잠재적인 문제, 그리고 안전한 코드 작성을 위한 도구로 많이 사용된다. TDD(Test Driven Development, 테스트 주도 개발)은 많은 소프트웨어 회사에서 당연시 될 정도로 테스트는 중요하다. 하지만 아직 테스트는 검증팀에서 해야하는 것이라 생각하는 개발자도 많은 것 같다. 특히 소프트웨어를 모두 개발한 이후에 테스트를 작성하는 방법을 사용하는 개발자들도 많은 것으로 안다. 왜 소프트웨어를 개발하는 과정에서 테스트는 필수이며 안드로이드에서는 어떤 테스트를 주로 사용하는지 정리한다. 테스트란 무엇인가? 테스트는 소프트웨어의 품질을 조사하는 과정이라고 할 수 있다. 20..
![[Android] 하단 탭 사용하기 (BottomNavigation)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDlrqp%2FbtrKU79ctG5%2FbZ1uCyOaKFUPnRLa3ZW8SK%2Fimg.png)
[Android] 하단 탭 사용하기 (BottomNavigation)
BottomNaviagtionView는 NavigationBarView를 확장하는 클래스이다. BottomNaviagtionView는 어플리케이션에서 표준 하단 탐색바를 나타내고 머티리얼 디자인 하단 탐색바의 구현이다. 하단 탐색바를 사용하면 사용자가 탭 한 번으로 상위 수준의 뷰를 쉽게 탐색하고 전환할 수 있다. 이러한 사용자 인터페이스는 애플리케이션에 3~5 개의 최상위 뷰가 존재하는 경우 사용하는 것을 추천한다. 레이아웃 구성하기. 하나의 액티비티를 생성하자. 생성한 액티비티의 레이아웃 구성은 아래와 같다. FrameLyout을 선언하고 내부에 BottomNaviagtionView를 생성한다. BottomNaviagtionView 내에 app:menu="@menu/menu" 를 확인할 수 있다. 여..
![[Github] Rest API 정리하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE8wWZ%2FbtrKejPzxFL%2FzHXM3gkKQ5ampVnky1AZ0K%2Fimg.png)
[Github] Rest API 정리하기
하나씩 천천히 정리하기. Branches (브랜치) Upstream repository의 브랜치와 동기화 시키기 분기된 리포지토리의 분기를 동기화하여 업스트림 리포지토리와 최신 상태를 유지합니다. 업스트림 리포지토리와 최신상태를 유지하는 방법은 UI를 사용하거나 RestAPI를 사용하는 방법이 가장 편리합니다. TOKEN : Personal Access Token OWNER : 사용자 id REPO : Repository 이름 1) curl을 이용한 방법 curl \ -X POST \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer " \ https://api.github.com/repos/OWNER/REPO/merge-upstr..
![[Carbon] Value categories and value phases](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBp0AU%2FbtrKaxsWrAk%2FC5t0gkbsmw0WZ5qyqyNLmK%2Fimg.png)
[Carbon] Value categories and value phases
모든 값에는 값 범주가 있다. 이 범주는 C++과 유사하며 흔히 알고 있듯 l-value(좌측값) 또는 r-value(우측값) 라고 부른다. (여기서 l-value, r-value가 무엇인지는 자세히 설명하지 않는다.) Carbon은 자동으로 l-value을 r-value으로 변환하지만 다른 방향으로는 변환하지 않습니다. 즉 r-value를 l-value로는 변환하지 않는다는 의미이다. l-value에는 메모리 저장을 위한 공간과 해당 공간의 주소가 존재하며 유형이 const(상수형)이 아니라면 l-value의 값은 수정될 수 있다. r-value는 r-value만을 위한 전용 저장 공간이 없을 수 있다. 즉, 수정이 불가능하며 일반적으로 해당 데이터의 주소를 가져올 수 없다. r-value는 value..