Kotlin
[kotlin] withTimeout 사용시 suspend/non-suspend 함수 동작 차이
[kotlin] withTimeout 사용시 suspend/non-suspend 함수 동작 차이
2024.07.14delay()코틀린의 delay 함수는 코루틴을 지연시키는 함수입니다. 이는 스레드를 차단하지 않고 코루틴이 일정 시간 동안 대기하도록 합니다.fun main() = runBlocking { println("Start") delay(1000L) println("End")}위 코드에서 delay(1000L)은 1초 동안 코루틴을 지연시키고, 그 이후에 "End"를 출력합니다.delay() 함수는 suspend 함수로, 내부적으로 코루틴을 일시 중단(pause)시키고, 지정된 시간이 경과한 후에 코루틴을 재개합니다. withTimeoutwithTimeout 함수는 주어진 시간 내에 완료되지 않는 작업을 취소하는 함수입니다. withTimeout 블록 내에서 작업이 지정된 시간 내에 완료되지 ..
[코루틴] 병렬성(Parallelism)과 연속성(Concurrency) 예제
[코루틴] 병렬성(Parallelism)과 연속성(Concurrency) 예제
2023.08.28팀 내에서 코루틴 병렬처리와 관련하여 코드리뷰 중 팀원간 싱크가 맞지 않는 것 같아 정리한 글입니다. 연속성(Concurrency) 1번 suspend fun main() = coroutineScope { async { someService.callAPI1() }.await() async { someService.callAPI2() }.await() } 위 코드는 두 API 호출이 순차적으로 이루어집니다. 첫 번째 async 블록은 callAPI1()를 호출하고, 그 결과를 기다린 후, 두 번째 async 블록이 시작됩니다. 이 방식은 두 번째 API 호출이 첫 번째 API 호출의 결과에 의존적인 경우 또는 순차적 실행이 필요한 경우에 사용하기 적합합니다. 2번 suspend fun main() = co..
Kotlin 'by' 키워드의 역할 (feat. Composition)
Kotlin 'by' 키워드의 역할 (feat. Composition)
2023.01.21코틀린의 by 키워드는 Delegate Pattern을 쉽게 구현할 수 있도록 도와주는 키워드입니다. Delegate Pattern Delegate Pattern이란 객체의 메소드를 다른 객체(Helper Object)에 위임하여 처리하는 패턴입니다. 즉 어떤 기능을 자신이 수행하지 않고 다른 객체가 수행하도록 하는 패턴입니다. 특히 이 Delegate Pattern과 항상 붙어다니는 "상속 vs 조합" 이라는 단어입니다. 자식클래스에서 부모클래스의 요소를 사용할 때 상속(Ingeritance) 또는 조합(Composition)을 이용할 수 있습니다. 상속은 모든 요소를 물려받기 때문에 변수나 메소드 등을 다시 구현할 필요가 없어 편리하지만, 객체의 유연성이 떨어진다는 치명적인 단점이 있습니다. 만약 부..
Javascript Promise로 배우는 Kotlin Coroutine
Javascript Promise로 배우는 Kotlin Coroutine
2022.10.09Coroutine 이란? 처음 코루틴을 접했을 때 코틀린의 '코'를 따서 'Ko'routine 인줄 알았지만, 사실 코루틴의 Co는 Concurrency라는 의미를 가지고있습니다. 즉, 동시성 프로그래밍 개념을 코틀린에 도입한 것이 코루틴 이라고 합니다. 코루틴은 javascript Promise와 조금 다른 성질을 가지고 있습니다. 코루틴은 스레드 위에서 실행되는데 여러가지 코루틴 1,2,3이 존재한다고 할 때 코루틴1을 실행하던 중 코루틴2가 실행되어도 실행중인 스레드를 정지하면서 컨텍스트 스위칭 개념으로 다른 스레드로 전환하는 것이 아니라 기존 스레드를 유지하며 기존 스레드에서 코루틴2를 실행하게 됩니다. 이후 코루틴1을 다시 실행할 때 저장해둔 코루틴1 상태를 불러와 다시 스레드에서 코루틴1을 실..
Kotlin 리플렉션(Reflection)
Kotlin 리플렉션(Reflection)
2022.09.06리플렉션(Reflection)이란? 리플렉션은 말 그대로 '반사', '반영'의 의미를 가지고있습니다. 구체적인 클래스 타입을 알지 못하더라도 바이트코드를 이용해 해당 클래스의 메소드, 타입, 변수들을 참조하여 값을 찾을 수 있는 JAVA API입니다. 즉 컴파일 시점이 아닌 런타임에 동적으로 특정 클래스의 정보를 추출할 수 있고 변수를 변경하거나 메소드를 호출할 수 있는 프로그래밍 기법입니다. 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 사용됩니다. intelliJ의 자동완성 기능, Lombok, Spring Container, Spring annotation 등에서 사용됩니다. 리플렉션은 아래와 같은 정보들을 가..
[Kotlin] companion object, Java static 차이점
[Kotlin] companion object, Java static 차이점
2022.05.15이 글은 코틀린의 companion object와 Java의 static 키워드의 차이점에 대해 학습한 것을 정리하였습니다. object class 코틀린은 자바에 없는 독특한 싱글톤(Singleton) 선언 방법이 있습니다. 아래처럼 class 키워드 대신 object 키워드를 사용하면 됩니다. object Singleton { val name = "singleton" fun print() = println("hello") } fun main() { println(Singleton.name) // "singleton" Singleton.print() // "hello" val singleton = Singleton() // 에러! } object 키워드로 선언한 속성과 메소드는 static 키워드로 선..
[Kotlin] coroutine, suspend 함수 정리 및 예제
[Kotlin] coroutine, suspend 함수 정리 및 예제
2022.04.19Coroutine 코루틴이란. 실행의 지연과 재개를 허용함으로서, 비선점 멀티테스킹을 위한 서브루틴을 일반화한 구성요소입니다. 자세히 이해하기 위해 서브루틴과 비선점 멀티테스킹 두가지 개념을 알아야 합니다. 루틴과 서브루틴 루틴은 컴퓨터 프로그램에서 하나의 정리된 일(job)입니다. 프로그램은 보통 크고 작은 여러가지 루틴을 조합시킴으로써 만들어집니다. 루틴은 다시 메인루틴과 서브루틴으로 나뉩니다. 메인루틴은 프로그램 전체의 개괄적인 동작 절차를 표시하도록 만들어 집니다. 서브루틴은 반복되는 특정 기능을 모아 별도로 묶어 이름을 붙여 놓은 것입니다. 그리고 별도의 메모리에 해당 기능을 모아놓고 서브루틴이 호출될 때마다 저장된 메모리로 이동했다가 return 을 통해 원래 호출자의 위치로 돌아오게 됩니다...
[Kotlin] Scope 함수 (let, run, with, apply, also)
[Kotlin] Scope 함수 (let, run, with, apply, also)
2022.03.27Scope 함수 코틀린 표준 라이브러리는 객체의 컨텍스트 내에서 코드 블럭(익명 함수)을 실행하기 위한 목적을 가진 여러가지 함수를 제공합니다. 이런 함수들은 람다식으로 호출 할 수 있고, 이는 임시로 범위(scope)를 형성합니다. 해당 범위 내에서는 객체의 이름이 없어도 객체에 접근할 수 있습니다. 이러한 함수를 Scope funtions라고 합니다. 스코프 함수의 종류는 아래와 같습니다. let run with apply also 기본적으로, 이 함수들은 동일한 역할을 수행합니다. 다른점이 있다면, scope 내에서 객체를 어떤 방식으로 호출하는지, 리턴 값을 어떻게 처리하는지입니다. 아래는 Person class가 있을 때 scope function의 사용법입니다. Person.kt data cl..
[Kotlin] 확장 함수와 프로퍼티
[Kotlin] 확장 함수와 프로퍼티
2022.03.20코틀린 확장 함수 코틀린은 기존 클래스에 메소드를 추가할 수 있습니다. 이를 확장 함수라고 합니다. 하지만 기존 클래스에 대해 메소드를 확장적으로 선언을 할 수 있을 뿐, 해당 클래스의 구현부를 바꿀 수는 없습니다. 기존 클래스는 그대로 두고 클래스 주변에 새로운 함수를 추가하여 클래스의 크기를 확장한다. 라고 생각하면 좋을 것 같습니다. String 클래스의 메소드인것 처럼 사용할 수 있는 lastChar 메소드를 확장해보겠습니다. 확장 함수의 선언 방법은 아래와 같습니다. fun String.lastChar():Char = this.get(this.length - 1) // this 생략 가능 fun String.lastChar():Char = get(length - 1) // 사용시 println(..