Composable, 너의 위치를 알려죠! (OnGloballyPositioned)

컴포저블의 포지션은 어떻게 구할 수 있나 Android View로 애플리케이션 UI를 구현할 때는 root 에서 하위에 있는 view의 포지션을 구할 수 있었다. 하지만 컴포즈로 UI를 구현시에는 View는 ComposeView 하나만 존재하고, 캔버스에 필요한 Element들을 그리는 방식이다.  위의 이미지와 같이 특정 버튼(컴포저블) 위치에 맞춰 어떠한 팝업을 띄운다고 가정할 때 어떻게 포지션을 구할 수 더보기…

[안드로이드로 배우는 OpenCV] matchShape로 객체 검출하기

이전 포스팅에서 모멘트에 대해서 알아보았고, 그중 Hu의 7개 불변 모멘트가 영상의 크기, 회전, 이동, 대칭 변환에 불변하다는 것을 알 수 있었다. 이러한 부분을 참고하여 주어진 이미지에서 원하는 객체를 찾아보도록 하자. OpenCV에서는 원하는 객체를 찾기위해 주어진 두 모양을 비교하는 matchShapes()라는 함수를 제공한다. matchShape() matchShape 함수는 주어진 두개의 윤곽선(Contour)을 비교하는 함수다. 내부적으로 더보기…

생명주기에 맞춰 안전하게 코루틴 사용하기

생명주기에 안전한 코루틴 lifecycle 컴포넌트를 사용한다면, 생명주기를 인식하는 코루틴을 만들 수 있다. LifecycleOwner로써 취급되는 AppCompatActivity(ComponentActivity) 또는 Fragment를 일반적으로 사용할 때 lifecycle 컴포넌트를 사용하게 되는데 이때 lifecycleScope를 사용할 수 있다. 일반적은 코루틴 스코프와 마찬가지로 launch를 async와 같은 함수 호출을 통해 suspendable 한 작업을 할 수 있다. lifecycleScope.launch { // 코루틴 작업 더보기…

콜드 스트림을 핫 스트림으로 변경하기 (shareIn, stateIn)

MutableSharedFlow를 사용하여 값을 발행하고 다른 한편에서는 이를 수집할 수 있는 수단을 제공한다. 그러나 다른 코드에 있는 콜드 플로우를 가져와서 이 업스트림을 수집하고 SharedFlow로 내보낼 수 있는 편리한 방법도 있다. 바로 ShareIn 연산자를 사용하는 것이다. ShareIn 연산자 shareIn 연산자는 다음과 같이 생겼다. 이 연산자를 사용하면, Flow(콜드스트림)를 주어진 코루틴 스코프(scope) 내에서 시작되는 더보기…

[이펙티브 코틀린 요약] 효율적인 컬렉션 처리

컬렉션은 중요한 개념이며, 안드로이드에서도 일반적으로 RecyclerView, LazyColumn 등을 사용할 때 컬렉션을 사용하게 된다. 현대적인 프로그래밍 언어는 대부분 컬렉션 처리를 굉장히 잘 지원해주며, 코틀린도 강력한 컬렉션 처리를 지원한다. 컬렉션을 처리하는 부분의 최적화는 성능에 큰 영향을 미치므로 굉장히 중요하다. 이번 포스팅에서는 효율적인 컬렉션 처리를 하는 방법에 대해서 알아본다. 하나 이상의 처리단계를 가진 더보기…

오토박싱 및 언박싱 그리고 JVM내 캐시에 대하여

Autoboxing vs Unboxing 오토박싱(Autoboxing)은 Java 컴파일러가 원시 타입(Primitive types)과 해당 객체 래퍼 클래스 간에 수행하는 자동 변환을 말한다. 예를 들어 int를 Integer로, double을 Double로 변환하는 식이다. 변환이 다른 방향으로 진행되는 경우 이를 언박싱(unboxing)이라고 한다. 다음 간단한 오토박싱 예제를 살펴보자. ‘a’의 타입은 char인데 Character에 대입했다. 이렇게 해도 호환이 되며 이것이 오토박싱이다. 더보기…

[이펙티브 코틀린 요약] 비용 줄이기

과거에는 메모리가 비쌌고 하드웨어적인 제약이 컸기 때문에 효율성(efficiency) 및 최적화에 많은 노력을 기울였다. (1985년에 출시한 게임, 마리오 브라더스 용량이 약 40kB이였던 것에 대해 생각해보자) 하지만 오늘날에는 상대적으로 하드웨어보다 개발자의 몸값이 비싸기 때문에 과거보다는 효율성에 대해 상대적으로 관대하게 바라본다.하지만 여러가지 측면에서 최적화는 여전히 중요하다. 조금만 최적화에 신경을 써도 사용자 및 기업이 더보기…

처음 시작하는 코루틴, 기본적인 용어와 이해

코루틴(Coroutines)이란? 코루틴은 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴이다. 코루틴은 다음과 같은 특징을 갖는다. 경량화 메모리 누수 감소 계층적 구조를 통한 취소 전달 Jetpack과의 통합 Suspend function suspend(유예하다, 연기하다) vs block(막다, 차단하다) blocking과 suspending의 차이에 대해서 먼저 알아보자. 단일 쓰레드에서 네트워크 요청(FUNCTION A)과 같은 더보기…

코틀린/자바의 volatile에 대해서

volatile이란? 자바의 volatile 키워드 또는 코틀린의 @Volatile 애노테이션을 변수 선언시 지정할 수 있다. 사전적 의미로는 ‘휘발성의’라는 뜻을 가지며, 변수 선언시 volatile을 지정하면 값을 메인 메모리에만 적재하게 된다. volatile 변수를 사용하지 않는 일반적인 경우는 내부적으로 성능 향상을 위해 메인 메모리로부터 읽어온 값을 CPU 캐시에 저장한다. 하지만 멀티쓰레드 애플리케이션에서는 각 쓰레드를 통해 더보기…

[이펙티브 코틀린 요약] 클래스 설계

코틀린에서 자주 사용하는 클래스 패턴을 살펴보도록 한다. 이번 장에서는 다음의 내용에 대해서 생각 해 볼 수 있다. ‘상속’을 활용해야 하는 경우 ‘data 클래스’를 사용해야 하는 경우 하나의 메서드를 갖는 인터페이스를 함수 타입으로 사용해야 하는 경우 equals, hashCode 그리고 compareTo의 규약 상속보다는 컴포지션 사용하기 상속은 계층 구조를 만들기 위해 사용한다. 계층 더보기…