Kotlin

    [Kotlin] runCatching

    runCatching은 코틀린 1.3 버전부터 지원된 캡슐화 블록으로 블록의 실행 결과가 Result의 형태로 리턴된다. 또한 실행 결과에 따른 프로퍼티, 함수들을 사용하여 유연한 이벤트 스트림으로 처리하여 가독성 있는 코드를 구현하는데 큰 도움이 된다. runCatching 예시 val name: Result = runCatching { //String을 리턴하는 작업 "JMJ94" }.onSuccess { it: String -> it }.onFailure { tr: Throwable -> println("$tr") } runCatching은 실행 결과에 따른 프로퍼티를 제공한다. isSuccess runCatching 블록의 실행이 별문제 없이 성공한다면 result는 true고 문제가 발생한 경우..

    [Kotlin] 스레드와 코루틴

    스레드와 코루틴은 동시성을 보장하고, 비동기 작업을 하기 위해 많이 사용된다는 공통점이 있다. 동시성은 말그대로 여러가지 작업을 한번에 수행하는 것이지만, 실제 동작은 시분할 기법을 활용하여 여러 작업들을 조금씩 나누어 번갈아가며 실행기때문에 사용자입장에서는 여러 작업이 동시에 일어나는것처럼 느껴지게 된다. 비동기 작업은 특정 작업을 수행할 때 작업이 끝날 때까지 기다리지 않고 다른 작업을 수행할 수 있는 특징이 있다. 그런데, 스레드와 코틀린은 근본적으로 큰 차이점이 존재한다. 스레드는 각 Task에 해당하는 Stack메모리를 할당받고 동시에 여러 작업을 수행할때 OS는 어떤 스레드 작업을 먼저 수행해야 효율적인지에 대한 스케쥴링(선점 스케쥴링)을 한다. Task 단위는 Thread이며 JVM의 Sta..

    [Kotlin] CoroutineBuilder

    코루틴은 일시 중단이 가능한 작업 객체로 동시성을 지원하는 관점에선 스레드와 유사한점이 많다. 하지만 코루틴은 분명 스레드에서 동작하지만 그 어떤 스레드에 종속되진 않는다. 하나의 코루틴 작업을 스레드 이곳저곳을 돌아다니며 실행시킬 수 있기 때문이다. 이러한 코루틴을 만드는 방법은 CoroutineBuilder를 활용하는 것이다. CoroutineBuilder는 말그대로 코루틴을 만드는 코루틴 객체 생성자이다. CoroutineBuilder는 launch, async 이렇게 두 개로 볼 수 있다. launch, async를 알아보기에 앞서 Dispatchers에 대해 잠깐 알고 넘어가자. Dispatchers는 코루틴의 실행을 관리해주는 CoroutineContext로 스레드에 코루틴의 실행을 분배하거나..

    [Kotlin] Object

    때때로 새로운 클래스를 명시적으로 선언하지 않고 클래스를 조금 변경된 객체를 만들 필요가 있다. Kotlin은 이런 케이스를 해결하기 위해 Object 식(expression)과 Object선언(declaration)을 지원한다. Object 식 특정 타입을 상속받는 inner 클래스 객체를 만들 때는 다음과 같이 작성한다. window.addMouserListener(object: MouseAdapter()){ override fun mouseClicked(e: MouseEvent){ //... } overrid fun mouseEntered(e: MouseEvent){ //... } }) 상위 타입이 복수라면 콜론 뒤에 콤마로 구분한다. open class A(x: Int) { public open ..

    [Kotlin] Delegated Properties

    일반적으로 프로퍼티는 필요할 때마다 수동으로 구현할 수 있지만, 한 번 구현한 후 필요할 때마다 재사용하는 것이 더 유용하다. 대상은 다음과 같다. Lazy 속성: 최초 접근시에만 값을 계산. Observable 속성: 이 속성의 변경사항을 리스너로 알림. 별도의 필드가 아닌 맵에 속성을 저장. 이 경우들을 처리하기 위해 Kotlin은 Delegated Properties를 지원한다. class Example{ var p: String by Delegate() } 형태는 val/var : by 이다. by 뒤에 붙은 expression이 대리자(delegate)이며, 프로퍼티에 대한 get() / set()을 대리자 getValue() / setValue() 메소드에 위임한다. 프로퍼티 대리자는 인터페이..

    [Kotlin] Delegation

    Delegation 패턴은 상속 처리의 좋은 대안으로, Kotlin은 네이티브 코드에 보일러 플레이트 코드가 필요 없는 이 패턴을 지원한다. 아래 코드에서 클래스 Derived는 인터페이스 Base로부터 상속받아 모든 퍼블릭 메소드를 지정된 객체에 위임 가능하다. interface Base{ fun print() } class BaseImpl(val x: Int): Base{ override fun print() { print(x) } } class Derived(b: Base): Base by b fun main(){ val b = BaseImpl(10) Derived(b).print() } //result: 10 Derived의 상위 타입 목록에 있는 by는 Derived의 객체 내부에 b가 저장되고..