본문 바로가기

안드로이드

(34)
[안드로이드] 동기화에 대하여 알아보자(3) - 빌푸의 솔루션 이전 포스팅에서는 Volatile과 Synchronize를 정리하면서 스레드도 안전하게 싱글톤 패턴을 구현하는 간단한 예시도 들었다. 다만 아쉽게 느껴진 점은 Volatile을 사용해서 캐시 메모리가 아닌 메인 메모리에 변수를 저장하다보니, 해당 변수에 접근 하면서 발생하는 비용이 꽤나 발생한다는 점이었다. 그래서 그에 대한 해결 방법을 찾아보다가 Bill Pugh's Solution(이하 빌푸의 솔루션)을 찾게 되었다. 빌푸의 솔루션 빌푸의 솔루션은 inner static class를 이용하여, 자바 혹은 코틀린에서 Volatile annotation + Synchronize 조합을 사용하지 않고 안전한 스레드 안에서 싱글톤 패턴을 구현하는 방법이다. 먼저 그 예시를 보면 아래와 같다. // Volat..
[안드로이드] 동기화에 대하여 알아보자(2) - Synchronize, @Volatile 어제에 이어서 오늘은 이론적인 내용도 좋지만 실질적으로 프로그래밍 되는 방법을 몇 개 정리해보려고 한다. @Volatile 먼저 볼 것은 어노테이션의 한 종류인 Volatile이다. 이 어노테이션은 상수가 아닌 변수에만 사용 가능한 것으로서, 이게 붙으면 해당 변수는 캐시 메모리가 아닌 메인 메모리에서 직접 읽고/쓰기를 진행해야 하는 변수로 선언이 되는 것이다. 이런 어노테이션이 나온 이유는 singleton pattern에서 동기화 문제가 발생하기 때문이다. 만약 서로 다른 2개의 CPU에서 Singleton Pattern이며, 초기화 되어 있지 않은 특정 클래스의 Instance에 접근한다고 가정해보자. 해당 instance에 동시에 2개의 CPU가 동시에 접근을 할 것이며, 해당 instance를 ..
[안드로이드] 동기화에 대하여 알아보자(1) - 세마포어와 뮤텍스 이번엔 동기화에 대하여 시리즈로 작성할 것이다. 당근회사와의 인터뷰 중 동기화와 관련한 많은 질문들을 받았고, 이와 관련하여 만족스러운 답변을 하지 못했다. 그래서 차후에 다른 인터뷰에서 이러한 질문이 나왔을 때 유연한 답변을 위해 질문 받은 것들, 그리고 그 외 사항들에 대해서 전반적으로 정리할 것이다. 임계구역과 발생하는 문제 임계구역은 각 프로세스가 포함하고 있는 코드로서, 해당 구역 안에서 적어도 하나 이상의 다른 프로세스와 공유하는 데이터에 접근하고 데이터를 갱신할 수 있는 구역을 일컫는다. 이때 동시에 두 프로세스가 임계구역에 진입하여 동일한 공유 자원에 접근하여 조작하고, 그 실행 결과가 접근이 발생한 특정 순서에 의존하는 경쟁 상황(race condition)이 발생하게 된다. 해결방법 이..
[안드로이드] Kotlin에서 List, Set, Map에 대하여 오늘은 많이 사용하지만 좀 더 정확한 차이를 알아보기 위해 List, Set, Map에 대하여 정리해보겠다. List - Collection을 상속받은 구현체인 List는 일반적으로 순서가 매겨진 원소의 모음이다. - List interface는 초기화 이후에 데이터에 대한 read만 가능하다. - List를 사용하면서, 초기화 이후 read/write를 모두 하고 싶으면 MutableList를 사용하면 된다. Set - Collection을 상속받은 구현체인 Set은 일반적으로 순서가 매겨져 있지 않으며 중복된 값이 들어가지 않는다. 따라서 특정 Set에는 고유값만 들어가게 된다. - List와 마찬가지로 초기화 이후에 데이터에 대한 read만 가능하다. - 초기화 이후 read/write 모두 하고 ..
[안드로이드] SharedFlow와 StateFlow에 대하여 간단하게 알아보자 어제 모기업의 면접을 보다가 SharedFlow와 StateFlow의 차이점에 대해서 물어봤다. 분명 둘 다 사용해봤던 클래스들이고, 데이터의 흐름에 관한건데 답변을 정확히 알고 하지 못했다. 이래저래 생각해보면 Compose로 넘어오면서 StateFlow도 사용하고 Compose도 사용하는데, 사용하는 것들에 대하여 정확하게 인지를 하지 않았었다. 그것과 관련된 것들을 하나하나 다 알아보고 정리를 해야겠다. SharedFlow & StateFlow - 상태의 업데이트를 최적으로 내보내고 여러 사용자들에게 값을 내보내는 Flow API이다. - Hot Stream 이다. 따라서 데이터의 소비자가 나타나면 가장 마지막 그리고 후속 상태 및 데이터를 전달한다. - SharedFlow와 StateFlow의 다..
[안드로이드] Cold Stream, Hot Stream에 대하여 Observer 패턴과 양대산맥으로 많이 쓰인다는 Flow인데, 나는 많이 사용해본적이없어서, 이제야 꾸역꾸역 알아가는 중이다. 그래서 오늘은 Cold Stream, Hot Stream에 대해서 정리했다. Flow Cold Stream, Hot Stream에 대해서 얘기하기전에, 이 둘과 밀접한 연관이 있는 Flow에 대해서 간단하게 짚고 넘어가자. Flow는 공식 문서에서 'Flows are built on top of coroutines and can provide multiple values.' 이라고 간단하게 설명되어 있으며, 코루틴 기반으로 빌드되고, 여러 값들을 하나의 흐름으로 제공해준다. 그리고 이러한 흐름은 Cold Stream, Hot Stream으로 구분된다. Cold Stream Co..
[안드로이드] ConstraintLayout의 속성에 대하여 ConstraintLayout의 속성을 두루두루 알아야 일하기 수월해질거라는 사실에 도달하게 되었다. 고로 오늘은 ConstraintLayout의 속성에 대하여 알아보겠다. 그냥 심플하게 속성에 대해서 알아만 보자 ConstrinatLayout에는 속성이 무지하게 많다. 그래서 카테고리 별로 해당 속성을 볼 것이다. 1. Relative Positioning 흔히 사용하는 layout_constraintStart_toStartOf와 같은 상대적 위치를 지정해주는 속성은 넘어가겠다. 2. Margins ConstraintLayout은 기본적인 Margin은 다른 레이아웃과 마찬가지로 설정해준다. 다른 레이아웃과 다른 점이라면, goneMargin이라는 속성이 사용 가능하다. 만약 A라는 뷰의 타겟 뷰가 없..
[안드로이드] let, run 등에 대하여 코틀린으로 안드로이드를 개발하다보면 누구나 쉽게 let, run, also, apply, with 등과 같은 객체를 본적이 있을 것이다. 여기서 내가 궁금한거는 그래 쓰면 편하긴 한데, 대관절 이것들을 어느 시점에서 어떤걸 써야 하는지가 궁금하다. 그래서 그거에 대하여 정리를 해 볼 것이다. 여러 사이트를 쭈욱 봤을 때, 이러니 저러니 좋은 설명들이 많다. 다만 와닿게 나는 그냥 심플하게 적어둔다. 1. apply apply는 apply가 받는 객체에 대하여 해당 객체의 내부에서 그 객체의 함수를 사용하지 않는다면 사용이 적합하다. 아주 간단하게 설명하자면, 객체 초기화 할 때 쓰자. data class PersonInformation( var name : String = "", var age : Int..