전체 글 47

LiveData 맛보기

LiveData는 관찰자 패턴을 사용하여 데이터 변경을 다른 컴포넌트에 알릴 수 있는 데이터 홀더다. ViewModel 및 데이터 바인딩과 함께 사용하는 것이 일반적이다. 👍 LiveData의 장점 수명주기를 인식한다. LiveData는 자신을 관찰하는 컴포넌트의 수명주기를 인식한다. 해당 컴포넌트의 수명주기가 활성 상태(STARTED 또는 RESUMED)이면 데이터 업데이트를 알린다. 반대로 비활성 상태이면 업데이트를 수신하지 않고 활성 상태로 전환됐을 때 수신한다. 메모리 누수가 없다. LiveData가 업데이트될 때 실행되는 콜백은 연결된 수명주기가 끝날 때 자동으로 삭제된다. 📦 LiveData 사용해보기 LiveData 객체 생성하기 LiveData는 추상 클래스이므로 서브클래스인 Mutable..

Android 2023.02.28

ViewModel 맛보기

ViewModel 클래스는 UI 관련 데이터 및 비즈니스 로직을 포함하는 아키텍처 컴포넌트다. 👍 ViewModel의 이점 앱을 사용하다가 화면 회전 같은 구성 변경이 발생하면 UI 컨트롤러(액티비티 및 프래그먼트)가 소멸한 뒤 바로 재생성된다. 이 과정에서 UI에 표시되어 있던 데이터가 손실될 수 있으므로 이를 보존하는 작업이 필요하다. 액티비티의 onSaveInstanceState, onRestoreInstanceState 콜백 메서드에서 Bundle을 사용하여 데이터를 백업 및 복원할 수 있지만, 이 방법은 추가적인 코드가 필요하며 적은 용량의 데이터만 보관할 수 있다는 단점이 있다. ViewModel은 구성 변경이 발생해도 소멸하지 않으며 추가적인 코드 없이 백업 및 복원이 용이하므로 UI 데이터..

Android 2023.02.27

Retrofit2로 JSON 데이터 요청하기

🔍 Retrofit이란? Retrofit은 개발자가 정의한 API를 사용하여 HTTP 통신을 할 수 있게 해주는 HTTP 클라이언트 라이브러리다. HTTP 요청을 통해 XML, JSON 등의 데이터를 받아올 수 있으며 이 포스트에서는 JSON을 다룬다. Retrofit A type-safe HTTP client for Android and Java square.github.io 🧩 라이브러리 설치하기 모듈 레벨 build.gradle 파일의 dependencies 블럭에 다음 종속 항목들을 추가한다. Retrofit2 HTTP 통신 작업을 수행한다. 컨버터 요청한 JSON 데이터를 변환한다. 여러 가지 컨버터가 있으며 여기에서는 GsonConverter를 사용한다. 아래 코드에서는 포스팅 시점 기준 최신..

Android 2023.02.21

【프로그래머스】 신고 결과 받기 (Kotlin)

문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 신고 기록 배열을 순회하며 두 가지 맵에 데이터를 추가한다. targetListMap 각 사용자가 신고한 다른 사용자 리스트를 포함하는 맵 reportCountMap 각 사용자가 신고된 횟수를 포함하는 맵 각 사용자가 신고한 다른 사용자가 정지된 경우 배열의 해당하는 원소를 증가시킨다. 맵에 데이터 추가하기 report에서 중복을 제거하고 다음을 반복한다. 신고 기록 데이터를 신고자와 피신고자로 분리한다. targetListMap에서 신고자에 해당하는 리스트에 피신고자를 추가한다. reportCou..

【프로그래머스】 숫자 문자열과 영단어 (Kotlin)

문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 String의 replace 함수로 문자열 안의 각 영단어를 숫자로 바꾼다. 마지막으로 문자열을 Int 타입으로 변환하면 된다. 코드 GitHub - blacksg/ProblemSolving Contribute to blacksg/ProblemSolving development by creating an account on GitHub. github.com class Solution { fun solution(s: String): Int { return s.replace("zero", "0") .r..

【프로그래머스】 이모티콘 할인행사 (Kotlin)

문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 이모티콘마다 다른 할인율을 적용했을 때 플러스 서비스 가입자 수 및 이모티콘 구매 금액을 IntArray에 담고 이를 최대 힙에 추가한다. 모든 경우에 대한 결과를 힙에 추가했다면 peek한 IntArray를 정답으로 리턴한다. 최대 힙 준비하기 IntArray를 담을 새 PriorityQueue 객체를 생성한다. 각 IntArray의 첫 번째 원소는 플러스 서비스 가입자 수이고 두 번째 원소는 이모티콘 판매액이다. 문제에서 제시한 목표에 따라 Comparator를 설정한다. // 서비스 가입자 수..

【프로그래머스】 택배 배달과 수거하기 (Kotlin)

문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 트럭이 출발할 때마다 가장 먼 집부터 최대 적재량만큼 배달 및 수거해야 최소 이동 거리로 배달 및 수거를 마칠 수 있다. 배달 및 수거 큐 구성하기 deliveries와 pickups를 각각 거꾸로 순회하며 큐에 각 집을 방문해야 하는 횟수만큼 추가한다. 이 로직은 두 번 실행해야 하므로 IntArray가 파라미터인 로컬 함수로 작성한다. val array: IntArray = /* deliveries 또는 pickups */ // 방문해야 하는 가장 먼 집을 담은 큐 val queue = Link..

【프로그래머스】 멀쩡한 사각형 (Kotlin)

문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 사용할 수 없는 정사각형을 표시해 보면 대각선을 따라 특정 패턴이 반복된다는 것을 확인할 수 있다. 이러한 패턴은 대각선이 정사각형의 꼭짓점과 만날 때마다 반복된다. 패턴을 포함하는 가장 작은 직사각형에서 사용할 수 없는 정사각형은 해당 직사각형의 가로 및 세로만큼 이동하므로 개수를 세면 총 \(\mathbf{(w+h)/gcd(w, h)-1}\)개임을 확인할 수 있다. 이 패턴이 \(\mathbf{gcd(w, h)}\)번 반복되므로 전체 직사각형에서 사용할 수 없는 정사각형의 개수는 총 \(\mat..

【프로그래머스】 배달 (Kotlin)

문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 우선순위 큐를 이용한 다익스트라 알고리즘을 적용했다. 그래프 HashMap을 사용하여 각 마을 사이의 도로 정보를 나타내는 그래프를 구성한다. 각 마을 번호를 키, 연결된 마을과 소요 시간을 Pair로 짝짓고 이를 포함하는 MutableList를 값으로 한다. val graph = hashMapOf() road.forEach { // MutableList에 도로로 연결된 두 마을의 연결 정보를 추가한다. graph.getOrPut(it[0]) { mutableListOf() }.add(it[1] t..

【프로그래머스】 소수 만들기 (Kotlin)

문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 중첩된 for 문을 사용하여 nums의 세 인덱스를 조합한 뒤, 해당 위치의 원소를 모두 합한다. 함수를 사용하여 합이 소수인지 판별한 결과에 따라 반환값을 증가시킨다. for 문 구성하기 조합하고자 하는 세 인덱스를 순서대로 i, j, k라 하자. j, k를 선택하기 위해 i는 0에서 시작하여 마지막 인덱스 - 2까지만 반복한다. j는 i와 중복되지 않도록 i + 1에서 시작한다. k를 선택하기 위해 마지막 인덱스 - 1까지만 반복한다. k는 j와 중복되지 않도록 j + 1에서 시작하며 마지막 인..

WorkManager (4) : 작업 체이닝

작업 체이닝 WorkContinuation 객체를 사용하면 일련의 일회성 작업을 체이닝하여 예약할 수 있다. WorkManager#beginWith(OneTimeWorkRequest)는 처음 실행하고자 하는 작업 정보를 포함하는 WorkContinuation 객체를 반환한다. 그 다음 WorkContinuation#then(OneTimeWorkRequest)를 사용하여 이어서 실행하고자 하는 작업을 체이닝하면 된다. 한 번에 여러 작업을 동시에 실행하려면 위의 각 메서드의 파라미터로 List를 전달한다. 마지막으로 WorkContinuation#enqueue()로 작업 체인을 WorkManager에 예약하면 된다. 다음은 work1, work2, work3를 동시에 실행한 다음 cache, upload를..

Android 2022.12.10

WorkManager (3) : 작업 관리하기

작업 예약하기 작업을 예약하려면 WorkRequest 객체를 WorkManager의 예약 큐에 추가해야 한다. WorkManager 객체는 WorkManager.getInstance(Context)를 호출하여 액세스한다. 그러고 나서 enqueue(WorkRequest)에 WorkRequest 객체를 전달한다. val myWork: WorkRequest = // ... OneTimeWorkRequest or PeriodicWorkRequest WorkManager.getInstance(requireContext()).enqueue(myWork) 고유 작업 예약하기 작업을 예약할 때 고유 이름을 설정하면 해당 이름을 가진 작업 인스턴스가 하나만 존재하게 된다. 이렇게 하면 같은 작업이 중복 예약되는 문제를..

Android 2022.12.05