분류 전체보기 226

Composables Lifecycle (컴포저블 수명 주기)

용어정리Composable - UI 구성 요소를 나타내는 함수 또는 어노테이션Composable 어노테이션 (@Composable) - Composable 함수를 표시하는 어노테이션 Composable 함수- Compose에서 UI 구성을 정의하고, UI 요소의 계층 구조를 형성하며, 화면에 표시되는 뷰를 생성하는 함수 - UI를 선언적으로 정의하는 Compose에서 사용되는 기본 단위- UI 요소를 생성하고, UI 상태를 나타내며, 사용자 입력 및 상호 작용에 응답하는 등의 작업을 수행한다.Composition- UI 구성 요소들이 결합되어 화면에 표시되는 것- Compose에서는 여러 'Composable 함수'가 조합되어 화면에 나타나는 UI 구조를 형성합니다. Composition은 'Compos..

Android/Compose 2024.05.06

Compose 기초 (Compose이해, Composable function, Recomposition)

이전편에 이어 다시보는Compose 란?Jetpack Compose는 Android를 위한 현대적인 선언형 UI 도구 키트사용자 인터페이스의 상태와 레이아웃을 설명하는 구조화된 데이터나 코드를 사용하여 UI를 정의 [동작] 처음부터 화면 전체를 개념적으로 생성한 후 -> 특정 시점에선 필요한 변경사항(UI의 어떤 부분을 다시 그려야 하는지)만 지능적으로 선택하여 화면을 재구성(=Recomposition)한다.[동작 구현] 구성 가능한 함수(=Composable 함수)를 '단순히 호출'하는 형태로 UI 렌더링 및 재구성  ex) `@Composable TextView()`를 호출  Composable function (= 구성 가능한 함수)  개인적으로 '구성 가능한 함수'라는 번역은 매번 부르기 어려워 ..

Android/Compose 2024.05.05

Compose 선행 개념 (#Compose란, #선언형UI, #명령형 UI)

Compose 란?Jetpack Compose는 Android를 위한 현대적인 선언형 UI 도구 키트Compose는 프런트엔드 뷰를 명령형으로 변형하지 않고도 앱 UI를 렌더링할 수 있게 하는 선언형 API를 제공하여 앱 UI를 더 쉽게 작성하고 유지관리할 수 있도록 지원한다.   자꾸 '선언형'이 언급되는데 이에 대해 알아보자!!👇 선언형 전에는 명령형 UI를 사용했었다,, 기존  '명령형? 프로그래밍 패러다임' (= Imperative programming paradigm)뷰 계층 구조는 UI 위젯의 트리 형태사용자 상호작용 등의 이유로 인해 앱의 상태가 변경되면, 현재 데이터를 표시하기 위해 UI 계층 구조를 업데이트해야 하는데 보통 아래처럼 뷰를 찾아 접근하여 위젯 내부 상태를 업데이트 시킨다 ..

Android/Compose 2024.05.05

[Kotlin Coroutine][init] 5. kotlin.coroutines vs kotlinx.coroutines

코루틴은 하나의 라이브러리에 있을 것 같지만 아니다! 1) 코틀린은 언어 차원에서 표준 라이브러리에 최소한의 저수준 API만 제공하고, 2) 다양한 다른 라이브러리에서 코루틴을 활용할 수 있도록 되었다. 1) 코틀린은 언어 차원에서 표준 라이브러리인 kotlinx.coroutines - 자유도를 보장하기 위해 필수 언어 차원에서의 최소한만 지원함 ㄴ> 여기에는 suspendCoroutine, Continuation 등 ㄴ> 라이브러리 개발자에게 적합 2) 다양한 다른 라이브러리 - 별도의 의존성을 추가해야 한다. - 애플리케이션 개발자들에게 적합 - 이 중 JetBrains에서 개발한 kotlinx.coroutines에는 코루틴을 위한 많은 라이브러리가 대표적이다. ㄴ> 여기에는 launch, async..

Android/Coroutine 2024.02.22

[Kotlin Coroutines][init] 3. 코루틴 중단(suspend)하고 재개(resume)하기

코틀린 코루틴은 '비동기적인 작업을 수행할 때 사용되는 경량 스레드'입니다. 코루틴은 실행 중인 함수의 실행을 일시 중단하고 나중에 재개할 수 있는 기능을 제공하여 비동기적인 작업을 보다 효율적으로 관리할 수 있습니다. 이러한 일시 중단과 재개는 코루틴의 핵심 개념 중 하나인 "중단 함수"를 통해 이루어집니다. 중단 함수(suspend function) 코루틴을 중단 할 수 있는 함수 (= 코루틴에서 함수의 실행을 일시 중단하고 나중에 재개할 수 있는 기능을 제공하는 함수) 코루틴을 중단할 수 있으므로 중단 함수는 반드시 코루틴(또는 다른 중단함수)에 의해 호출되어야 한다. 중요하다 (코틀린 코루틴의 핵심적인 개념) [비유] 비디오 게임을 하다가 멈추는 상황이랑 비슷하다. 체크 포인트에서 게임을 저장하고..

Android/Coroutine 2024.02.18

[Kotlin Coroutines][init] 2. 시퀀스 빌더

다른 언어에서는 코루틴을 어떻게 사용할까?? 🤔 파이썬이나 자바스크립트를 보면 아래 2가지 같은 제한된 형태의 코루틴이 있다고 한다. 비동기 함수 (async/await와 같은 호출 방식) 제너레이터(값을 순차적으로 반환) 코틀린에서는 제너레이터 대신 시퀀스를 생성할 수 있는 시퀀스 빌더라는 것을 대신 제공한다. (Flow 빌더도 있으나 내용이 많아 추후 포스팅 예정) 시퀀스 빌더 - 시퀀스는 List, Set 같은 컬렉션과 비슷한 개념이지만 필요할 때마다 값을 하나씩 계산하는 지연 처리를 한다. - [시퀀스의 특징] 요구되는 연산을 최소한으로 수행 무한정이 될 수 있음 메모리 사용이 효율적 (이펙티브 코틀린에 Item49 '하나 이상의 처리 단계를 가진 경우 시퀀스를 사용라라'고 있으니 참고) - [시..

Android/Coroutine 2024.02.18

[Coroutine] async{}/await() 사용 시 주의사항

아래 두 코드는 다른 방식으로 동작합니다. 1) async { api호출함수() }을 여러 개 사용 후, await() 여러 개를 호출하는 코드 vs 2) async { api호출함수() }.await() 여러 개를 바로 호출하는 코드 1) async { api호출함수() }을 여러 개 사용 이후, await() 여러 개를 호출하는 코드 - getUserApi()와 getPeedApi()를 병렬로 호출하고, 각각의 작업이 완료될 때까지 대기합니다. 따라서 getUserApi()와 getPeedApi() 함수 호출은 동시에 이루어질 수 있으며, 두 작업이 완료되는 순서에 따라 데이터를 받습니다. suspend fun fetchData() { coroutineScope { val userDeferred = ..

Android/Coroutine 2024.02.18

[Kotlin Coroutine][init] 1.코틀린 코루틴? 왜 꼭 코루틴을 사용해야하나요?

* 작성 내용 : 코틀린 코루틴이란 무엇인지? 어떻게 작동하는지?? Kotlin + Coroutines 을 같이 사용하는 장점 멀티플랫폼 작동 가능 (JVM, JS, iOS 등의 모듈들에서 가능) ㄴ> 이건 코틀린 멀티플랫폼(kotlin multiplatform)의 영향이 큼 : kotlinlangSite, ,jetbrains androidDeveloper ㄴ> 더보기 안드로이드에서 코루틴을 왜 사용해야하는지? - 안드로이드에서는 메인스레드 단 하나만 뷰를 다룰 수 있음 -> 이 쓰레드가 블로킹되면 앱이 ANR 발생하며 죽음 "안드로이드에서는 하나의 앱에서 뷰를 다루는 스레드가 '단 하나'만 존재하기 때문에 Main 스레드를 블로킹되서는 안된다." - 하지만, 뷰를 다루는 작업은 엄청 많음 -> 따라서,..

Android/Coroutine 2024.02.17

[UnitTest][ch6(2/3편)] 단위테스트, 함수형 프로그래밍, 그리고 함수형 아키텍처 (그리고 헥사고날 아키텍처 첨가)

전편 포스팅에서 이어지는 내용입니다. '출력 기반 단위 테스트' 스타일을 '함수형'이라고도 한다. '출력 기반 테스트'를 적용할 수 있는 것은 '순수 함수' 뿐이다. '순수 함수'방식으로 사용한 프로그래밍을 '함수형 프로그래밍'이라고 부른다. 즉, '출력 기반 단위 테스트' 스타일은 코드를 '함수형 프로그래밍'을 이용해 '순수 함수' 방식으로 작성해야 한다. 그러므로 함수형 프로그래밍과 함수형 아키텍처에 대한 개념부터 알아보자! 함수형 프로그래밍(Functional Programming)이란? : 순수 함수(Pure function)를 사용한 프로그래밍 - 목표 : ["비즈니스 로직을 처리하는 코드와 '사이드 이펙트를 일으키는 코드'를 분리하는 것"] 순수함수(Pure function)란? - '수학적 ..

Android/TDD 2023.12.01

[UnitTest][ch6] 단위테스트 스타일(출력기반, 상태기반, 통신기반) 및 사용

단위 테스트 스타일에 대해 동일한 기준틀(3가지 스타일)을 적용하고, -> 이 스타일 중 하나인 '출력 기반 스타일'을 사용해 테스트 작성하는 방법과 -> 이렇게 작성된 '출력 기반 테스트'와 함수형 프로그래밍의 관련성을 배움 +첨가) 함수형 프로그래밍, 함수형 아키텍처 개념  단위테스트의 3가지 스타일 출력 기반 테스트(output-based testing) : "SUT에 입력을 넣고 생성되는 출력 결과만 검증하는 방식." 상태 기반 테스트(state-based testing) : 작업이 "완료된 후" 시스템 "최종 상태"를 검증하는 방식 통신 기반 테스트(communication-based testing) : SUT의 "협력자를 목으로 대체"하고 "SUT가 협력자를 올바르게 호출하..

Android/TDD 2023.11.30

TDD 기초 개념잡기 (테스트 용어, 종류)

테스트에는 다양한 테스트 종류가 있으며, 각각은 특정 목적과 범위에서 따라서 선택 및 수행되고 소프트웨어를 평가합니다. 종합적으로 모든 종류의 테스트를 조합하여 소프트웨어의 품질을 유지하고 개선하는 것이 일반적인 개발 방법입니다. 테스트 기초 용어 테스트 스위트(Test Suite) : 여러 테스트 케이스를 하나로 묶어서 실행하거나 구성하는 도구 여러 테스트를 그룹화하여 함께 실행하거나, 특정 기능 또는 모듈에 대한 모든 테스트를 한 번에 실행하는 데 사용됩니다. 여러 테스트 케이스를 그룹화하고 관리한다. 주로 테스트 프레임워크에서 지원되며, 큰 프로젝트에서 여러 모듈 또는 기능에 걸친 테스트를 효과적으로 관리할 수 있도록 도와줍니다. 테스트 케이스(Test Case) : 특정 입력 상태에서 특정 기능 ..

Android/TDD 2023.11.27

변수명, 함수명, 클래스명 잘 짓는 방법 (Clean code: 2ch Naming)

이름을 잘 짓는 규칙들 의도를 분명히 밝힌다. - 변수나 함수 드리고 클래스명은 변수(나 함수 드리고 클래스)의 존재 이유는? 수행 기능은? 사용 방법은? 이란 질문들에 답할 수 있어야 한다. - 주석이 필요하지 않는 수준이어야 함 ㄴ> Bad example) int d; // 경과 시간 ㄴㄴ> Good example) int elapsedTimeInDays; 그릇된 정보를 피하라 (= 이름에 그릇된 단서를 남기면 안된다.) - 유사한 개념은 유사한 표기법을 사용한다. - 기발한 이름, 특정 유머나 문화권의 농담은 피하고 명료하게 표현하라. - 이름에 다른 타입이 포함된 경우  ㄴ> Bad example) List가 아닌 userList  ㄴ> Bad example) 유닉스 플랫폼이나 변종이름인 hp..

Study Programming 2023.11.20

Android 테스트 구조/구성 개념잡기

테스트 필요성 사용자는 버튼을 누르는 것부터 기기에 정보를 다운로드하는 것에 이르기까지 다양한 수준에서 앱과 상호작용합니다. 따라서 반복적으로 앱을 개발할 때 다양한 사용 사례와 상호작용을 테스트해야 합니다. 테스트용 코드 구성 앱이 확장됨에 따라 서버에서 데이터를 가져오거나, => MockWebServer?? 기기 센서와 상호작용하거나, 로컬 저장소에 액세스하거나, => ??? 복잡한 사용자 인터페이스를 렌더링해야 할 수 있습니다. => ??? 앱 다양성을 고려하여 종합적인 테스트 전략을 수립해야 합니다. 반복적으로 코드 만들기 및 테스트 반복적으로 기능을 개발하는 경우 새 테스트를 작성하거나 기존 단위 테스트에 사례와 어설션을 추가하여 시작합니다. 새 기능을 디자인할 때 나타나는 책임 단위를 고려하여..

Android/TDD 2023.08.15

[어노테이션]@JvmInline

@JvmInline - Kotlin에서 사용되는 애노테이션 중 하나 - 인라인 클래스(inline class)를 정의할 때 사용됩니다. "인라인 클래스" ㄴ> 런타임 오버헤드 없이 새로운 데이터 타입을 만들어주는 Kotlin의 특징 중 하나입니다. 이 클래스는 런타임에서 실제 객체가 생성되지 않고 해당 타입의 값만 컨테이닝하는 역할을 수행합니다. - 주의1: 인라인 클래스의 생성자는 파라미터 하나만 받아야 합니다. - 주의2: 인라인 클래스는 상속을 지원하지 않습니다. @JvmInline 애노테이션은 이러한 인라인 클래스를 JVM에서 좀 더 효율적으로 다룰 수 있도록 도와주는 역할을 합니다. ㄴ> @JvmInline을 사용하면 인라인 클래스의 필드에 대한 접근이 메소드 호출로 변환되지 않고, 직접 필드에..

Android/Kotlin 2023.08.14

(찌이인한) 에스프레소 테스트 기초 개념

Hello, Espresso : Android UI 테스트를 작성을 지원해주는 라이브러리 기본사용 - 테스트 작성자에게 사용자가 애플리케이션과 상호작용(UI 요소를 찾고 상호작용)하는 동안 실행하는 작업의 관점에서 생각하도록 권장합니다. - 동시에 프레임워크가 애플리케이션의 활동 및 뷰에 직접 액세스하지 못하도록 방지합니다. 이러한 객체를 계속 보유하고 UI 스레드에서 벗어나 이러한 객체에 관해 작업하는 것이 테스트 취약성의 주요 원인이기 때문입니다. 따라서 getView() 및 getCurrentActivity()와 같은 메서드는 Espresso API에 표시되지 않습니다. ViewAction 및 ViewAssertion의 자체 서브클래스를 구현하여 뷰 관련 작업을 안전하게 실행할 수 있습니다. Esp..

반복문 또는 루프 (for, while, do-while)

- 같은 동작을 여러 번 반복하는 명령을 반복문 또는 루프(loop)라고 한다. for문 - 반복문 중 정해진 횟수만큼 반복하거나 어떤 범위 내 정수를 차례로 처리해야하는 경우 사용 - for 루프와 범위를 써서 처리 범위 - 범위 표현 : 포함최솟값..포함최댓값, 포함최솟값 until 미포함최댓값 - 범위를 만들면 for(변수 in 범위) 를 써서 표현합니다. while, do-while문 - 반복문 중 범위와 같이 어떤 값을 미리 정해진 규칙대로 원하는 만큼만 반복해야하는 경우 사용 - 루프를 끝내는 조건 사용에 주의 (끝나지 않으면 무한루프를 도는 리스크가 있다. while문 - 루프 시작 시 조건을 검사 do-while문 - 루프 끝낼 때 조건을 검사 - 최소 한 번은 루프 실행됨

Android/Kotlin 2023.08.12

if(if-expression, if-statement), when(when-expression, when-statement)

코틀린 if문 종류 - if-expression (if식) : 리턴값을 사용, 반드시 else가 있어야함! - if-statement (if문) : 리턴값을 쓰지 않고 실행할 문장 선택용 코틀린 when문 - 여러 조건에 대한 분기 처리 종류 - (when-expression, when-statement)은 if문과 종류 동일 // when-expression print( when(d) { 1 -> "one" 2 -> "two" else -> "greater than two" } ) // when-statement when(d) { 1 -> print("one") 2 -> print("two") else -> print("greater than two") } 표현 - 어떤 값을 기준으로 분기 처리 whe..

Android/Kotlin 2023.08.12