본문 바로가기

분류 전체보기274

Debounce , Throttle Debounce , Throttle Debonce와 Throttle 은 무슨차이가 있을까요 ? 먼저 Debounce 와 Throttle을 각각 알아보도록 하겠습니다. Debounce debounce 는 이벤트를 그룹화하여 특정시간이 지난 후 마지막 이벤트만을 발생하도록 하는 기술입니다. 위의 마블다이어그램의 상황을 테스트코드로 작성해 보았습니다. debounce 측정시간을 300ms로 잡고 [red] (--300ms-- {red발행} -- 50ms경과--) [yellow](--100ms--) [green] (--200ms--{green발행} -- 150ms--) [blue](--300ms -- {blue발행} -- 50ms) end 이 되게 됩니다. Throttle 이벤트를 일정한 주기마다 발생하도록 하.. 2019. 9. 10.
TestObserver ,TestScheduler 를 이용한 테스트작성하기 TestObserver ,TestSubscriberTestScheduler 를 이용한 테스트작성하기 RxJava2부터 좀 더 간결해진 테스트 바로 TestObserver , TestSubscriber 를 이용한 테스트 작성법에 대하여 알아보도록 하겠습니다. TestObserver TestObsever란 이벤트를 감지하고 연결된 테스트 체인에따라 성공여부를 알려주는 옵저버로 onSubscribe, onNext, onError, onSuccess등을 오버라이드하여 결과값을 테스트하는 용도로 사용할 수 있습니다. TestObserver Assert Method assertSubscribed() 성공적으로 onSubscribe가 호출되었는지 검증합니다. assertNotSubscribed() onSubscrib.. 2019. 9. 10.
RxAndroid Scheduler 자세히 알아보기 RxAndroid Scheduler 자세히 알아보기 RxAndroid에서는 스케쥴러를 통해 어느 쓰레드에서 실행이 될지 결정 할 수 있습니다. 스케쥴러는 subsctibeOn(), observeOn() 에서 각각 지정할 수 있는데 subsctibeOn()은 observable의 작업을 시작하는 쓰레드를 선택 할 수 있습니다. 중복해서 적을 경우 가장 마지막에 적힌 스레드에서 시작합니다. observeOn()은 이후에 나오는 오퍼레이터, subscribe의 스케쥴러를 변경 할 수 있습니다. 위 그림을 보면 SubscribeOn 연산자를 중간에서 지정하고있습니다.연산자 체인 중 아무 곳에서 호출해도 문제되지 않습니다. 즉 , 오퍼레이터 어디서든지 subscribveOn을 사용하면 시작할 스케줄러를 정할 수 .. 2019. 9. 9.
git rebase -i 알아보기 git rebase -i 알아보기 git 을 사용하다 보면 , 이미 커밋한 히스토리를 변경하거나 또는 삭제하거나, 내용을 추가해야하는 상황이 자주 발생합니다. 이때 사용할수 있는 명령이 바로 $git rebase -i 입니다. -i 는 --interactive의 약어로 말 그대로 git rebase 명령어를 대화형으로 실행하겠다는 의미입니다. 위명령어를 실행하면 '수정을 시작할 이전 커밋 ' ~ '현재 커밋(HEAD)' 범위에 있는 모든 커밋들의 리스트가 출력된다. ex) $ git rebase -i HEAD~3을 실행하면 -> HEAD~2 , HEAD~1, HEAD 커밋들이 출력되게 됩니다. 아래는 테스트를 위하여 미리 만들어논 커밋들 입니다. git rebase $ git rebase -i HEAD~.. 2019. 9. 9.
vi 명령어 정리 vi 명령어 정리 vi란 ?? vi라는 이름은 `VIsual display editor'로 각종 문서를 편집할 수 있는 텍스트 기반의 편집기이고 리눅스 뿐만 아니라 유닉스 계열의 모든 운영체제에서 사용하는 편집기입니다. vi의 3가지 모드 입력모드 입력을 원하는 글자를 입력하고 ,화면은 입력한 상태를 그대로 보여주는 모드 명령모드 한 글자 또는 두 글자 명령을 사용하여 커서를 이동하고, 글자를 삭제 및 교체하고 , 문자열을 검색하는 모드 라인모드 콜론(:) 프롬프트에서 명령을 입력하여 저장, 편집, 검색 기능 등 다양한 기능을 제공하는 모드 VI는 자동 저장하는 기능이 없어서 자주 입력 내용을 저장해주어야 합니다 1. 입력모드 * 입력 명령어 - i : 현재 커서 위치에 삽입(커서 위치에 문자를 오른쪽으.. 2019. 9. 9.
AppBundle 알아보기 AppBundle 알아보기 App Bundle이란 ?? 모든 코드 , 리소스 CPU 아키텍처와 메타데이터를 압축한 ZIP파일입니다. App Bundle을 빌드하면 .aab파일이 생성됩니다. 빌드된 aab 파일을 Play Store에 업로드하면 Play Store가 각 기기에 최적화된 APK 를 빌드합니다.(Dynamic Delivery) 즉 앱을 실행하는데 필요한 코드와 리소스만 다운르도하여 사용합니다(Dynamic Delivery) App Bundle 구조 살펴보기 App Bundle은 코드(dex) , 라이브러리(lib) , 리소스(res)..등 모든 데이터가 포함되어있습니다. 개발자가 App Bundle 파일을 PlayStore에 업로드 하면 , PlayStore는 미리 aab파일에서 아키텍처, D.. 2019. 9. 5.
AAC - viewModel AAC(Andorid Architecture Component) - viewModel viewModel알아보기! 안드로이드 아키텍처 컴포넌트 viewModel은 UI관련 데이터를 저장하고 관리하기 위하여 설계되었습니다. 스크린 회전 같은 상태 변화에도 데이터가 보존될 수 있도록 합니다. 안드로이드기기를 회전한다면 안드로이드 생명주기는 위 그림의 왼쪽처럼 화면이 Destroy되고 다시 Create되는 과정을 거치게됩니다. 위같은 회전에대하여 간단한 데이터같은 경우 onSaveInstanceState()메소드를 이용하여 저장하고 다시 onCreate()에서 다시 데이터를 받을 수 있지만, serialize가 가능한 간단한데이터만 가능합니다. bitmap같은 많은양에 데이터는 부적합합니다. 또한 화면회전의 상.. 2019. 9. 2.
Java - Atomic변수 Java - Atomic변수 Atomic변수란 atomic변수는 원자성을 보장하는 변수입니다 . 멀티쓰레드 환경에서 동기화 문제를 synchronized 키워드를 사용하여 , 락을걸곤하는데 이런 키워드 없이 동기화문제를 해결하기 위해 고안된 방법입니다. (일반적으로 동기화문제는 synchronzied, Atomic, volatile 세가지 키워드로 해결합니다) synchronized는 특정 Thead가 해당 블럭 전체를 lock을 하기떄문에 다른 Thread는 아무런 작업을 하지 못하고 기다리는 상황이 될수 있기때문에 , 낭비가 심합니다. 그래서 NonBlocking하면서 동기화 문제를 해결하기 위한 방법이 Atomic입니다. Atomic의 동작 핵심원리는 바로 CAS알고리즘입니다(Compared and.. 2019. 9. 2.
Sealed Class Sealed Class Sealed Class란 ? sealed의 뜻은 봉인이라는 뜻으로 enum 클래스의 확장형태입니다. sealed 클래스는 클래스들을 묶은클래스입니다. Kotlin reference 에서 소개하는 예로 Expr 이라는 sealed 클래스를 보도록 하겟습니다. sealed class Expr{ data class Const(val number: Double) : Expr() data class Sum(val e1: Expr, val e2: Expr) : Expr() object NotANumber : Expr() } 먼저, Sealed 클래스 내부에 작성된 클래스는 Sealed클래스를 상속할수 있습니다. sealed클래스의 작점은 when표현식때문입니다. fun eval(expr: E.. 2019. 9. 2.
Java - Garbage Collection Java - Garbage Collection Garbage Collection 이란 ? 프로그래머는 힙을 사용할 수 있는 만큼 자유롭게 사용하고, 더 이상 사용되지 않는 인스턴스(쓰레기객체)들은 가비지 컬렉션을 담당하는 프로레스가 자동으로 메모리에서 제거하도록 하는 것이 가비지 컬렉션의 기본이다. 프로그램을 실행하다가 메모리가 부족해져 메모리가 더 필요해지는 시점에 실행됩니다. GC와 Reachability Java GC는 객체가 가비지인지 판별하기 위해서 reachability라는 개념을 사용합니다. 어떤 객체에 유효한 참조가 있으면 'reachable'로, 없으면 'unreachable'로 구별하고, unreachable 객체를 가비지로 간주해 GC를 수행하게됩니다. 한 객체는 여러 다른 객체를 참.. 2019. 9. 2.
Java - JVM Java - JVM 자바가상머신 , JVM(Java Virtual Machine)이란 ?? JVM은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다. JVM은 JAVA와 OS사이의 중개자 역할을 하여 , JAVA가 OS에 의존하지않고 실행될수 있게 한다.(플랫폼에독립적) 그리고 JVM은 메모리관리, Garbage Collection을 수행한다. JVM 은 스택 기반의 가상머신이다. (ARM 등은 레지스터기반으로 동작하는데에 반해) 자바 프로그램 실행 과정 프로그램이 실행되면 JVM은 OS로 부터 이 프로그램이 필요로 하는 메모리를 할당 받는다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 자바 컴파일러(javac)가 자바소스(.java)를 읽어들.. 2019. 9. 2.
Java - 메모리관리 ( 스택& 힙) [펌] Java - 메모리관리 ( 스택& 힙) 출처 -> https://yaboong.github.io/java/2018/05/26/java-memory-management/ 자바 메모리 관리 - 스택 & 힙 개요 Java 에서 메모리 관리는 어떻게 이루어지는지 알아보기 위함. Stack 과 Heap 영역 각 역할에 대해 알아본다. 간단한 코드예제와 함께 실제 코드에서 어떻게 Stack 과 Heap 영역이 사용되는지 살펴본다. Wrapper Class 와 Immutable Object 에 대해서도 살짝 알아본다. Garbage Collection 이 무엇인지도 아주 살짝 알아본다. yaboong.github.io Java 의 Stack 과 Heap Java 메모리 영역중 stack 과 heap 영역이 내가 짠 .. 2019. 9. 1.
Primitive vs Reference Primitive vs Reference 자바의 자료형은 Primitive Type(기본형) 과 Reference Type(참조형)으로 나뉩니다. Java Data Type ㄴ Primitive Type ㄴ Boolean Type(boolean) ㄴ Numeric Type ㄴ Integral Type ㄴ Integer Type(short, int, long) ㄴ Floating Point Type(float, double) ㄴ Character Type(char) ㄴ Reference Type ㄴ Class Type ㄴ Interface Type ㄴ Array Type ㄴ Enum Type ㄴ etc. Primitive Type(기본형) 비객체 타입으로 , Null을 가질 수 없는 형태 Type Bits.. 2019. 9. 1.
Java Stream 결과 만들기 Java Stream 결과 만들기 https://beomseok95.tistory.com/216 Java Stream알아보기 Java Stream JavaStream이란 ? Java8 부터 추가된 기능으로 ,"컬렉션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능"입니다. (InputStre.. beomseok95.tistory.com https://beomseok95.tistory.com/217 Java Stream 생성하기 Java Stream 생성하기 1. 생성하기 배열 , 컬렉션, 빈스트림 Stream.builder() , Stream.generate() , Stream.iterate() 기본타입형 , String , 파일스트림.. 2019. 9. 1.
Java Stream 가공하기 Java Stream 가공하기 https://beomseok95.tistory.com/216 Java Stream알아보기 Java Stream JavaStream이란 ? Java8 부터 추가된 기능으로 ,"컬렉션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능"입니다. (InputStre.. beomseok95.tistory.com https://beomseok95.tistory.com/217 Java Stream 생성하기 Java Stream 생성하기 1. 생성하기 배열 , 컬렉션, 빈스트림 Stream.builder() , Stream.generate() , Stream.iterate() 기본타입형 , String , 파일스트림 병.. 2019. 9. 1.
Java Stream 생성하기 Java Stream 생성하기 1. 생성하기 배열 , 컬렉션, 빈스트림 Stream.builder() , Stream.generate() , Stream.iterate() 기본타입형 , String , 파일스트림 병렬스트림, 스트림연결하기 배열스트림 , 컬렉션스트림 생성하기 스트림은 배열 또는 컬렉션 인스턴스를 이용하여 생성할 수 있습니다 . Arrays.stream이나 Collection.stream()메소드를 사용합니다. //array String[] arr = new String[]{"a", "b", "c"}; Stream stream = Arrays.stream(arr); Stream streamOfArrayPart = Arrays.stream(arr, 1, 3); // 1~2 요소 [b,c] /.. 2019. 9. 1.
Java Stream알아보기 Java Stream JavaStream이란 ? Java8 부터 추가된 기능으로 ,"컬렉션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능"입니다. (InputStream, OutputStream같은 I/O Stream이 아닙니다) Java 8 이전에는 배열또는 컬렉션 인스턴스를 다룰때 for 문 ,foreach문을 돌면서 하나씩 꺼내서 다루어야했었습니다. 이런방법은 로직이 복잡해질수록 양이 많아져 힘들게됩니다. 스트림이란 '데이터의흐름'입니다. 배열 또는 컬렉션 인스턴스에 함수 여러개를 조합하여 원하는 결과를 필터링 하고 가공된 결과를 얻을 수 있습니다. 그리고 람다를 이용하여 코드양을 줄이고 간단하게 표현가능합니다. 한마디로 , 함.. 2019. 9. 1.
Fold, Reduce Fold, Reduce kotlin의 fold함수와 reduce함수 무었이 다를까요 ? 한번 알아보도록 하겠습니다! Fold public inline fun Iterable.fold(initial: R, operation: (acc: R, T) -> R): R { var accumulator = initial for (element in this) accumulator = operation(accumulator, element) return accumulator } fold 함수는 누산기의 기능을 합니다. fold함수의 구현을 보면 우선 fold함수는 T타입을 받아서 R타입으로 리턴합니다. 매개변수로는 initial 과 operation이 있습니다 . initial 을 리턴값R을 초기화 하는 값을 받습니.. 2019. 8. 29.
고차함수 (Higher-order-function) ,1급시민[객체,함수] (First-Class Citizen) 고차함수 (Higher-order-function) , fold ,reduce.. 고차함수란 ? 고차함수에 대하여 알아보자 고차함수는 아래의 2가지 조건을 만족하는 함수입니다. 함수를 파라미터로 받는 함수 함수를 리턴하는 함수 1. 함수를 파라미터로 받는 함수 예 class HighOrderFunctionTest { fun simpleHOF(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b) @Test fun highOrderFunctionTest() { val result = simpleHOF({ x, y -> x + y }, 10, 20) Assert.assertEquals(30, result) } } simpleHOF 함수는 Int,Int를 받아서 .. 2019. 8. 29.
Clean Architecture Clean Architecture 좋은코드란 무었을까요? 가독성이 좋은코드 ? 테스트커버리지가 높은코드 ? 여러가지 기준이 있겠지만 그중하나인 유지보수하기쉬운 코드(변화에 잘 대응할 수 있는 코드) 또한 좋은코드의 기준중 하나일 것입니다. 유지보수하기 쉬운코드는 변화에따른 코드변경이 적다는 것일것입니다. 그러기 위해서는 코드가 잘 분리되어있어야 합니다. 그방법중 하나인 Clean Architecture에 대하여 알아보도록 하겠습니다. Clean Architecture 알아보기 Robert Martin이 소개한 CleanArchitecture 다이어그램입니다. 양파모양의 4개의 Layer가 존재합니다. 가장 바깥쪽의 Frameworks & Drivers 가 사용자와 접점에 있는 Presentation이고,.. 2019. 8. 26.
MVP 패턴을 알아보기 MVP 패턴을 알아보기 MVP란?? MVC에서 파생된 디자인 패턴으로 안드로이드에서 주로 사용하고 있습니다. MVP가 나오게 된 이유는, View와 Model을 완전히 분리해서 사용하기 위함입니다. MVP는 Model의 역할인 비지니스 로직을 독립적으로 테스트할 수 있습니다. MVP 패턴의 각 구성에 대해서 자세히 알아보도록 하겠습니다. MVP 패턴정의 MVP는 위에서 말한대로 Model, View ,Presenter의 앞글자를 따서 이름이 지어졌습니다. 이 패턴의 핵심 아이디어는 사용자 인터페이스(view)와 비즈니스로직(model)을 분리하고, 서로간에 상호작용을 다른객체(Presenter)에 위임해 서로의 영향을 최소화 하는 것에 있습니다. Model 내부적으로 쓰이는 데이터를 저장, 처리 비즈니스.. 2019. 8. 19.
Docker 를 이용한 CI 구축 - 6(Google Play Store 연동) Docker 를 이용한 CI 구축 - 6(Google Play Store 연동) 1. 플러그인 설치 jenkins관리-> 플러그인 관리 -> Google Play Android Publisher 설치 2. 구글플레이 콘솔 설정 설정 클릭 API 액세스 클릭 새프로젝트 만들기 클릭 서비스계정 만들기 클릭 1) 구글 API 콘솔로 이동 2)액세스 권한부여 3)비공개 키 (JSON파일 ) 생성 및 다운 3. 젠킨스 프로젝트 설정 1) add를 눌러 credentials을 추가 2)APK file 경로 추가 3)release트렉 선택 (Internal, alpha , beta , production) 설정후에 푸시를해보면 아래와같이 플레이스토어에 올라오는 것을 확인할 수 있습니다. 2019. 8. 14.
Jetpack - LiveData Jetpack - LiveData AAC LiveData란 ?? ( Android Architecture Components) LiveData관찰 가능한 데이터 홀더 클래스입니다. 일반 관찰 가능과 달리 LiveData는 수명주기를 인식하므로 활동, 프래그먼트 또는 서비스와 같은 다른 앱 구성 요소의 수명주기를 존중합니다. 이 인식은 LiveData가 활성 수명주기 상태 인 앱 구성 요소 관찰자 만 업데이트하도록합니다. 즉, LiveCycle을 알고있는 DataType이라고 할 수 있습니다. liveData는 observer pattern입니다.즉 데이터의 변경이 일어났을때 ,그 변경을 받아 처리합니다 . 하지만 liveData는 거기다 수명주기를 알고 있습니다. 그래서 liveData는 수명주기를 존중.. 2019. 8. 13.
Jetpack - Paging Library (1) Jetpack - Paging Library (1) 페이징이란? 페이징은 데이터베이스의 데이터를 일정한 덩어리로 나눠서 제공하는 것을 의미합니다. Android라는 키워드를 입력했을 때, 구글은 약 28억 개에 해당하는 모든 검색 결과를 클라이언트로 내려주는 대신 상위 10개의 결과만을 보여줍니다. 이렇게 함으로써 구글은 사용자에게 원하는 결과를 빠르고 제공할 수 있고, 클라이언트에서는 이를 통해 성능, 메모리, 네트워크 비용을 효과적으로 다룰 수 있습니다. 안드로이드에서는 바로 스크롤을 이용해 데이터를 점진적으로 불러오는 무한 스크롤링 기법으로 사용할 수 있습니다. 개념 정리 PagedList: DataSource로 부터 가져온 불변 데이터 및 페이지에 대한 정보를 들고 있으면서, PagedListAd.. 2019. 8. 13.