728x90

Kotlin

    [Kotlin] MutableSharedFlow의 tryEmit()이 실행되지 않을 때

    SharedFlow는 코루틴에서 쉽게 사용할 수 있는 Hot Stream입니다. 안드로이드에서는 뷰모델에서 이벤트 처리할 때 자주 사용합니다. 이번에 MutableSharedFlow를 사용하며 tryEmit()이 실행되지 않는 이슈가 있었고, 이에 대한 내용을 공유해보고자 합니다. 아래에 예시 코드는 뷰모델에서 특정 이벤트를 발생시켜 액티비티에서 이벤트를 처리해주는 코드입니다. class MainViewModel @Inject constructor() : ViewModel() { private val _event = MutableSharedFlow() val event = _event.asSharedFlow() fun doSomething() { _event.tryEmit(ToastEvent("오류입니다..

    [Kotlin] inline에 대하여 - inline, noinline, crossinline, reified

    inline 키워드에 대해서는 처음 코틀린을 공부할 때 보긴 봤었지만, 정확히 어떤 상황에서 사용하는지 알지 못했었다. 이번에 코틀린 확장 함수를 정리하다가 inline 키워드에 대하여 자세히 알게 되었고, 관련 내용을 기술하려고 한다. inline 키워드를 한마디로 설명한다면 다음과 같다. 고차 함수를 사용하면 런타임 패널티가 있기 때문에 함수 구현 자체를 코드에 넣음으로써 오버헤드를 없앨 수 있다. 이게 대체 무슨 말일까? 예시를 통해 좀 더 쉽게 알아보자. inline fun doSomething(action: () -> Unit) { action() } fun callFunc() { doSomething { println("문자열 출력!") } } 위와 같은 고차 함수가 있다고 하자. 이 코드를 ..

    [Kotlin] Kotlin의 Delegates 알아보기 - observable, vetoable

    디자인 패턴에서 Delegate Pattern이란 어떠한 기능을 자기 자신이 처리하지 않고 다른 객체에 일을 위임시켜 그 객체가 일을 처리하게끔 하는 것이다. Kotlin의 Delegates를 활용하면 여러 가지 일을 간단하게 처리할 수가 있다. 이 글에서는 Delegates의 observable과 vetoable를 활용하는 방법을 알아볼 것이다. observable과 vetoable을 사용하면 어떤 데이터의 값이 변경되었는지 쉽게 알아낼 수가 있다. 다시 말해, 옵저버 패턴을 쉽게 구현할 수가 있다. observable observable은 위에서 언급한 대로 프로퍼티를 observable 하게 만들어준다. 이것을 이용하면 프로퍼티의 데이터가 변할 때마다 callback을 받을 수 있다. public ..

    [Kotlin] 코틀린 문법 정리 - 04

    1. 제네릭 (Generic) fun toFunction(value: T): () -> T = { value } fun main(args: Array) { val func: () -> Int = toFunction(1170) println(func()) } 2. 여러 타입을 인수로 받기 fun toFunction(value1: T, value2: R): () -> T = { value1 } fun main(args: Array) { val func: () -> Int = toFunction(1170, "test") println(func()) } 3. 구체화된(Reified) 타입 매개변수 타입 매개변수는 is 연산자의 피연산자로 사용할 수 없다. fun check() { val number = 0 if..

    [Kotlin] 코틀린 문법 정리 - 03

    1. Inline 함수 Inline 함수는 함수 호출문을 함수의 몸체로 대체하기 때문에 성능을 조금이나마 개선할 수 있다. inline fun hello(){ println("hello") println("kotlin") } fun main(args: Array) { hello() hello() hello() } Inline 함수를 호출하면 컴파일 되는 순간 아래와 같은 코드로 대체된다. fun main(args: Array) { println("hello") println("kotlin") println("hello") println("kotlin") println("hello") println("kotlin") } 2. lateinit lateinit 키워드가 붙은 프로퍼티는 클래스 안에서 바로 초기..

    [Kotlin] 코틀린 문법 정리 - 02

    1. 클래스를 상속하는 객체 클래스 없이 object 표현식을 사용해 상속을 할 수 있다. 이때의 상속은 1회용이 된다. open class Person(val name: String, val age: Int) { open fun print() { println("이름:$name, 나이:$age") } } fun main(args: Array) { val custom: Person = object : Person("Alan", 23) { override fun print() { println("it's a object") } } custom.print() } 2. Any 클래스 모든 코틀린 클래스들은 Any 클래스를 상속한다. open class Any { open operator fun equals(o..

    [Kotlin] 코틀린 문법 정리 - 01

    1. 표현식 하나의 값으로 수렴하는 수식 뭉치. 자바에서는 표현식이 단독으로 오는 것을 허용하지 않기 때문에 아래와 같은 코드는 오류를 일으키지만, 코틀린은 그렇지 않다. fun Example() { 53 + 62 - 126 } 2. 변수 var : 일반 변수 val : 불변 변수, 자바의 final // 변수를 선언하고 그와 동시에 초기화 var total: Int = 0 val a: Int = 10 + 53 - 7 val b: Int = 32 + 45 - a total = a + b 3. 리터럴 변수의 값이 변하지 않는 데이터, 리터럴에 타입이 있기 때문에 표현식의 결과 값에도 자연스럽게 타입이 생기게 된다. 뒤의 10 + 12 - 5는 표현식의 결과가 Int 이므로 variable 뒤에 :int가 ..

    [Kotlin] 코틀린 표준 라이브러리 - 스트림 함수

    자바 8에서는 컬렉션에 포함된 자료들을 손쉽게 다룰 수 있도록 스트림(stream) 기능을 제공한다. 코틀린에서는 스트림 대신 이와 유사한 역할을 하는 함수들을 표준 라이브러리에서 제공하며, 확장 함수 형태로 제공된다. 변환 1. map() - 컬렉션 내 인자를 다른 값 혹은 타입으로 변환할 때 사용한다. fun main(args: Array) { val cities = listOf("Seoul", "Tokyo", "London") // SEOUL, TOKYO, LONDON cities.map { city -> city.toUpperCase() } .forEach { println(it) } // 5, 5, 6 cities.map{city -> city.length} .forEach { println(i..

728x90