목록전체 글 (85)
성장기록지

개요검색화면 activity를 분리하며 코드를 작성하다 activity가 화면에 그려지지 않고. 로그를 찍어봐도 아무것도 찍히지 않는 현상을 맞이했다.이유를 찾아보니 override fun onCreate(savedInstanceState: Bundle?)위의 코드를 사용하지 않고override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?)아래의 코드로 작성해서 벌어진 일이였다.그렇다면 왜 화면에 그려지지 않는지, PersistableBundle이 뭔지 알아보고자 한다. PersistableBundle이란?공식문서에서는 다음과 같이 설명한다.문자열 키에서 다양한 유형의 값으로의 매핑.이 클래스에서 지원하는 유..

android:exported란? 공식문서에는 다음과 같이 적혀져 있다.다른 애플리케이션에서 안드로이드 컴포넌트(액티비티, 서비스, 브로드캐스트 리시버)를 실행할 수 있는지에 대한 설정을 하는 역할을 한다. true인 경우, 모든 앱이 활동에 액세스 할 수 있으며, 정확한 클래스 이름으로 시작할 수 있다.false인 경우, 동일한 애플리케이션, 동일한 사용자 ID를 가진 애플리케이션, 권한이 있는 시스템 구성요소에 의해서만 접근이 가능하다. true로 하였을때의 위험성exported가 true로 되어있는건 취약한 activity로 외부에서 공격이 가능하다는 것이다.실제로 예시로 액티비티를 실행시키는 과정을 블로그에서 보여준다. 따라서 android:exported = true 로 하게 될 경우는 아래..

이전 글에서 Room 아키텍처에 따라 Entity, Dao, Database를 구성하는 과정을 서술하였다.이번 글에선 어떻게 기능들을 구현하였는지 과정을 작성하도록 하겠다.저번 글은 아래 링크에서 참고 가능하다.https://codinghun.tistory.com/76 Room을 활용한 쇼핑 상품 북마크 기능(Room 구조 구현)쇼핑앱을 구현하며 Room을 통해 로컬 데이터베이스에 상품을 저장하는 기능을 구현하고자 하였다.이전에 공부한 Room의 구조들을 활용하며, MVVM 구조를 깨지 않도록 구현한 과정을 작성하고자 한codinghun.tistory.com 북마크 된 상품 리사이클러뷰에 표시하기 viewmodel에 StateFlow>으로 bookmarkedItems를 구성해둔다.private val _..
쇼핑앱을 구현하며 Room을 통해 로컬 데이터베이스에 상품을 저장하는 기능을 구현하고자 하였다.이전에 공부한 Room의 구조들을 활용하며, MVVM 구조를 깨지 않도록 구현한 과정을 작성하고자 한다. 이전에 내가 학습한 글을 통해 프로젝트 내에 Room의 아키텍쳐대로 구성하고자 하였다.https://codinghun.tistory.com/23 Entity 구성 Entity는 아래와 같이 구성하였다.api호출 결과로 ItemsResponse를 가져오고, 거기서 각 검색 상품마다의 정보를 Item으로 가져왔다.앱 내에서 ShoppingItem만을 사용하므로 Item의 확장함수를 통해 아래 코드와 같이 toShoppingItem으로 Entity로 전환해주도록 하였다.PrimaryKey인 id는 상품의 고유값인..

Room TypeConverter란?안드로이드 로컬 데이터베이스인 Room 같은 경우 컬럼에 List나 Data class를 사용하려 하면 에러가 발생하게 된다.기본적으로 Room은 원시타입(int, short, long ....)과 wrapping 타입만 지원함.이때 Type Converter를 적용하면 에러를 발생시키지 않고 정보를 담을 수 있다. 객체 참조를 허용하지 않는 이유 서버에서는 데이터베이스의 관계를 객체 모델로 매핑하고 지연 로딩(lazy loading)을 사용해도 괜찮다.하지만 안드로이드 앱의 UI 스레드에서는 이런 방식이 문제가 된다.(지연 로딩이란? -> 필요한 순간까지 데이터 로딩을 미루는 방식으로 데이터베이스에서 데이터를 불러올 때 사용하는 전략)UI 스레드는 화면을 그리는데 약..

문제풀이이 코드는 파이어볼을 이동시키고, 충돌 시 합쳐지는 로직을 구현한 시뮬레이션 문제다.기본적으로 arr이라는 2차원 리스트를 사용해 각 좌표에 있는 파이어볼 정보를 저장한다. 초기에는 파이어볼의 위치와 정보를 입력받아 fireballs 리스트에 저장하고, 이후 K번의 이동을 수행한다.파이어볼 이동각 파이어볼을 현재 위치에서 방향과 속력에 따라 이동시킨다. 격자를 벗어나지 않도록 N으로 나눈 나머지를 이용해 위치를 조정한다.이동한 파이어볼을 다시 저장이동이 끝난 후, 새로운 위치에 파이어볼 정보를 저장한다.파이어볼 합치기같은 위치에 여러 개의 파이어볼이 모이면,질량과 속력을 합산하여 새로운 파이어볼을 만든다.원래 방향이 모두 홀수이거나 모두 짝수이면 [0, 2, 4, 6] 방향으로 나누고, 그렇지 않..

debounce란?debounce는 이벤트를 그룹화하고 일정 시간동안 이벤트가 발생하지 않으면 가장 마지막 이벤트를 전달한다.'penguin' 이란 단어를 검색한다고 해보자.p -> pe -> pen -> peng -> pengu -> penguin 과 같이 한글자씩 작성하게 될 것이다.별 다른 조치를 하지 않는다면 글자를 쓸때마다 이벤트가 전달되겠지만,Debounce로 일정 시간을 지정해주면 그 시간 동안 이벤트가 발생하지 않을 경우 가장 마지막 이벤트를 전달하게 해준다. 예를 들어 debounce를 0.5초로 설정해주고, penguin이라는 단어에서 한글자 작성하는데 0.3초씩 걸린다면,penguin 단어를 완성 후 0.5초 이후에 이벤트가 전달이 된다. 그림으로 본다면 다음과 같다. 1 ~ 5번의..

문제풀이거리를 구하는 그래프 문제이다.다익스트라를 사용해도 되지만, 익숙한 BFS로 풀이해보았다.우선 딕셔너리(map)을 이용해서 노드마다 연결된 값들을 담아준 다음,1번 노드부터 deque를 이용해 BFS 탐색하여 이동시마다 거리를 1씩 늘려서 노드마다의 거리를 n_list에 담아주었다.딕셔너리 안에 list를 추가하는게 번거로웠는데, defaultdict(list)를 이용해서default 값으로 value값으로 빈 list를 제공받아 쉽게 구현하였다. LV3에 정답률 48퍼인데 백준으로 따지면 대충 실버 1정도 되지않나 싶다.코드from collections import dequefrom collections import defaultdictdef solution(n, edge): dict=d..

DiffUtil이란 androidx 패키지에 포함되어 두 리스트 간의 차이를 계산하고, 새로운 리스트로 변경하기 위한 작업목록을 반영하는 것에 도움을 주는 유틸리티 클래스이다. DiffUtil을 쓰지 않았을 때개인 프로젝트에서 RecyclerView.Adapter 의 list를 update할 때 다음과 같이 진행하였다.코드와 같이 아이템을 추가할 때, 전체를 새로고침하는 notifyDataSetChanged()를 사용하거나.아니면 최적화를 위해 범위 내에서만 아이템을 삽입하는 notifyItemRangeInserted()를 사용할 수 있다.class HomeShoppingItemAdapter : RecyclerView.Adapter() { private val items = mutableList..

문제풀이파이썬의 우선순위 큐는 기본적으로 최소 힙이므로, 튜플로 (-num,num)을 입력하여 최대 힙을 따로 구현해주었다.그런 후 최소값을 삭제할 때는 최소 힙에서 최소값을 반환하여, 최대 힙에서 삭제해 주고,최대값을 삭제할 때는 최대 힙에서 최댓값을 반환하여 최소 힙에서 삭제해 주었다.정답은 맞았지만 계산해보니 최대 경우의 수가 50만개를 삽입하고 50만개를 삭제할때 50만개의 등차수열만큼 시간이 걸린다고 생각이 되었다. 아마 프로그래머스에 테스트케이스가 널널하게 계산되어있는거 같다. 추가로 최적화 작업을 해봐야겠다. 코드import heapqdef solution(operations): max_heap=[] min_heap=[] count= 0 for i in operation..