Language

Language/Kotlin

Coroutines 여러 개로 연산 속도 높이기

이번 글에서는 전에 다루었던 withContext로 스레드를 전환 후 연산 작업을 더 빠르게 수행해보려고 한다. 기존에는 팩토리얼 계산을 Default Dispatcher를 사용해 하나의 코루틴에서 연산을 수행했다.이번에는 여러 개의 코루틴에서 연산을 수행한다. 어떤 구조로 실행할까팩토리얼을 몇개의 코루틴으로 나눠 실행할지 정해야 한다.실행할 코루틴 갯수만큼 연산할 숫자의 길이를 동등하게 분배한다.작은 범위를 계산하는 서브 코루틴을 동시에 실행시킨다.모든 서브 코루틴이 종료되는 것을 기다린다.모든 서브 코루틴이 종료되면 fold 함수를 사용해 작은 범위들을 모두 곱한다. 코드suspend fun calculateFactorial( factorialOf: Int, numberOfC..

Language/Swift

Swift - 프로퍼티(Properties)

프로퍼티의 정의 및 사용프로퍼티는 구조체, 클래스, 열거형 내부에 구현할 수 있다.(열거형 내부에는 연산 프로퍼티만 구현 가능) 연산 프로퍼티는 var키워드로만 선언 가능하다. 연산 프로퍼티는 읽기 전용으로는 구현 가능하지만, 쓰기 전용으로는 불가능하다. 읽기, 쓰기 둘 다 가능하게 하려면 get, set 블럭을 구현하면 된다. set 블럭에서 암시적 파라미터로 newValue를 사용할 수 있다. 종류저장 프로퍼티(Stored Properties)연산 프로퍼티(Computed Properties)타입 프로퍼티(Type Properties) 코드 예시struct Student { // 인스턴스 저장 프로퍼티 var name: String = "" var `class`: String ..

Language/Kotlin

Java, Kotlin Interoperability 해결하기

이번 글은 최근 Java -> Kotlin 변환과Java 클래스에서 Kotlin 클래스를 사용하면서 겪은 이슈를 공유해본다. 문제 상황 설명먼저 Java 클래스를 Kotlin 클래스로 변경했다. 이 때 특정 변수는 자료형을 변경하면서까지 리팩토링을 진행했다. 그리고 다시 변경한 Kotlin 클래스를 Java 클래스에서 사용하는 부분이 필요했다.(아래처럼 말이다)class SomeData { var a: UInt = 0 var b: Int = 0}public class User { public void someMethod() { SomeData someData = new SomeData(); someData.getB(); someData.getA(); }} Kot..

Language/Swift

Swift - 클로저(Closures) - 2

지난 글에 이어 클로저에 대해 더 자세히 들여다보는 시간을 가져보려한다. 여러 클로저 표현기본 클로저 표현func calculate(x: Int, y: Int, method: (Int, Int) -> Int) -> Int { return method(x, y)}이렇게 클로저를 작성하는 것은 이미 저번 글에서 확인했다. 후행 클로저(Trailing Closures)함수 파라미터 마지막으로 전달되는 클로저는 후행 클로저로 함수 외부에 구현할 수 있다. 이는 마치 코틀린 SAM(Single Abstract Method) 변환과 모습이 비슷해보인다.var result: Intresult = calculate(x: 10, y: 10) { (left: Int, right: Int) -> Int in re..

Language/Swift

Swift - 클로저(Closures) - 1

클로저(Closures)는 무엇일까?클로저는 실행 가능한 코드 블럭이다.함수와 달리 이름이 정의되지 않아도 괜찮지만 함수처럼 파라미터 전달 및 리턴 값이 존재할 수 있다.일급 객체로써 변수, 상수 등에 저장이 가능하고 함수의 파라미터에도 전달이 가능하다. 기본 클로저 문법 알아보기{ (parameters) -> returnType in // running code}클로저는 기본적으로 중괄호로 감싸져있다.괄호를 통해 파라미터를 정의하고 "->" 를 이용해 리턴 타입을 명시한다."in" 키워드를 이용해 실행 코드와 분리한다. 간단한 예시로 사용해보기let sum: (Int, Int) -> Int = { (x: Int, y: Int) in return x + y}let result: Int = sum(1..

Language/Kotlin

CoroutineScope와 CoroutineContext 되짚어보기

CoroutineScope(이하 Scope)는 CoroutineContext(이하 Context)라는 하나의 프로퍼티를 가지고 있다. 더불어 모든 Coroutine은 특정 Scope에서 실행된다. 그리고 여러 개의 Coroutine은 같은 Scope에서 실행될 수 있다. 특정 Coroutine과 그 자식 Coroutine을같은 Scope에서 실행하게 되면 Job 객체들이 부모-자식 계층을 구성하게 된다. 이렇게 형성된 부모-자식 계층은 구조적 동시성에서 중요한 부분이다. 같은 Scope에서 실행된 Coroutine은기본적으로 해당 Scope의 Context를 상속받는다. 하지만 각 Coroutine은 다른 Context로 실행될 수 있고,이것도 계층 구조를 따라 특정 Coroutine이 A라는 Conte..

Language/Kotlin

withContext로 스레드 전환하기

저번 글에서 예고했던 대로 메인 스레드에서 했던 무거운 작업을 이제 다른 스레드에서 작업시켜보자.(이전 글 확인하기) 이전 동작 이해하기아까 첨부한 링크에서의 이전 글을 보면우리는 viewModelScope를 사용해 CPU 연산이 무거운 작업을 메인 스레드에서 실행했다. 그렇게 수초간 메인 스레드가 blocking되었고, 다른 UI는 반응할 수 없었다. 그리고 우리가 실행했던 viewModelScope의 Context를 확인하는 방법이 하나 있다.fun performCalculationOnMain(factorial: Int) { viewModelScope.launch { println("Coroutine Context: $coroutineContext") var result = BigInt..

Language/Kotlin

Coroutines Dispatcher 알아보기

이번 글은 저번 CoroutineContext와 CoroutineScope를 소개한 것에 이어서 Dispatcher에 대해 알아보겠다. Dispatcher의 역할Dispatcher는 해당 코루틴이 어느 스레드나 스레드 풀에서 실행될지 결정한다. Dispatcher의 종류Dispatcher는 이미 정의된 몇가지가 있는데 이에 대해 짧막하게 알아보자. Dispatchers.MainMain Dispatcher는 오직 UI가 있는 애플리케이션에서만 사용할 수 있다. 안드로이드의 경우, UI 작업을 오직 메인 스레드에서만 허용하므로Main Dispatcher를 사용해 메인 스레드에서 실행할 수 있다. 해당 Dispatcher가 Main Looper와 연결된 Handler를 사용하기 때문이다. 우리가 Main Di..

Language/Kotlin

CoroutineContext와 CoroutineScope 알아보기

이번에는 CoroutineContext는 대체 무엇인지 알아보자. 그리고 간단히 CoroutineScope 구조까지 살펴보도록 하겠다. viewModelScope로 찾아보기viewModelScope는 CoroutineScope라는 인터페이스를 상속받아 만들어진 녀석이다. 그리고 CoroutineScope 인터페이스를 확인해보자.보다시피 CoroutineContext를 가지고 있는 걸 볼 수 있다. 그리고 다시 한 번 CoroutineContext가 무엇인지 들어가보자.문서 최상단을 읽어보면 CoroutineContext는 여러 Context Element를 포함하고 있다는 사실을 알 수 있다. 여기서 가장 중요한 Element에는 바로 Dispatcher, Job, ExceptionHandler, Nam..

Language/Kotlin

Coroutines on Main Thread(위험성에 대해 인지하기)

오늘은 코루틴을 메인 스레드에서 실행해보고 그 결과에 대해 생각해보는 시간을 가져보았다. 어떤 작업을 시킬까이번에는 단순한 연산을 시킬 예정이다. 아주 많이 팩토리얼(Factorial) 계산을 시켜보겠다. 코드를 보자.fun calculateFactorial(number: Int): BigInteger { var factorial = BigInteger.ONE for (i in 1 .. number) { factorial = factorial.multiply(BigInteger.valueOf(i.toLong())) } return factorial}여기서 BigInteger를 사용했는데 간단히 말하면Integer형으로 계산할 때 오버플로우가 날만한 범위까지도 계산이 가능한 클래스이..

BonusTrack02.dev
'Language' 카테고리의 글 목록