Android 122

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

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

Android/TDD 2023.11.27

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

Kotlin 부호 없는 정수타입 (Unsigned Integers)

경우에 따라 도메인 모델에서 양수만 나타내야 할 수도 있으니, Kotlin 1.3부터 ​​Kotlin은 이 요구 사항을 수용하기 위해 부호 없는 정수를 지원합니다. 타입 UByte: 8비트 부호 없는 정수 (0부터 255까지의 값 표현) UShort: 16비트 부호 없는 정수 (0부터 65535까지의 값 표현) UInt: 32비트 부호 없는 정수 (0부터 4294967295까지의 값 표현) ULong: 64비트 부호 없는 정수 (0부터 18446744073709551615까지의 값 표현) 사용 - u/U 접미사를 제공 val explicitULong = 4204uL - u/U 만 사용 시 정수 타입추론됨 val uByte: UByte = 4204u val uShort: UShort = 4204u val ..

Android/Kotlin 2023.08.12

안드로이드 프로젝트의 xml에서 다크모드 여부에 따라 다른 이미지를 보여줄 수 있나요?

안드로이드 프로젝트의 xml에서 다크모드 여부에 따라 다른 이미지를 보여줄 수 있나요? 네, 안드로이드에서는 다크모드 여부에 따라 다른 이미지를 보여줄 수 있습니다. 이를 위해서는 android:src 대신 app:srcCompat을 사용하고, android:src에서 사용하는 이미지 리소스 대신 drawable-night 폴더에 다크모드 이미지 리소스를 추가해야 합니다. 아래는 예시 코드입니다. xmlCopy code 위 코드에서는 android:src 대신 app:srcCompat 속성을 사용하여 이미지를 설정하고 있습니다. 이는 appcompat-v7 라이브러리에서 제공하는 벡터 이미지 지원을 사용하기 위해 사용하는 것입니다. 또한, drawable-night 폴더에 다크모드 이미지 리소스를 추가할..

Android 2023.03.26

안드로이드 프로젝트의 클린 아키텍처의 프로젝트 모듈 구성

안드로이드 프로젝트에서 클린 아키텍처를 적용할 때는 일반적으로 다음과 같은 모듈 구성을 채택합니다. Domain 모듈: 앱의 핵심 비즈니스 로직이 담긴 모듈로, 가장 순수한 형태의 코드를 포함합니다. 도메인 모듈은 안드로이드 프레임워크나 라이브러리에 의존하지 않으며, 단순히 앱의 비즈니스 규칙과 도메인 객체만을 포함합니다. Data 모듈: 앱의 데이터 소스를 추상화하는 모듈입니다. 이 모듈은 로컬 데이터 소스(예: SQLite), 원격 데이터 소스(예: REST API) 등 데이터를 처리하는 방식에 따라 여러 하위 모듈로 구성될 수 있습니다. 데이터 모듈은 도메인 모듈과 안드로이드 프레임워크 사이를 이어주는 매개체 역할을 하며, 데이터 소스에서 받아온 데이터를 도메인 객체로 변환하여 반환합니다. Pres..

Android 2023.03.25

[Navigation] Navigation (개념 및 구성요소 : graph, navhost, controller, destination, action, safe args)

이건 또 왜 번역 '탐색'일까 차라리 '네비' 그 자동차 '네비' 개념이 더 와닿겠어...ㅠㅠ 제발 destination을 '대상'이라고 표시하지마요 님아 Actions 을 '작업'이라고 표시하지마요 읽는 내내 너무 헷갈려...ㅠㅠ navigate 1.동사 (지도 등을 보며) 길을 찾다[방향을 읽다] => 화면을 찾는다 => 화면 이동한다 2.동사 (바다·강 등을) 항해하다 3.동사 (힘들거나 복잡한 상황을) 다루다[처리하다] Navigation이란? - "여러 Fragment 들을 포함한 하나의 Activity가 있는 앱"을 위해 설계됨 ㄴ> Fragment ( 각 Activity별로 자체 NavigationGraph가 있다. Safe Args 란? - 화면 navigate를 위해 Safe Args G..

Android/Jetpack 2023.02.26

안드로이드 Build config 3/3 (signingConfigs)

이전 포스팅이 존재합니다. 1편 : https://nemomemo.tistory.com/187 2편 : https://nemomemo.tistory.com/188 이 블로거의 혼란을 야기하므로 용어는 영어로 사용하고자 합니다. 더보기 빌드 변형 = build variant 빌드 유형 = build types 제품 버전 = product flavors 버전 차원 = flavor dimension 소스 세트 = source sets 서명 구성 = signing configuration = signing settings 키 저장소 = keystore private key = 비공개 키 종속 = dependencies 서명 = signing API 수준 = API level signing configuratio..

안드로이드 Build config 2/3 (source sets)

이전 포스팅이 존재합니다. https://nemomemo.tistory.com/187 이 블로거의 혼란을 야기하므로 용어는 영어로 사용하고자 합니다. 더보기 빌드 변형 = build variant 빌드 유형 = build types 제품 버전 = product flavors 버전 차원 = flavor dimension 소스 세트 = source sets 종속 = dependencies 서명 = signing API 수준 = API level Source sets - (정말 의미 그래로) 소스(resource, source code, ...)들의 셋트를 일컫는다. build variants별 '별도 source sets' 설정하기 1. 공통 source sets : Android 스튜디오는 기본적으로 ma..

build.gradle에 간편하게 versionName과 versionCode 명시하기

build.gradle에 변수를 선언하고 수식을 사용해 versionName과 versionCode 명시하기 - 별 건 아니지만 stackoverflow에 아래와 같이 "변수를 선언하고 수식을 사용해 versionName과 versionCode를 선언하는 방식"이 있길래 (앱 단) build.gradle defaultConfig { ... def majorVersion = 2 def minorVersion = 1 def patchVersion = 1 versionCode majorVersion * 10000 + minorVersion * 100 + patchVersion versionName "${majorVersion}.${minorVersion}.${patchVersion}" ... } ▽ - 금번 ..

안드로이드 Build config 1/3 (build type, product flavor, flavor dimension)

이 녀석들은 내가 android developer 사이트 가이드 문서 중 가장 좋아하지 않는 부분이다. 번역된 용어가 너무나 헷갈기 때문에..ㅜㅜ 따라서 이 블로거의 혼란을 야기하므로 용어는 영어로 사용하고자 합니다. 더보기 빌드 변형 = build variant 빌드 유형 = build types 제품 버전 = product flavors 버전 차원 = flavor dimension 소스 세트 = source sets 종속 = dependencies 서명 = signing API 수준 = API level 이걸 왜 써? - "하나의 프로젝트에서 다양한 버전의 앱을 만드는 방법"과 "dependencies 항목 및 signing 구성을 올바르게 관리"할 수 있으니까요. 1. "하나의 프로젝트에서 다양한 ..

[res/font] 안드로이드 폰트 리소스 1/2 (개념잡기)

개발 시 앱에 노출되는 모든 글자들의 폰트를 설정해야한다. 안드로이드 앱 폰트 설정은 (디자이너가 설정한) font 파일을 추가하고, 이 font들을 번들로 묶어 리소스로 읽어와 적용한다. [ 안드로이드 font 리소스 ] - 조건 : Android 8.0(API 수준 26)이상 ( ex) font 폴더에 아래와 같은 font 파일들을 추가하면, 이 폰트들은 R.font.dancing_script, R.font.lobster, R.font.typo_graphica 과 같이 참조된다. [ font-family (글꼴 모음) 만들기 ] font-family 란? : 스타일 및 두께 세부정보가 포함된 글꼴 파일 집합체 왜 필요해?? 폰트들을 보면 같은 폰트 스타일이여도 '나눔고딕_normal', '나눔고딕_b..

빌드 종속성 추가 : 수많은 라이브러리 파일들이 내 플젝 안에 없는 이유

우리는 Android Studio의 Gradle 빌드 시스템을 사용하여 빌드에 "외부 바이너리 또는 기타 라이브러리 모듈을 dependencies(종속성)으로 쉽게 포함"할 수 있다. 이 때문에 우리는 수많은 라이브러리들을 내 프로젝트에 추가하지 않아도 된다. dependencies는 컴퓨터 또는 원격 리포지토리에 있을 수 있으며 이에 대해 알아보고자 한다. Gradle이 가져오는 dependencies 구조 Artifact (아티팩트) ? 더보기 도구나 예술 작품, 특히 고고학적 관심 대상과 같이 인간이 만들거나 모양을 부여한 항목에 대한 일반적인 용어 - 소프트웨어쪽에서는 "프로그래밍하는 동안 또는 실행 시 생성되거나 생성된 모든 것"을 일컫는다. (매우 광범위한 용어) = '디자인 및 기능을 설명하..

안드로이드 KTS 개념 및 적용 : Build gradle을 Groovy언어가 아닌 Kotlin으로 짜보자

Gradle 구성 파일(build.gradle 등)에서 사용하던 Groovy언어 대신 Kotlin을 사용가능하다고 한다. 물론 우리가 그냥 사용하는 Kotlin이 아닌 Kotlin script인 'KTS'라는 형태로! 심지어 안드로이드, Gradle 공식사이트들도 앞으로 이게 더 우세할 거라 선언까지 해놨다. ▽ 하지만 나름 단점도 있으니 잘 알고 적용해야한다. 우선, DSL이 뭔지 알아야 한다. Groovy도 DSL이고, KTS도 DSL이다. DSL (Domain Specific Language)이란? - '특정 분야에 최적화된 프로그래밍 언어'를 일컫는다. Ex) SQL, CSS, 정규표현식, make 등 더보기 = '특정 영역(도메인)에 초점을 맞추고 기능을 제한함으로써 간결&효율적으로 목표를 달성..

Databinding - ObservableField, BaseObservable

ObservableField (@Android/Databinding) : 객체를 observable(=관찰 가능)하게 만드는 wrapper 클래스. - Android의 Databinding의 소속으로 DataBinding을 활성화해야 사용 가능 java.lang.Object ↳ android.databinding.BaseObservable ↳ android.databinding.ObservableField - 사용 : ViewModel에서 로직이 변경 시 UI(의 작은 부분)가 자동 업데이트되도록 하기 위해 사용 - 사용법) ㄴ> 생성 : 아래와 같은 방법으로 생성가능 1) Observable Primitive타입클래스 ex) Observable(), ObservableInt() 2) Observable..

'화면 캡처 막기'와 getWindow().addFlagssetFlags(int flags, int mask)

'화면 캡처 막기' 설정 // (나같은 경우)acitivity onCreate()에서 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); // 또는 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); 위에서 사용하는 'getWindow().addFlagssetFlags(int flags, int mask)' - @param flags : 화면에 설정할 flag 값 - @param mask : (수정할 창 플래그 비트 라는데) 아래와 같은 역할을 하는듯 하다. 기본적으로 다른 값에 대한 비트 단위 필터입니다. 예를 들어..