본문 바로가기

전체 글

(20)
[Kotlin] lateinit와 by lazy 비교 kotlin에서 lateinit과 by lazy 둘 다 변수를 늦게 초기화 할 때 사용하는 방법이다. 그렇다면 늦게 초기화하는 것은 무엇이고, 둘의 차이점은 무엇일까? 코틀린은 변수 선언할 때 객체를 바로 할당하지 않는 경우 컴파일이 되지 않는다. 그래서 변수 선언시 값을 초기화 하지 않거나, nullable 타입으로 만들어주지 않으면 컴파일 에러가 발생한다. 또한 nullable 타입으로 선언해도 코틀린에선 null 초기화 사용을 추천하지 않는다. 하지만 개발을 하다보면 변수 선언 시 초기값이나 상태를 정의 하기 어려운 경우가 있다. 즉 변수에 객체를 할당 하는 것을 선언과 동시에 할 수 없을 경우, 변수만 일단 선언하고 나중에 값을 사용할 때 값을 입력해주는 늦은 초기화 / 초기화를 지연, latei..
[Android Jetpack] 앱 속 DB, Room 우리는 네트워크 연결이 없을 때에도 데이터를 불러온 경험이 있을 것이다. (카카오톡 채팅 화면) 이 때는 서버에서 데이터를 불러오는 것이 아니라 로컬 DB에 저장해두고 불러오는 경우다. 상당한 양의 구조화된 데이터를 처리하는 앱은 데이터를 로컬에 유지하여 매우 큰 이익을 얻을 수 있다. 가장 일반적인 사용 사례는 기기가 네트워크에 액세스할 수 없을 때도 사용자가 오프라인 상태로 계속 콘텐츠를 탐색할 수 있도록 관련 데이터를 캐시하는 것이다. 원래는 SQLite를 활용해 어플리케이션 내부 저장소를 만들어 저장했었다. 그러나 SQLite를 사용할 때에는 다음과 같은 불편함이 있었다. Query의 유효성 검사 기능을 제공하지 못했던 점 Scheme가 바뀔 떄 자동적으로 업데이트를 하지 못했던 점 ORM 지원이..
[Kotlin] 코루틴(coroutine)(2) - 코루틴 사용 방법 이번 포스팅에서는 코루틴 사용 방법에 대해 알아보자. CouroutineContext : 코루틴 처리를 어떻게 할 것인지에 대한 요소들의 집합 CouroutineContext 요소 Dispatcher : 코루틴을 처리한 스레드를 setting하고 할당하는 역할 Job : 생성된 코루틴을 컨트롤 (생명주기, 상속관계 정리 및 관리) Coroutine Dispatcher 코루틴을 스레드에 배분하는 역할 코루틴을 시작하거나 재개할 스레드를 결정하기 위해 사용 스레드 풀에서 스레드를 하나 할당해 코루틴을 배당 코루틴은 스레트풀을 생성하지만 직접 제어하지는 않고 오직 Dispatcher을 통해서만 제어 가능 코루틴 디스패처는 CoroutineDispatcher 인터페이스를 구현해야 함 Dispatcher 종류 D..
[Kotlin] 코루틴(coroutine)(1) - 코루틴 무엇인가 이번 포스팅에서는 클라이언트가 네트워크 통신을 하는데 비동기 처리를 하기 위해 주로 사용되는 코루틴에 대해서 알아보자. 동기와 비동기 (sync vs async) 동기 (Synchronous : 동시적으로 발생하는) 작업을 수행하고 그 작업이 완료될 때까지 다른 작업을 하지 못하고 기다리는 방식이다. 이렇게 동기적으로 프로그램이 돌아가면 먼저 들어온 요청에 의한 로직이 돌고 있는 동안은 다른 작업은 대기하는, 즉 block 상태가 된다. 비동기 (Asynchronous : 동시에 일어나지 않는) 동기는 의식의 흐름대로 코드를 작성할 수 있어 구현하기는 쉽지만, 특정 요청에 의한 코드 블록이 실행되는 동안 다른 코드는 대기를 하는 block 상태에 빠지는 단점이 있다. 비동기 방식은 어떤 작업을 수행하지만..
[DesignPattern] 의존성 주입(Dependency Injection) 왜 필요한가 최근 프로젝트를 진행하면서 처음으로 hilt를 사용하여 의존성 주입을 사용하여 보았다. 의존성 주입의 필요성에 대해 자세히 알아보고자한다. 의존성 주입(Dependency Injection)이란 의존성 주입은 필요한 객체를 직접 생성하거나 찾지 않고 외부에서 넣어 주는 방식이다. 의존성 주입 그 자체는 클래스간 의존성을 외부에서 주입하는 것을 뜻하지만 일반적으로 우리가 사용하는 의존성 주입은 클래스에 대한 의존성의 인터페이스화를 통한 코드 유연성 증대 & 클래스의 인스턴스를 외부에서 생성하여 주입을 동시에 하는 방향으로 진행된다. 그렇다면 의존성이란 무엇일까? 의존성이란 객체 지향 프로그래밍에서 클래스간에 의존성이 있다는 것은 클래스간에 의존 관계가 있다는 것을 의미한다. 즉, 클래스 간에 의존 관계가 ..
[DesignPattern] 아키텍처 패턴과 디자인 패턴 (+MVVM은 어디에 해당하는가) 안드로이드에서 MVVM패턴이 아키텍처 패턴이라고 알고 있었는데 MVVM이 디자인 패턴에 기입되어져 있는 책을 발견하고 혼동을 겪게 되었다. 그래서 생각해보니 내가 아키텍쳐 패턴과 디자인 패턴의 차이에 대해 잘 알고 있지 못한 것을 느끼게 되었고 이 포스팅을 통해 제대로 알고자 한다. 아키텍처 패턴 아키텍처 패턴(architectural pattern)은 주어진 문맥 안에서 소프트웨어 아키텍처의 공통적인 발생 문제에 대한 일반적인, 재사용 가능한 해결책을 의미한다. 아키텍처 패턴은 소프트웨어 디자인 패턴과 비슷하지만 더 넓은 범위에 속한다. 아키텍처 패턴은 소프트웨어 공학의 다양한 문제를 해결하는데, 예를 들어 컴퓨터 하드웨어 성능 제한, 비즈니스 위험의 최소화와 고가용성을 들 수 있다. 일부 아키텍처 패..
[Kotlin] 익명객체와 옵저버 패턴 이번 시간에는 안드로이드에서 리스너에 해당하는 옵저버 패턴에 대해 알아보고자 한다. 필자는 리스너를 정말 많이 사용했지만 이것이 옵저버 패턴인지 모르고 사용해왔었다. 그래서 이번 포스팅을 통해 자세히 알아보고자 한다. 옵저버 : 이벤트가 일어나는 것을 감시하는 감시자 역할 안드로이드에서는 키의 입력, 터치의 발생, 데이터의 수신등 함수로 직접 요청하지 않았지만 시스템 또는 루틴에 의해 발생하게 되는 동작들을 이벤트라고 부른다. 이 이벤트가 발생할 때마다 즉각적으로 처리할 수 있도록 만드는 프로그래밍 패턴을 옵저버 패턴이라고 부른다. 옵저버 패턴을 구현할 때는 두 개의 클래스가 필요하다. -> 이벤트를 수신할 클래스 A / 이벤트의 발생 및 전달을 할 클래스 B 이 두개의 클래스는 어떻게 통신을 할까? -..
[Android] View Binding 필자는 예전에 데이터 바인딩과 뷰바인딩을 혼동한 적이 있었다. 그래서 이번 포스팅은 뷰바인딩에 대해 공부하고자 한다. View Binding View Binding은 뷰와 상호작용하는 코드를 쉽게 작성할 수 있도록 만들어 주는 기능이다. 모듈에서 View Binding을 사용하도록 설정하면 모듈에 있는 XML 레이아웃 파일들의 바인딩 클래스가 생성된다. 이 바인딩 클래스의 인스턴스에는 해당 레이아웃에서 ID를 가지고 있는 모든 뷰와 루트 뷰의 직접 참조가 포함되어 있다. 그래서 대부분의 경우 View Binding은 findViewById를 대체할 수 있다. 모듈에서 View Binding 사용 설정 View Binding은 모듈 단위로 사용 설정되며, build.gradle 파일에 View Bindin..