일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- notification
- Behavior
- CoordinatorLayout
- room
- onMeasure
- CollapsingToolbarLayout
- 알고리즘
- View
- kotlin
- 안드로이드
- Coroutine
- ViewModel
- DataBinding
- 백준
- CustomView
- Algorithm
- onLayout
- 알림
- Android
- sqlite
- BOJ
- hilt
- Navigation
- LiveData
- AppBarLayout
- 코틀린
- lifecycle
- activity
- HTTP
- recyclerview
- Today
- Total
목록kotlin (43)
개발일지
Coroutine에 접근하기 위해서는 CoroutineScope를 사용해서 접근해야 한다. CoroutineScope는 interface형식으로 정의되어 있고, CoroutineContext를 사용해서 생성하거나, 미리 정의된 GlobalScope를 사용할 수 있다. GlobalScope GlobalScope는 별도의 생명주기가 없고, 실행되면 작업이 종료되거나 앱이 종료될 때까지 남아있는다. fun main() = runBlocking { GlobalScope.launch { println("Running on GlobalScope ${Thread.currentThread().name}") } delay(1000L) } Running on GlobalScope DefaultDispatcher-worke..
suspend함수는 순차적으로 실행되는게 기본이다. fun main() = runBlocking { val time = measureTimeMillis { val one = doSomethingOne() val two = doSomethingTwo() println("Result : ${one + two}") } println("Time : $time") } suspend fun doSomethingOne(): Int { delay(1000L) // 무거운 작업 return 10 // 결과 리턴 } suspend fun doSomethingTwo(): Int { delay(1000L) // 무거운 작업 return 20 // 결과 리턴 } Result : 30 Time : 2025 async 하지만 do..
cancel() Job을 취소시키는 함수, Job이 취소되었을 때 suspend 함수를 호출하면 JobCancellationException을 발생시킨다. fun main() = runBlocking { val job = launch { repeat(5) { try { delay(1000L) println("Job Run Index($it)") } catch (e: Exception) { e.printStackTrace() } } } delay(3000L) job.cancel() job.join() } Job Run Index(0) Job Run Index(1) kotlinx.coroutines.JobCancellationException: StandaloneCoroutine was cancelled; ..
코루틴 빌더 runBlocking { } -> 해당 코루틴이 끝날 때 까지 Blocking한다. fun main() { // delay(1000L)가 실행되는 동안 main함수가 끝나고 println을 만나지 못하고 종료 GlobalScope.launch { delay(1000L) println("Pass") } } Process finished with exit code 0 fun main() { GlobalScope.launch { delay(1000L) println("Pass") } runBlocking { // delay(2000L)이 끝날 때 까지 Blocking 된다. delay(2000L) } } Pass Process finished with exit code 0 launch { } ->..
Gradle 설정 dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7") } Thread vs Coroutine Thread와 Coroutine은 동시성을 보장하기 위한 기술이다. Thread Preempting Scheduling 자원을 서로 차지하려고 노력하고 OS가 Context Switching을 통해 Thread에게 자원을 할당한다 -> Overhead발생 Thread자체 Stack메모리를 가지고 JVM Stack을 차지한다. Coroutine Cooperatively 처리 단위가 Thread가 아닌 Coroutine에서 제공하는 Job Object단위로 하나에 Thread에서 진행된다. Thread..
also 해당 객체를 사용하기 전에 데이터의 유효성을 검사할 때 매우 유용하다. 선언 fun T.also(block: (T) -> Unit): T { block(this) return this } 코드 class Animal { var name: String = "Animal" var age: Int = 0 override fun toString(): String { return "Name : $name, Age : $age" } } fun isDog(animal: Animal) { assert(animal.name == "Dog") } fun main() { val dog = Animal().also { isDog(it) } } apply 특정 객체를 생성하면서 동시에 초기화를 할 때 사용한다. 객체가..
채널 만들기 Android O 이상에서 Notification을 생성하기 위해서는 Notification Channel을 만들어야 한다. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val NOTIFICATION_CHANNEL_ID = "id" val NOTIFICATION_CHANNEL_NAME = "name" val NOTIFICATION_IMPORTANCE = NotificationManager.IMPORTANCE_DEFAULT val channel = NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, NOTIFICATION_IMPORTANCE) val manager = ..
Array 선언방법 // arrayOf를 이용한 생성 // 여러가지 자료형을 가질 수 있다. val arr1 = arrayOf(1, 2, 3, "str") // 생성자를 이용한 생성 // 첫번째 인자 : Size, 두번째 인자 : Lambda #각 인덱스별로 어떻게 처리할지 val arr2 = Array (10) { it } // 형식을 지정하는 arrayOf val arr3 = intArrayOf(1, 2, 3, 4) // null로 채우고 시작하는 배열 // 첫번째 인자 : Size val arr4 = arrayOfNulls(10) Array 접근 Array는 인덱스가 0부터 시작한다. 코드 val arr = Array (5) { it*it } println(arr[3]) arr[3] = 1 prin..