전체 글 (46) 썸네일형 리스트형 [안드로이드] 동기화에 대하여 알아보자(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.. [알고리즘] 프로그래머스 - 요격 시스템 이번에 푼 문제는 프로그래머스의 요격 시스템으로, 탐욕 알고리즘을 사용해서 진행했다. 그리디 알고리즘은 각 단계에서 항상 최선의 선택을 하여 최종적으로 최적해를 찾는 알고리즘이다. 그래서 정렬을 우선적으로 사용하여 문제 요소를 적절한 순서로 만들어, 직관적이고 효율적이게 그리디 알고리즘이 동작하게 해야한다. 그래서 그리디 알고리즘에서는 항상 sorting을 먼저 진행해준다. 문제 문제설명 입출력 설명에서 나와있듯이, y축으로 쭉 뻗어나가는 미사일 요격 시스템을 이용해서 x으로 진행되는 미사일을 요격하는데, 이때 미사일 요격 시스템을 최소한으로 사용하면서 모든 미사일을 다 없애야 해서 최솟값을 구하는 문제이다. 접근법 이 문제는 탐욕 알고리즘으로 접근하여 해결한다. 그 사유는 아래와 같다. 탐욕 알고리즘으.. [알고리즘] 프로그래머스 - 네트워크 DFS를 풀었다면, 당연히 BFS도 풀어주는게 알고리즘의 도리이다. 이번에 볼 내용은 프로그래머스의 네트워크이다. 문제를 먼저 보겠다. 문제 문제설명 2차원 배열로 주어진 computers에서 서로 연결된 네트워크의 개수를 구하는 것이다. 이때 제한사항 중에서 아래와 같은 사항을 알 수 있다. i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현한다는 것은, 모든 배열을 다 탐색할 필요가 없고, n^2 / 2 + n 만큼 탐색을 진행하면 된다. O(n^2)로 O(n^2/2)로 시간 복잡도를 줄일 수 있다. 노드 1개 자체만으로도 네트워크가 될 수 있다. 접근방법 BFS로 진행했다. 이때 1노드와 2노드가 연결되었다고 할 때 탐색을할 때 1노드에서만 진행하고 2노드는 따로 .. 이전 1 2 3 4 ··· 6 다음