분류 전체보기 26

[안드로이드] CoroutineContext

안녕하세요. 오늘은 코틀린 코루틴의 정석 - CH6를 읽고 정리한 글입니다. 코루틴 빌더 함수인 launch와 async는 어떻게 선언되어 있을까요?public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit): Jobpublic fun CoroutineScope.async( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, blo..

[알고리즘] 정렬 - 프로그래머스 K번째 수, 가장 큰 수, H-Index

안녕하세요. 오늘은 정렬 관련 글입니다.짧아요. 정렬이란?데이터가 뒤죽박죽이면 원하는 걸 찾기도, 비교하기도 힘들죠.정렬은 데이터를 규칙있게 줄 세우는 기술입니다. 학교 축제에 부스 참가자 100명을 이름순으로 줄 세워야 한다고 해봅시다.뒤섞인 명단을 매번 처음부터 훑는 건 비효율적이죠.한번 깔끔히 정렬해두면:특정 이름 찾기 - 이진 탐색으로 O(log n) (정렬 전엔 O(n))중복 체크/병합/범위 질의 - 정렬돼 있으면 훨씬 쉬움정렬은 그 자체로도 중요하지만, 다른 알고리즘을 강하게 만들어주는 기본기인거죠. Kotlin 정렬 함수실제로 자주 사용되는 정렬 함수에 대해서 알아봅시다. sorted()정렬된 새 리스트를 반환 / 원본 리스트는 그대로.숫자/문자열의 기본 오름차순으로 정렬val xs = li..

[안드로이드] async와 Deferred

안녕하세요. 오늘은 코틀린 코루틴의 정석 - CH5를 읽고 정리한 글입니다. launch를 통해 생성되는 코루틴은 기본적으로 결과를 반환하지 않습니다.하지만 코루틴을 사용할 때 결과를 수신해야하는 경우가 많죠.ex) 네트워크 통신 → 응답 처리 이런 경우를 위해 코루틴 라이브러리는 async 코루틴 빌더를 통해 결괏값을 수신받을 수 있도록 합니다.launch함수 → (결괏값 X)Job 반환 / async 함수 → (결괏값 O)Deferred 반환5장에서는 async 함수와 그로부터 반환되는 Deferred 객체를 통해 결괏값을 수신하는 방법에 대해 다룹니다. 📌5장에서 다루는 내용1. async-await 사용해 코루틴으로부터 결괏값 수신하기2. awaitAll 함수를 사용해 복수의 코루틴으로부터 결괏..

[안드로이드] merge와 rebase, cherry-pick과 squash

안녕하세요. 오늘은 깃에 대해 이야기를 해보려 합니다.깃에 대해 이야기하면서 왜 카테고리가 안드로이드냐 .. 라고 하시면제가 안드로이드 개발을 하다가 공부하게 된거기 때문에 예시 이미지들이 모두 안드로이드 스튜디오라 그랬습니다. 아무튼 시작해보겠습니다. 작업을 하면서 깃을 몇 번 꼬아보니나 지금 깃을 제대로 알고 사용하고 있는 게 맞나?라는 의문이 들었습니다. 제대로 알고 있지 못하니 문제가 생겼을 때,왜 발생했는지, 원인이 무엇인지어떻게 해결해야 할지를 전혀 모르겠더라고요.그럴 때마다 제 자신에 환멸을 느껴서 .. 이렇게 깃에 대해 알아보는 글을 적게 되었습니다. 우선 개발을 시작한 지 어언 2~3년이 되어가면서 아직도 깃을 꼬느냐? 라고 하신다면이유가 있습니다.저희 프로젝트에서 지금껏 사용해보지 않..

[안드로이드] Custom Convention Plugin

안녕하세요. 오늘은 Custom Convention Plugin에 대한 이야기를 해보려 합니다.멀티모듈멀티모듈에 대해서는 저번 글인 멀티모듈, 왜 그리고 어떻게?에서 다뤘었습니다.글을 쓰며 멀티모듈에 대해서 알아본 후, 실제 구현에 들어가게 되었는데요.구현하며 정확히 개념 정리가 되지 않아 어려웠던 점이 있습니다.바로 gradle 빌드였습니다. 저번 글에서 아주 가볍게 지나가듯이 말했었습니다.“멀티모듈의 이점으로는 증분빌드가 있다. 단일 모듈이면 코드 한 줄만 수정해도 전체를 다시 빌드해야 하지만, 멀티모듈이면 수정된 모듈과 관련된 모듈만 빌드하면 된다”고요. 왜 그럴 수 있을까요?Gradle은 빌드할 때,지난 번에 만든 결과물(build output)과 지금 바뀐 소스코드를 비교해서, 변한 부분만 다시..

[알고리즘] 해시(Hash) / 백준 1302, 1920 / 프로그래머스 의상, 베스트앨범

안녕하세요. 오늘은 알고리즘 - 해시 관련 글입니다.최근 안드로이드 공부에만 몰두해 있었는데, 공고들을 보고 마음이 심란해져 늦게나마 알고리즘 공부에 다시 뛰어들었습니다.앞으로는 알고리즘도 꾸준히 공부해보려고 해요.첫 번째 글은 해시입니다. 해시(Hash)란?“데이터를 섞어서(변환해서)” 특정한 위치로 보내주는 함수나 방법을 의미합니다.즉, 어떤 입력(문자열, 숫자, 키 등)을 받아서, 그것을 인덱스(배열의 위치) 같은 것으로 바꾸는 과정이죠. 해시함수(hash function)는 임의 길이의 입력값을 받아서 고정 크기의 값으로 바꾸는 함수입니다. 이 값을 해시 값(hash value) 또는 해시 코드(hash code)라고 불러요. ex)문자열 "apple" → 해시 함수 → 정수 37숫자 123456..

[안드로이드] 코루틴 빌더와 Job

안녕하세요. 오늘은 코틀린 코루틴의 정석 - CH4를 읽고 정리한 글입니다.📌 4장에서 다루는 내용1. join, joinAll 함수를 사용한 코루틴 간 순차처리2. CoroutineStart.LAZY 사용한 코루틴 지연 시작3. 코루틴 실행 취소하기4. 코루틴의 상태 앞 챕터들에서 코루틴 생성 함수 runBlocking과 launch에 대해서 알아봤었어요.이런 코루틴을 생성하는데 사용되는 함수를 코루틴 빌더 함수라고 합니다. 코루틴 빌더 함수는코루틴을 만들고, 코루틴을 추상화한 Job 객체를 생성해요.반환된 Job 객체는 코루틴의 상태 추적과 제어에 사용이 됩니다.코루틴은 일시 중단 후 나중에 이어서 실행이 가능하기 때문에 상태 추적이 필수적이에요.fun main() = runBlocking { va..

[안드로이드] CoroutineDispatcher

안녕하세요. 오랜만에 돌아왔습니다.오늘은 코틀린 코루틴의 정석 - CH3를 읽고 정리한 글입니다.📌 3장에서 다루는 내용1. CoroutineDispatcher 객체의 역할2. 제한된 디스패처와 무제한 디스패처의 차이3. 제한된 디스패처 생성하기4. CoroutineDispatcher 사용해 코루틴 실행하기5. 코루틴 라이브러리에 미리 정의된 디스패처의 종류와 사용처 3.1 CoroutineDispatcher 객체의 역할CoroutineDispatcher는 Coroutine + Dispatcher입니다.그럼 코루틴은 알겠고, Dispatcher은 뭘까요? Dispatcher는 Dispatch(보내다) + -er 로 무언가를 보내는 주체를 뜻합니다.그렇다면 CoroutineDispatcher는 코루틴을 ..

[안드로이드] 코루틴 개발 환경 설정

안녕하세요. 오늘은 코틀린 코루틴의 정석 - CH2를 읽고 정리한 글입니다. 📌 2장에서 다루는 내용1. IntelliJ IDEA 사용해 개발환경 설정하기2. 첫 코루틴 실행해 보기3. 코루틴 디버깅을 위해 JVM 옵션 설정하기4. CoroutineName 사용해 코루틴에 이름 설정하기 사실 이번 챕터는 많은 것을 다루지 않습니다.개발환경 세팅이 주이기 때문에 간단히 다뤄볼게요. 2.1 개발환경 설정하기kotlin은 언어 수준에서 Coroutine을 지원하지만 저수준 API만을 제공합니다.→ 코루틴 라이브러리 - kotlinx.coroutines(⇒ 고수준 API - async, await 등 제공)를 사용합니다.따라서 따로 의존성 추가가 필요해요. 2.2 첫 코루틴 실행해 보기import kotlin..

[안드로이드] 스레드 기반 작업의 한계와 코루틴의 등장

안녕하세요. 오늘은 코틀린 코루틴의 정석 - CH1을 읽고 정리한 글입니다. 📌 1장에서 다루는 내용1. JVM 프로세스와 스레드에 대한 이해2. 단일 스레드를 사용하는 것의 한계와 멀티 스레드 프로그래밍3. 기존 멀티 스레드 프로그래밍의 한계와 코루틴이 이를 극복한 방법 1.1 JVM 프로세스와 스레드코틀린 앱의 실행 진입점은 main 함수이죠.'앱 실행 → JVM 프로세스 시작 → 메인 스레드 생성 → main 함수 내부 코드 수행 → 종료'의 플로우를 가져요. 메인스레드는 프로세스의 시작과 끝을 함께 합니다.따라서 메인스레드가 강제 종료되면 프로세스도 강제 종료되겠죠. ⇒ JVM의 프로세스는 기본적으로 메인 스레드를 단일 스레드로 해서 실행되며, 메인스레드 종료 시 함께 종료됩니다. * 메인 스레..