본문 바로가기

분류 전체보기

(100)
[안드로이드] Api Key 저장 방법 with local.properties 프로젝트를 하다 보면 Api를 사용하게 되는데 Api에는 Key가 필요하다. 그러나 이 Key를 그냥 복붙 후 Git에 올려버리면 누군가 해당 Key를 사용할 수 있고, 최악의 경우 막대한 금전적 손실을 입을 수 있다. Key 같이 중요한 데이터는 숨겨야하는데 Git에는 gitignore가 있고, 여기에는 local.properties가 자동으로 설정되어 있다. 따라서, local.properties 에 Key를 저장해 두고 프로젝트에서 갖다 쓰면 된다. 사용 방법 local.properties ## This file is automatically generated by Android Studio. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! #..
[안드로이드] Jetpack 공식문서 https://developer.android.com/jetpack?hl=ko Android Jetpack 개발자 리소스 - Android 개발자 | Android Developers Android Jetpack은 코드 라이브러리 모음을 통해 최신 앱 개발자 리소스와 권장사항을 제공합니다. 지금 Jetpack을 사용하여 시작해 보세요. developer.android.com Jetpack 이란? Jetpack은 개발자가 중요한 코드에 집중할 수 있도록 권장사항 준수, 상용구 코드 감소, 여러 Android 버전과 기기에서 일관되게 작동하는 코드 작성을 돕는 라이브러리 묶음이다. 또한 다양한 안드로이드 버전과 호환되도록 제작되었기 때문에 여러 버전에서 실행할 수 있다. 그렇다면 Jetpack에는 ..
[안드로이드] ViewModel 1. AAC ViewModel 이란?UI 상태를 저장하고 관리할 수 있는 클래스이점: 상태를 저장하고 Configuration change가 발생해도 유지할 수 있다. Configuration Change 종류화면 회전언어, 글꼴 변경라이트 & 다크 모드 등2. Configuration Change가 발생하면 UI 상태가 사라지는 이유안드로이드에서 Configuration Change가 발생하면 생명주기만 반복되는 것이 아닌 Activity 클래스 자체를 파괴하고 다시 생성한다.위의 사진이 화면을 회전했을 때의 Activity와 ViewModel의 생명 주기를 나타낸 Log인데 보면 알 수 있듯이 onResume 상태에서 화면 회전이 일어날 경우 onDestroy 이후 다시 Activity를 새로 만들어..
[안드로이드] LiveData 안드로이드 공식문서https://developer.android.com/topic/libraries/architecture/livedata?hl=ko LiveData 개요  |  Android 개발자  |  Android DevelopersLiveData를 사용하여 수명 주기를 인식하는 방식으로 데이터를 처리합니다.developer.android.com LiveDataLiveData는 관찰 가능한 데이터 홀더 클래스이다. 수명 주기를 인식하며, 활동 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트 한다. 관찰자의 수명 주기는 Observer 클래스로 표현되며, 생명 주기가 Started 또는 Resume 상태일 때 활성 상태로 간주한다. 활성 상태일 경우에만 업데이트 정보를 알린다.// ViewMo..
[안드로이드] Databinding 안드로이드 공식문서 https://developer.android.com/topic/libraries/data-binding?hl=ko 데이터 결합 라이브러리 | Android 개발자 | Android Developers 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 데이터 결합 라이브러리 Android Jetpack의 구성요소. 데이터 결합 라이브러리는 프로그래매틱 방식이 아니라 선 developer.android.com Databindnig은 동적인 UI 변화를 XML에서 처리하는 Jetpack 라이브러리다. 예를 들어, 어떠한 이벤트가 발생했을 때 A라는 Text가 B로 변한다고 할 때 우리는 Activity 또는 Fragment에서 다음과 같이 처리한다. butto..
[안드로이드] Room DB 안드로이드 공식문서 https://developer.android.com/training/data-storage/room?hl=ko Room을 사용하여 로컬 데이터베이스에 데이터 저장 | Android 개발자 | Android Developers Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기 developer.android.com Room DB Room DB는 Jetpack의 라이브러리 중 하나이며, 로컬 데이터베이스이다. 일반적으로 플랫폼에서는 DB를 서버에 저장하며, 앱에서는 서버에 요청을 하여 데이터를 조회 또는 수정한다. 따라서 네트워크가 필수이며, 네트워크가 없다면 DB에 접근할 수 없다. 반면에 로컬 DB는 앱에 저장되므로 네트워크가 따로 필요하지 않기 때문에 사용자가..
[안드로이드] Content Provider Content Provider는 애플리케이션의 데이터를 액세스하고, 다른 애플리케이션과 공유하는 기능을 제공한다. Content Provider는 자체적인 보안 시스템이 적용되어 있으며, 사용자 권한을 요구하여 내부적으로 데이터를 보호한다. 만약 요청하는 애플리케이션에 필요한 권한이 없으면 Content Provider의 데이터에 접근할 수 없다. Content Provider의 대표적인 예로는 사진첩 또는 연락처 등을 접근할 때 사용된다. 안드로이드 공식문서 https://developer.android.com/guide/topics/providers/content-provider-basics?hl=ko 콘텐츠 제공자 기본 사항 | Android 개발자 | Android Developers 콘텐츠 제공..
[안드로이드] 푸쉬 알림 (기초) 안드로이드 공식 문서 https://developer.android.com/guide/topics/ui/notifiers/notifications?hl=ko 알림 개요 | Android 개발자 | Android Developers 알림 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 알림은 사용자에게 미리 알림을 주고 다른 사람과의 소통을 가능하게 하며 앱에서 보내는 기타 정 developer.android.com 개인 프로젝트를 진행하던 도중 백그라운드에서 위치를 받아 일정 위치에 도달하면 푸쉬 알림이 오도록 구현하였는데, 이때 사용한 방법을 잊지 않기 위해 기록해둔다. 해당 방법은 간단한 방법이지만, 우리가 흔히 사용하는 앱들은 앱이 종료되어 있는 상태에서 푸쉬 알..
[안드로이드] AlertDialog AlertDialog는 유저에게 선택 또는 어떠한 입력을 요구할 때 사용하는 메시지 창이다. 보통 작은 화면으로 사용되며, 유저가 다음으로 넘어가기 전 무언가 조치를 취해야 할 때 사용되는 Modality Event이다. 사용 방법 AlertDialog.Builder(context) .setTitle("Title") .setMessage("Message") .setPositiveButton("예") { _, _ -> //TODO Positive Action } .setNegativeButton("아니오") { _, _ -> //TODO Negavive Action } .create() .show() Custom Dialog // 초기화 val dialog = Dialog(this) dialog.setCo..
[프로그래머스] 타겟 넘버 with Kotlin 문제 numbers의 배열의 숫자들을 적절히 더하거나 빼서 타겟 넘버를 만들 수 있는 방법을 반환하는 문제 풀이 방법 완전 탐색 DFS로 풀이 numbers = [1,1,1] 이라면 위와 같이 탐색 코드 class Solution { var answer = 0 fun solution(numbers: IntArray, target: Int): Int { //target 에서 numbers의 값들을 빼거나 더해서 최종 0 이면 answer ++ DFS(target, numbers, 0, numbers.size-1) return answer } fun DFS(target: Int, numbers: IntArray, index: Int, check : Int){ for(i in arrayOf(1, -1)){ v..