전체 글

Android

Android에서 잠금화면 만들어보자

현재 잠금 화면 앱을 개발중에 있습니다. 잠금화면을 구현하기 위해서 필요한 요소들이 어떤게 있는지 얕게 알아보도록하겠습니다. 잠금화면을 만들기 위한 개요는 다음과 같습니다. Launcher Activity부터 하나씩 알아보도록하겠습니다. Launcher Activity Launcher Activity에서는 잠금화면 활성화나, 비밀번호 로직, Permission 체크 등의 기능이 들어갑니다. 잠금화면을 사용할 것 인지 아닌지를 여기서 on off 할 수 있습니다. 또한 Permission check는 잠금화면이 필요한 권한들을 확인합니다. 잠금 화면이 필수적으로 가져야 할 권한은 알림 접근 허용 과 다른 앱 위의 표시 권한입니다. 알림 접근 허용은 Android의 Notification에 접근해서 가져올 ..

CS

동기 & 비동기 , 블로킹 & 넌블로킹

위의 제목에 써있는 단어들은 프로그래밍 할 때 자주 등장하고 사용되는 단어들입니다. 우리는 흔히 Blocking == Synchronous(동기) Non-Blocking == Asynchronous(비동기) 와 같이 같다고 생각하시는 분들도 있을 것이라 생각합니다. 위의 개념들은 서로 다른 관점들을 가지고 있습니다. 동기와 비동기는 호출되는 함수의 작업 완료 여부를 누가 신경쓰는가에 관점이 있습니다. - 호출하는 함수일까? - 호출되는 함수일까? 블로킹과 넌블로킹은 호출되는 함수가 바로 반환을 하는가에 관점이 있습니다. 서로의 관점이 다르기 때문에 이 4가지 개념은 서로 조합이 되어서 사용될 수 있습니다. 동기 & 비동기 함수 A가 함수 B를 호출했다고 가정하겠습니다. 동기 동기는 함수 A( 호출하는 함..

Android

Notification을 수신해보자!

이번 사이드 프로젝트로 잠금화면 앱을 만들어보면서, 알림을 잠금화면에 띄우는 기능을 만들어야했습니다. 안드로이드에서는 어떻게 알림을 가져올 수 있을까요? NotificationListenerService 다행히 알림이 왔을때 시스템에서 호출받을 수 있는 서비스클래스가 존재합니다. 바로 NotificationListenerService입니다. NotificationListenerService는 Service를 상속하고 있어서 사용을 위해서 Mainfest.xml에 등록해주는 과정이 필요합니다. 위와 같이 Mainfest.xml에서 service를 등록하고 intent-filter에 NotificationListenerService를 포함합니다. 또한 BIND_NOTIFICATION_LISTENER_SERV..

CS

TCP & UDP

TCP와 UDP 모두 OSI 7계층 중에서 전송계층에서 사용되는 통신 규약입니다. 먼저 전송 계층이 어떤 역할을 하는지 알아보겠습니다. 전송계층 송신자와 수신자를 연결하는 통신 서비스를 제공하는 계층입니다. 전송 계층은 다음과 같은 기능을 합니다. - 오류 제어 - 흐름 제어 - 혼잡 제어 - 데이터 순서화 - 분할과 병합 오류 제어 데이터의 변형이나, 데이터 분실 시 재전송 기능으로 복구를 진행합니다. 흐름 제어 송신자와 수신자의 전송과정에서 속도 차이를 제어해주는 기능을 합니다. 혼잡 제어 네트워크 상태에 따라 전송률을 제어합니다. 분할과 병합 데이터 크기가 전송계층에서 처리할 크기보다 큰 경우 분할하고, 수신한 데이터를 원래 크기로 모으는 기능을 합니다. #전송계층이 없는경우? 데이터의 순차 전송을..

Android

LiveData를 뜯어보자

LiveData는 Android Jetpack에 포함되어 있는 라이브러리 이며, 관찰 가능한 데이터 홀더 클래스입니다. 관찰 가능한 일반 클래스와 달리 LiveData는 수명주기를 인식하는 특징을 가지고 있습니다. 지금부터 어떻게 LiveData가 값의 변경을 반영하고 수명주기를 인식할 수 있는지 확인해보려고합니다. 일단 LiveData의 사용법부터 시작하도록 하겠습니다. LiveData 사용법 1. 처음으로 특정 타입의 데이터를 보유할 LiveData의 인스턴스를 생성합니다. class NameViewModel : ViewModel(){ private val _currentName : MutableLiveData = MutableLiveData("") val currentName : LiveData =..

Android

Coroutine이 무엇일까요?

Coroutine Coroutine은 "Co" + "Routine"으로 해석할 수 있습니다. "Co"는 "Cooperative"에서 왔고 Cooperative은 협력이라는 뜻을 가지고 있습니다. 그렇다면 "Routine"은 무엇일까요? 중괄호 상의 코드 뭉치를 의미하는데, 이 코드 뭉치를 함수나 메서드들로도 나타낼 수 있습니다. 쉽게 이해를 하기 위해서 루틴은 함수와 비슷하다라고 생각하겠습니다. 두개의 단어를 이어보자면, 협력적인 함수이라고 할 수 있겠네요? "협력적이다"라는 것이 바로는 이해가 되지 않습니다. 협력적이라는 것이 무엇을 뜻하는 걸까요? 위키에서 따온 코루틴의 정의를 보면 다음과 같습니다. 코루틴은 실행을 일시 중단하고 재개할 수 있도록 하여 비선점형 멀티태스킹을 위한 서브루틴을 일반화하는..

Compose

Jetpack Compose GapBuffer

컴포즈는 Composition을 통해서 @Composable function들이 node로 변환이 되고, 트리에 등록되는 과정을 통해서 UI를 그려나가게 됩니다. 이 과정을 위해서 Compose에서는 GapBuffer라는 자료구조를 사용합니다. GapBuffer Gap buffer는 현재 편집중인 텍스트를 효율적으로 편집하고 저장하는데 주로 사용되는 자료구조입니다. Compose에서는 Gap Buffer를 사용한 구조를 Slot Table이라고 부르고 있습니다. 배열과 비슷하지만 여러 변경 사항을 처리하기 위해서 cursor 와 gap이 존재합니다. Composable 계층을 실행함에 따라 이 데이터 구조를 호출할 수 있고, 항목을 입력할 수 있습니다. 커서가 있는 곳이 현재 계층에서 실행되고 있는 지점..

Compose

Jetpack Compose의 최적화

Jetpack compose의 최적화 Mashup 12기 프로젝트를 진행하면서, 앱 배포 이후 유지보수 기간을 가지게 되었습니다. 앱을 동작시키면서 Layout Inspector로 recomposition count를 통해 recomposition이 많이 일어나는 부분이 없는지 찾아보면서 유지보수를 진행하고 있는데요~ 자연스럽게 Jetpack compose의 최적화에 대해서 관심이 생기게되었습다. 일단 글에 들어가기 앞서 recomposition이 무엇인지 언제 일어나는지 파악할 필요가 있습니다. recomposition recomposition(재구성)은 입력이 변경될 때, 구성 가능한 함수를 다시 호출하는 프로세스입니다. 이것은 함수의 입력이 변경될 때 발생합니다. Compose가 새 입력을 기반으로..

KimDaQ
DaQ