프로그래밍/Kotlin 11

Flow.map() vs Flow.transform()

fun getPagedFavoritePosts(): Flow = Pager( config = PagingConfig(25), pagingSourceFactory = { GenericPagingSource { afterKey -> redditApi.loadFavoritePosts(getUserName(), afterKey) } } ).flow.transform { pagingData -> emit(pagingData.map { (it.data as PostDto).map() }) } 우연히 오픈소스 코드를 보다가, 나라면 map을 썼을 것 같던 구문에 transform을 사용한 것을 발견했다. transform? 처음 들어봤는데 이름이 map과 왠지 비슷한 일을 할 것같아서 찾아보았다. map Flow의 ..

[Kotlin] 클로저(Closure)에 대해 알아보자

Closure와 일반함수의 차이점 Closure는 outer scope에 있는 변수에 접근할 수 있지만, 일반 함수는 그렇지 못하다. 일반 함수는 자신이 정의된 영역 내에서만 변수를 사용할 수 있다. Closure는 함수를 값으로 취급하여 변수에 저장하거나 다른 함수의 인자나 반환값으로 사용할 수 있지만, 일반 함수는 그렇지 못하다. 일반 함수는 이름을 통해서만 호출할 수 있다. Closure는 실행 시점에 생성되고 소멸되지만, 일반 함수는 컴파일 시점에 생성되고 소멸되지 않는다. Closure는 상황에 따라 다른 값을 가질 수 있지만, 일반 함수는 항상 동일한 값을 가진다. Kotlin closure Kotlin에서 Closure는 상위 함수의 영역에 있는 변수에 접근할 수 있는 함수다. Kotlin은..

Kotlin은 왜 나왔고, 왜 Android 공식언어로 채택되었을까?

Kotlin은 어떤 언어? Intelij IDE로 유명한 Jetbrains에서 개발 2017년 구글에서 안드로이드 개발 정식언어로 채택 (왜 채택?) ‘Interoperatablity’ 강조, 틈새를 파고드는 전략 → 기존에 개발된 프로젝트 / 라이브러리를 그대로 사용가능 엄청 특별한건 아님… JVM language들 다 되긴함 Scala / Groovy / Jython… Kotlin In Action: Kotlin의 주요 목표는 더 간결하고, 생산적이면서 안전한 Java의 대안을 제공하는 것. → But Java의 대안에 초점보다는 실용적임 / 간결함 / 안전한 언어에 초점 객체지향 프로그래밍 뿐만아니라 함수형 프로그래밍 스타일도 지원 일급함수(First-class functions) 불변값 (Immu..

[Kotlin] CompletableDeferred의 개념과 활용

Promise가 그리울때 이벤트 기반으로 통신하는 프로토콜을 구현중에, JS의 Promise나 Dart의 Completer와 비슷한 역할을 하는 Kotlin 친구가 없을까하다 찾게되었다. 완벽한 대체재다! CompletableDeferred는 public function을 이용해 완료하거나 취소할 수 있는 Deferred이다. 이를 활용하면 내가 원하는 시점까지 기다렸다가 값을 받을 수 있다. 그럼 SuspendableCoroutine이랑 뭐가 다르냐? 라는 생각이 들 수 있다. SuspentableCoroutine은 해당 블록 안에서만 complete/cancel을 제어할 수 있지만, CompletableDeferred는 그런 제약이 없다. CompletableDeferred : Functions ab..

Kotlin coroutine : async vs launch 차이

async vs launch async 결과를 반환하는 코루틴을 시작하는데 사용 예외(Exception)가 발생할 경우 결과를 반환에 포함한다. 결과 또는 예외를 포함하는 Deferred를 반환 launch 결과를 반환하지 않는 코루틴을 시작하는데 사용 본인 혹은 자신 코루틴의 실행을 취소하기위해 사용할 수 있는 Job을 반환 Job: Fire and forget Job Job은 생성될때 기본적으로 자동 시작된다. 하지만, 이를 자동시작 되지 않게하려면 CoroutineStart.LAZY를 사용할 수 있다. Job join() vs start() join: Job을 완료할때까지 대기한다. start: 애플리케이션이 Job이 완료될때까지 기다리지 않는다. Job의 라이프 사이클 New: 생성됨 Active..

Kotlin Scope functions의 쓰임새 (let, run, with, apply, also, takeIf, takeUnless) with skydove's pokedex

코틀린에서는 특정한 객체에대해 이름없이 접근할 수 있는 스코프를 형성하는 함수가 존재하는데, 이것이 바로 스코프 함수(Scope function)이다. 5가지로 이루어져있고, 목록은 아래와 같다. let run with apply also 이들을 코틀린 공식 문서와함께, 이 안드로이드 바닥에서 유명한 오픈소스 프로젝트인 Skydove님의 Pokedex 코드와 함께 살펴보려고한다. 기본적으로는 이들 모두 하는일은 동일하다. 어떤 객체에 대한 코드블록을 실행시키는거다. 차이점은 리턴값, 그리고 블록안에서 해당 객체가 어떻게 참조되는지뿐이다. 함수명 객체참조 리턴값 Extension함수 인지? let it Lambda result O run this Lambda result O run - Lambda resu..

[Kotlin/Java] Youtube URL인지 체크, Youtube Video ID 가져오기

대세는 유튜브라~ 안드로이드 앱에서 어떤 문자열이 유튜브 URL인지 체크해야할 경우가 잦다. 유튜브는 PC에서 볼 수 있는 youtube.com과 모바일이나 공유시 볼 수 있는 youtu.be 이렇게 생긴 URL이있는데 인터넷을 긁어긁어 모든 Youtube 관련 URL에 대응할 수 있는 완벽한 정규식을 찾아냈다. 하핫 유용하게 사용하세요. object YoutubeUtil { // 유튜브 섬네일 가져옴 fun getThumbnail(url: String): String { val vId = getVideoId(url) return "https://img.youtube.com/vi/$vId/hqdefault.jpg" } fun getVideoId(url: String?): String { var vId =..

[Kotlin/Java] 닉네임 정규식, 닉네임 유효성 검사하기

조건: 숫자, 영어, 한국어와 언더스코어, 공백을 허용하며 최소 2자 이상의 닉네임 만약에 공백을 하용하지 않을 경우 정규식을 다음과 같이 변경 ^[가-힣ㄱ-ㅎa-zA-Z0-9._-]{2,}\$ fun isValidNickname(nickname: String?): Boolean { val trimmedNickname = nickname?.trim().toString() val exp = Regex("^[가-힣ㄱ-ㅎa-zA-Z0-9._ -]{2,}\$") return !trimmedNickname.isNullOrEmpty() && exp.matches(trimmedNickname) }

[Kotlin/Java] 숫자를 K, M, B 단위로 줄여서 표시하기

오늘부터 꾸준히... 유용한 함수가 있으면 올릴려고 한다. 마음 먹는게 중요한 거니까~ 아래 함수를 이용하면 10,000을 10K로 표시할 수 있다. fun formatNumber(value: Long): String { return when { value >= 1E9 -> "${(value.toFloat() / 1E9).toInt()}B" value >= 1E6 -> "${(value.toFloat() / 1E6).toInt()}M" value >= 1E3 -> "${(value.toFloat() / 1E3).toInt()}K" else -> NumberFormat.getInstance().format(value) } }

[Kotlin] Channel이란?

원문: https://proandroiddev.com/kotlin-coroutines-channels-csp-android-db441400965f원문을 읽으면서 제가 이해하기 위해 번역한 것입니다.개념만 남기고 예제는 거의 뺐으니 예제를 보시려면 여기로~ Channels Channel은 2개의 Coroutine 사이를 연결한 파이프라고 생각하면 된다.이 파이프는 두 Coroutine 사이에서 정보를 전송할 수 있도록 한다.하나의 Coroutine은 파이프를 통해서 정보를 보낼 수 있고, 다른 하나의 Coroutine은 정보를 받기위해 기다린다. 채널이라는 말을 일상생활에서는 TV에서 제일 많이 쓰는데..채널을 통해서 우리는 방송국에서 쏴주는 방송을 본다. (일방적 커뮤니케이션)사진에서 1번 Corouti..