본문 바로가기

안드로이드/알아두기

(19)
[안드로이드] 동기화에 대하여 알아보자(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..
[안드로이드] let, run 등에 대하여 코틀린으로 안드로이드를 개발하다보면 누구나 쉽게 let, run, also, apply, with 등과 같은 객체를 본적이 있을 것이다. 여기서 내가 궁금한거는 그래 쓰면 편하긴 한데, 대관절 이것들을 어느 시점에서 어떤걸 써야 하는지가 궁금하다. 그래서 그거에 대하여 정리를 해 볼 것이다. 여러 사이트를 쭈욱 봤을 때, 이러니 저러니 좋은 설명들이 많다. 다만 와닿게 나는 그냥 심플하게 적어둔다. 1. apply apply는 apply가 받는 객체에 대하여 해당 객체의 내부에서 그 객체의 함수를 사용하지 않는다면 사용이 적합하다. 아주 간단하게 설명하자면, 객체 초기화 할 때 쓰자. data class PersonInformation( var name : String = "", var age : Int..
[코틀린] inner class(내부 클래스)와 nested class(중첩 클래스)에 대하여 어제 면접을 갔다 왔다. 정말 많은 방면에서 질문이 들어왔다. 다만 나는 준비가 많이 덜 되있고 부족하다는 생각이 들었다. 내가 안해서 부족한걸 어떡하겠는가. 더 열심히 준비해야지 그래서 면접에서 받은 기술면접 질문 중 내가 멍.... 하게 만든 간단(?) 하면서도 나는 솔직하게 몰라서 제대로 대답하지 못한 질문에 대해서 알아볼 것이다. inner class에 대해서 질문을 받았을 때, 나중에 면접자 분께서 Java에 대해 질문을 하려고 하셨는데, 자바를 잘 모른다고 답해서 해당 질문은 들어오지 않았다. 다만 그 질문이 뭔지 내부 클래스를 찾아보면서 추측할 수 있었다. 자바 프로젝트에서 A 클래스가 있고 B 클래스가 A 클래스 안에 선언되어 있다고 가정해보자. 이렇게 되면 B클래스는 A클래스의 내부 클래..