본문 바로가기

분류 전체보기

(50)
코루틴 1 보호되어 있는 글입니다.
[Kotlin In Action] 위임 kotlin 위임이 궁금해 책을 따라가며 내용을 정리했다 4.1.2 open, final, abstract 변경자: 기본적으로 final 상속을 위한 설계와 문서를 갖추거나, 그럴 수 없다면 상속을 금지하라 Effective Java_조슈아 블로크 정확한 문서가 없을 경우 하위 클래스에서 기반 클래스 작성자의 의도와 다르게 메소드를 오버라이드하여 사용할 가능성이 있다 이런 상황에서 하위 클래스가 기반 클래스에 대해 가졌던 가정이 기반 클래스의 변경으로 인해 깨져버리는 경우 하위 클래스의 동작이 예기치 않게 바뀌는 Fragile base class(취약한 기반 클래스) 문제가 발생할 수도 있다 final 코틀린에서는 상속의 문제점을 인지하고 기본적으로 모든 클래스와 메소드의 변경자값을 final로 설정했다..
Hilt 사용 배경 이번 프로젝트에 DI를 적용해 보려고 Hilt 라이브러리에 대해 공부하게 되었다. * DI 적용 이유 : 모듈 간 결합도 낮추기 -> 코드 재사용성 증가, 리팩토링 & 테스트 용이 DI를 적용할 수 있는 방법은 여러 가지가 있다. 1) 수동으로 적용, 2) Dagger같은 DI 프레임워크의 도움을 받기 수동으로 적용하면 여러 종속성 흐름들을 개발자가 직접 관리해야 해서 코드가 복잡해진다. 그래서 프레임워크의 힘을 빌리고자 Dagger를 적용하려고 찾아봤더니, google에서 Dagger를 편하게 쓰라고 내준 라이브러리가 있었다. Dagger는 적용 시 학습 곡선이 가파르고 보일러 플레이트 코드도 꽤 발생해서 사용에 불편함이 있었기 때문에 안드로이드용 DI 라이브러리에 대한 수요가 꽤 있었던 것..
연산자 오버로딩 Android UAMP 샘플 코드를 보다가 새로운 표현을 찾았다 private val browseTree: BrowseTree by lazy { BrowseTree(applicationContext, mediaSource) } val children = browseTree[parentMediaId]?.map { item -> MediaItem(item.description, item.flag)} BrowseTree는 단순 클래스인데 어떻게 []를 사용하여 값을 가져올 수 있는 걸까? BrowseTree 쪽으로 가보니 get을 오버 로딩하여 구현하고 있었다. private val mediaIdToChildren = mutableMapOf() operator fun get(mediaId: String) = ..
[Android] Very Long Vector Path issue SVG 를 Vector Drawable로 변환을 했는데 path가 너무 길다는 lint error가 나왔다. 이곳에 들어가서 왼쪽 이미지처럼 precision을 1로 만들어 준 후 이미지를 다운 받는다. svg를 vector drawable로 변환 후에도 lint error가 나온다면, 다음 단계를 진행한다. 터미널로 가서 npm을 통해 avocado를 설치한다. npm install -g avocado 설치가 완료되었다면 avocado file_name.xml -o file_name.xml 성공적으로 됐을 경우 터미널에서 이런 메세지를 볼 수 있다. file_name.xml: Done in 32 ms! 4.792 Kb - 18.6% = 3.902 Kb 참고 “Very Long Vector Path” i..
Vector Asset Android는 매우 다양한 크기의 기기들이 존재하기 때문에 화면 사이즈에 대응하기 위해 mdpi, hdip 등 다양한 dpi resource를 관리해야 했다. 이렇게 하지 않을 경우 확대 시 이미지가 깨지는 현상이 발생할 수도 있는데, 이건 이미지를 나타내는 방식이 Raster 이기 때문이다. Raster 형식 이미지는 특정 해상도에서 정의되어 각 픽셀의 색상 정보만 알고 있기 때문에 확대를 할 경우 누락된 픽셀이 생겨 이미지가 위처럼 깨져 보일 수 있다. 이에 대응하기 위한 방식이 Vector 다. vector는 점과 점을 연결해 수학적 원리로 이미지를 표현하는 방식이기 때문에 크기를 늘리거나 줄여도 이미지에 손상이 없다. 그렇기 때문에 래스터 방식에 비해 기존 dpi 별로 이미지를 가지고 있을 필요..
[Android UI] Drag & Drop Recyclerview -> Recyclerview Drag & Drop 구현하기 화면 구성 Top Recyclerview Bottom Recyclerview 동작 Bottom Recyclerview에 있는 정보를 Drag and Drop을 통해 Top Recyclerview로 전달 들어가기 전 준비물 Recyclerview 두 개 더보기 1. activity.xml 2. recyclerview_item.xml 3. Activity recyclerview 두 개를 생성해준다. item layout은 귀찮으니까 하나로 간다. 간격을 위해 recyclerview LayoutManager에 ItemDecoration을 추가해주었다. Adapter 어댑터 아이템은 간단하게 textView 데이터 설정용 stri..
[스트림 활용] 중간 연산 중간 연산 생성된 스트림을 필터링하거나 원하는 형태로 가공하는 과정 중간 연산은 스트림을 반환하기 때문에 여러 작업을 이어서 호출하는 Chaining이 가능하다. 스트림 필터링 filter 스트림 내 요소들을 특정 조건(predicate)에 맞게 걸러낸 요소만으로 구성된 새로운 스트림 반환 조건에 해당하는 Predicate 를 인자로 받는다. 더보기 매개변수 하나를 입력받아 boolean 타입으로 반환하는 함수형 인터페이스 조건식을 표현하는데 사용된다. List language = Arrays.asList("java", "kotlin", "python", "c", "go"); language.stream().filter(s -> s.contains("o")).forEach(lang -> System.ou..