본문 바로가기

android

(47)
Repository Pattern 이해하기 Repository Pattern? Repository(리포지토리) 패턴은 디자인 패턴 중 하나로, 데이터가 있는 여러 저장소(Local, Remote)를 추상화하여 중앙 집중처리 방식을 구성하고, 데이터를 사용하는 로직을 분리시키기 위한 디자인 패턴입니다. ViewModel은 필요한 데이터를 Repository에 요청하고 Repository는 적절한 저장소에서 요청받은 데이터를 가져옵니다. Repository가 추상화되어 있기 때문에 ViewModel은 언제나 같은 인터페이스로 데이터를 요청할 수 있으며, 실제로 어떤 데이터를 사용하는지 전혀 알 필요가 없기 때문에 앱 환경에 맞는 적절한 데이터를 사용하기에 편리합니다. 왜 쓰는가? - 데이터 로직을 분리시킬 수 있습니다. - 중앙 집중처리 방식으로, ..
코틀린(Kotlin) - 컬렉션 API : filter, map, all, any, count, find, groupBy, flatMap, flatten 람다 함수형 프로그래밍은 컬렉션(Collection)을 다룰 때 상당히 편리하고 막강합니다. 대부분의 작업에 라이브러리 함수를 활용할 수 있고, 그로 인해 코드를 아주 간결하게 만들 수 있습니다. 그러므로 이번에는, 컬렉션을 다루는 코틀린 표준 라이브러리들을 살펴보도록 하겠습니다. 참고로, 코틀린에서 제공하는 컬렉션 API는 새롭게 추가된 것이 아닌, 기존의 java, C#, 그루비, 스칼라 등 람다를 지원하는 대부분의 언어에서 사용하는 것들과 동일합니다. 필수적인 함수 : filter, map filter와 map은 컬렉션을 활용할 때 기반이 되는 함수로, 대부분의 컬렉션 연산을 이 두 함수를 통해 표현할 수 있습니다. filter filter 함수는 컬렉션을 iteration 하면서 주어진 람다에 각..
AAC ViewModel 생성자 파라미터 넘기기, Cannot create an instance of class ViewModel 해결 방법 문제 발생 Caused by: java.lang.RuntimeException: Cannot create an instance of class ...ViewModel AAC Lifecycle ViewModel에서 context를 사용하기 위해, context를 사용할 수 있는 AndroidViewModel을 확장하고 빌드하였더니 위와 같은 에러가 발생하였습니다. 에러 내용을 보면 알 수 있듯이, ViewModel 인스턴스를 생성하지 못하여 에러가 발생했습니다. 저의 에러코드는 아래와 같았습니다. /** View Layer */ class MyActivity : AppCompatActivity() { ... private val viewModel by lazy { ViewModelProvider(this)..
코틀린(Kotlin) - 초간단 파일 저장 방법! fun saveFile(inputStream: InputStream, filePath: String) { //저장할 파일 val saveFile = File(filePath) saveFile.outputStream().use { fileOutput -> inputStream.copyTo(fileOutput) } } 기존에 루프(Loop)를 돌면서 버퍼를 읽는 방식 대신, 코틀린에서 지원하는 copyTo() 기능으로 아주 간편하게 바이트를 복사할 수 있고, use() 함수가 I/O resource를 자동으로 관리해주기 때문에, 초간단하게 파일 저장 코드를 구현할 수가 있습니다! 확장 함수를 이용해서, 더 멋지게 만들기! 코틀린에는 마치 기존 클래스에 구현된 기능인 것처럼 추가적인 함수를 커스텀하여 사용할 ..
코틀린(Kotlin) - 람다 식과 멤버 참조 코틀린의 람다는 자바8의 람다식과 개념이 매우 비슷합니다. 람다를 쉽게 설명하자면, 값처럼 여기저기 전달할 수 있는 동작의 모음(?)이라고 할 수 있습니다. 기본적으로 람다식은 자바8부터 사용이 가능하고, 안드로이드에서 제대로 된 Functional Interface를 사용하려면 N(Nougat 7.0) OS 이상이어야만 합니다. 하지만, 코틀린에서는 이런 제한과 상관없이 람다식을 사용할 수 있다는게 큰 장점이지 아닐까 싶습니다. 추가로, 람다식은 기본적으로 편리한 Lambda API들을 제공하기 때문에, 안드로이드 스튜디오에서 개발할 때 자동완성 기능을 이용해서 먼저 해당 API를 살펴본다면, 훨씬 더 간결하고 직관적인 코드를 짤 수 있을 것 같습니다. 람다 소개 : 코드 블록을 함수 인자로 넘기기 "..
Cannot fit requested classes in a single dex file. 해결 방법 문제 발생 Error:Cannot fit requested classes in a single dex file... 이 오류는, 앱 내에서 참조될 수 있는 메소드의 총 개수가 65,536(64K)개를 초과해서 발생하는 오류로, '64K 참조 제한' 이라고 합니다. 앱이 참조하는 라이브러리에서 메소드가 64K를 초과하면, 빌드 제한에 도달했음을 알리는, 위의 빌드 오류 메시지가 발생하게 되는 것입니다. 이러한 제한을 해결하기 위해서는, multidex 지원 라이브러리를 구성하여 해결할 수 있습니다. 문제 해결 minSdkVersion 21 이상인 경우 minSdkVersion이 21 이상인 경우에는 multidex가 기본적으로 사용 설정되므로 추가적인 작업이 필요하지 않습니다. minSdkVersion 2..
코틀린(Kotlin) - object 키워드 : 싱글톤, static 멤버, 객체 식 선언 코틀린에서는 "object" 키워드를 다양한 상황에서 사용하지만 그 상황마다의 공통점이, 클래스를 정의하면서 동시에 인스턴스(객체)를 생성한다는 점입니다. 이러한 object 키워드를 사용하는 여러 상황을 살펴보도록 하겠습니다. 객체 선언 : 싱글톤 쉽게 만들기 (object) 객체지향 프로그래밍을 설계하다 보면, 인스턴스가 하나만 필요한 클래스의 유용한 경우가 많습니다. 자바에서는 다음과 같이, 보통 클래스의 생성자를 private으로 선언하고, static 변수에 클래스 객체를 저장하는 패턴으로 구현합니다. /** 자바에서의 일반적인 싱글톤 패턴 */ public class DataRepository { private static DataRepository INSTANCE; private DataRe..
Databinding 사용 시, 경우에 따라 View 바인딩 하는 방법 Databinding 라이브러리 사용 시, 사용되는 경우(Activity, Fragment, Adapter, CustomView...)에 따라 xml 레이아웃을 바인딩하는 방법에 차이가 있어서 간단히 정리해보았습니다. 모든 내용은, Android developers 래퍼런스의 Generated binding classes 가이드를 참고하였습니다. Activity override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = DataBindingUtil.setContentView(this, layoutId) } Fragment, Adapter val binding = ListItemBin..