이번 코드랩에서는 ViewModel 클래스의 데이터와 LiveData를 어떻게 통합하는지 배우게 될 것이다. LiveData는 데이터베이스 변경이 있을 때 알려주는 데이터 객체를 빌드하도록 해주는 AAC 중 하나이다. LiveData 클래스를 사용하기 위해서는 앱의 데이터 변경을 관찰하는 observer를 설정해야 한다. LiveData는 lifecycle을 인식한다. 그래서 active lifecycle 상태에 있는 앱 구성 요소 observer만 업데이트한다. LiveData에 관한 코드랩을 시작하기 앞서 만약 ViewModel의 사용법을 모른다면 먼저 공부해야 한다. https://bonustrack02.tistory.com/entry/Codelab%EC%9C%BC%EB%A1%9C-ViewModel..
저번 3단계에서 'End Game' 버튼에 대한 리스너를 구현했는데, 이렇게 사용자가 게임을 종료하면 ScoreFragment에서는 점수를 보여주지 않는다. 우리는 ViewModel이 ScoreFragment에서 보여질 점수를 갖고 있기를 바란다. 그래서 우리는 ViewModel의 초기화동안 factory 패턴을 사용해 점수 값을 넘겨줄 것이다. factory 패턴이 익숙하지 않을 수 있다. 지금 나에게 떠오르는 예시는 BitmapFactory 정도인데, factory 패턴은 이름 그대로 직관적인 패턴이다. 공장에서 제품을 틀로 찍어내듯 생산하는데 factory 패턴도 같은 클래스의 인스턴스를 찍어내듯 생산하게끔 만든 패턴이다. 이 때, 인스턴스를 리턴해주기 위해 메소드를 사용한다. 1. score 패키..
이번 과제는 'End Game' 버튼에 클릭 리스너를 구현하는 것이다. 1. GameFragment에서 onEndGame() 메소드를 추가한다. private fun onEndGame() { } 이 메소드는 사용자가 'End Game' 버튼을 탭할 때 호출될 것이다. 2. GameFragment에서 onCreateView() 메소드 안에 'Got It'과 'Skip' 버튼의 리스너를 설정하는 코드를 위치시킨다. 위 두줄의 코드 바로 아래에 'End Game' 버튼을 위한 클릭 리스너를 binding 변수를 사용해 설정한다. binding.endGameButton.setOnClickListener { onEndGame() } 3. GameFragment에서 앱의 점수 화면으로 넘어가기 위해 gameFini..
이전 글에서 ViewModel이 기기의 설정(configuration) 변경에도 살아있는 것을 확인했다. 그리고, 이번에는 화면에 보여줄 데이터를 넣고, 그 데이터를 작업하는 코드를 ViewModel 안에 구현한다. ViewModel은 프래그먼트, 액티비티, 또는 뷰들의 참조를 절대 포함해서는 안된다. 이 친구들은 기기의 configuration이 변경되면 살아남지 못하기 때문이다. 우리가 ViewModel을 추가하기 전에는 화면 회전 등의 기기의 설정 변경이 있으면 프래그먼트는 부셔졌다 다시 만들어졌고, 데이터는 소실되었다. 하지만 ViewModel을 추가하고 프래그먼트의 데이터를 ViewModel로 이동한 뒤에는 프래그먼트에서 보여줄 모든 데이터는 이제 ViewModel 안에 있고, 앱이 기기의 설정..
이번 코드랩에서는 AAC의 ViewModel 클래스를 알아볼 것이다. 1페이지를 천천히 보다보니 ViewModel은 factory 디자인 패턴을 사용하고 있다는 것을 알 수 있다. ViewModel을 instantiate(인스턴스화)하려면 ViewModelFactory를 사용하라고 한다. 다음 페이지부터는 주어지는 샘플 앱이 있고, 여기서 문제를 정의한 후 문제 해결을 위해 어떤 단계를 밟아서 처리할 것인지 안내하고 있다. 1. GameViewModel 클래스(ViewModel을 상속하는) 추가하기 먼저 ViewModel을 사용하기 위해서는 모듈 수준의 build.gradle에서 Gradle dependency를 추가해주어야 한다. //ViewModel implementation 'androidx.lif..
이번 글이 피자 나눠 먹기 문제 시리즈의 마지막이다. 문제 먼저, 사람이 최소 피자 한 조각을 먹는다는 조건을 생각해야 했다. 여기서 slice에 곱한 값이 n보다 크면 무조건 n명의 사람은 피자를 한 조각 이상씩 먹을 수 있다. 그래서 for문을 사용해 1부터 1씩 증가하는 조건을 사용하려 했는데 마지막 숫자를 정하기가 애매했다. 100을 써도 1000을 써도 되지만 최댓값을 너무 크게 잡고 싶지 않았다. 그래서 문제의 제한사항에 있는 각 변수의 조건을 생각해봤다. for문이 가장 많이 실행될 때의 i값이 뭘까? slice가 최솟값, n이 최댓값이라면 i값이 최대일 것이다. 이 때, i는 50이기 때문에 for문을 1부터 50까지만 반복하도록 했다. 그 다음, for문 안에서 if문을 통해 위에 적은 ..
이번 문제는 저번 피자 문제 1번에 이어 같은 시리즈의 문제이다. 저번 문제에서는 피자를 7조각으로 잘라주었는데 이번엔 6조각으로 잘라준다. 그리고 내 개인적인 생각으론 문제 난이도가 어렵다기 보단 조금 헷갈리게 만든 것 같다. 문제 먼저 피자가 남지 않고 모두 같은 수의 피자를 먹어야 한다니 여섯 조각으로 오는 피자가 6의 배수일 수 밖에 없었다. 그런데 최소 주문 수량도 고려해야 했다. 따라서 주어지는 n이 1부터 100까지이기 때문에 단순히 반복문을 1부터 100까지 실행하다 최소 주문 수량을 찾으면 break를 거는 방식을 사용하기로 했다. 풀이 여기서 i를 1부터 100까지 1씩 증가시키기 때문에 당연히 가장 먼저 if문에 걸리는 값이 최소 값일 것이다. 이 때, 리턴해야할 answer 값이 최..
이번 문제는 0레벨에 있는 문제 시리즈 중 하나인데 최근 푼 문제 중에 가장 재밌었다. 문제 가장 먼저 7조각의 피자를 인원 수에 딱 맞게 시킬 경우와 그렇지 않은 경우를 판단해야 했다. 7의 배수라면 7*X와 같이 총 조각 수가 나오게 될 것이고, 피자는 X판을 주문하면 됐다. 나머지 경우는 한 판을 여유롭게 시켜야 했다. 그런데 이렇게 생각할 경우 n이 7 미만일 때가 애매했다. 풀이 그래서 인원 수에 맞게 주문할 경우와 아닌 경우는 %연산자를 통해 7의 배수인지 확인했고, 나머지 경우에서 주문할 피자 수를 구할 때는 n을 7로 나눈 몫을 사용하면 n이 7 미만이어도 이미 +1을 해두었기 때문에 문제가 없었다.
오랜만에 코딩 문제를 풀어보려하니 생각보다 머리가 안 돌아간다. 그래서 다시 낮은 레벨부터 시작해보기로 했다. 문제 풀이 먼저 1부터 입력된 n까지 반복문을 통해 홀수를 찾는 것을 목표로 했다. 이 때, 반복문을 1부터 n번 반복할 필요는 없다고 생각했다. 홀수 찾기가 목표이기에 2씩 건너뛸 방법을 찾아보았다. 내가 찾은 방법은 for문에서 step을 사용해 해결할 수 있었다. 그 다음 찾은 홀수를 어떻게 배열에 담을까 고민하다 이전에 List를 Array로 만들어 리턴해 주기로 했다. List를 사용한 이유는 Array의 크기는 수정할 수 없고, for문 안에 사용된 i를 통해 간단히 Array의 index에 접근하기에는 무리가 있었다. 문제에서 Array를 오름차순으로 리턴하라고 했지만 for문을 1..
안드로이드에서 사용하는 확장자로는 apk와 aab가 있다. 오늘은 apk에 대해 먼저 소개해보려 한다. apk라는 확장자를 많이 들어본 사람도 있을 것이다. 몇 년 전 다들 아직 저작권이란 개념이 많이 없었던 시기에 여기저기 소위 말하는 크랙 파일들이 많이 돌아다녔다. 유료 게임의 크랙 버전이나 무료 게임이라도 재화가 무제한으로 주어지는 등의 크랙 파일이 기억에 남는다. 물론, 그런 출처가 불분명한 파일들을 다운로드 받는다는 것 자체가 해킹의 표적이 될 수 있다는 사실도 다들 간과했을 것이다. 나는 께림칙해서 기피했지만 말이다. 다시, 본론으로 돌아가 APK에 대해 알아보자. APK(Android Application Package)는 하나의 완성된 앱이라고 할 수 있다. APK의 생성과정을 살펴보면 이..