본문 바로가기

Language/Kotlin

(18)
[Android] Fragment에서 데이터를 전달하는 3가지 방법. 최근 Single Activity Architecture (SAA)에 대해서 다시 한번 확인해보다, 해당 샘플 예제에서는 데이터를 전달하는 것에 대해서는 신경을 쓰지 않고 구현했다는 것을 알게 되었다. 기본적인 샘플이라 사용하는 방법에 대해서만 작성해 보았었는데, 이번에는 Fragment에서 데이터를 전달하는 3가지 방법에 대한 기본적인 방법에 대하여 글을 작성해보고자 한다. 해당 글에는 이전에 만들어두었던 SAA-Modular 예제를 사용하도록 하겠다. Fragment에서 데이터를 전달하는 방법은 크게 3가지가 존재한다. Bundle을 사용한다. ViewModel을 사용한다. Safe-args를 사용한다. 이 3가지 방법을 사용하여 간단하게 데이터를 전달해보도록 하겠다. 처음으로, Bundle을 사용하..
[Android] Coroutine Flow를 사용하여 API를 호출해보자. DataStore를 사용하면서 Flow를 처음 적용해 보았는데, Flow를 조금 더 많은 범위에서 사용해보고자 한다. 하나의 게시글에 Flow에 대한 정리를 하는 것이 아니라, 하나의 작업을 진행할 때 정리가 필요하다 싶은 것들을 골라 글을 작성해볼 예정이다. DataStore다음으로 Flow를 적용해볼 법 한 부분을 찾아보았을 때, 아무래 통신 부분인 API 호출 부분이 아닐까 싶어서 적용해 보았다. 우선, Flow가 무엇인지 간단하게 설명하고 진행하도록 하겠다. Flow란, Coroutine을 기반으로 빌드되며, 비동기식으로 계산할 수 있는 데이터 스트림의 개념. 이라고 한다. 간단히 말하자면, 코루틴 상에서 리액티브 프로그래밍을 지원하기 위해 만들어진 것이라고 생각할 수 있다. 뭐, 흔히 알고 있는..
[Kotlin] 10장. 코루틴과 동시성 프로그래밍 코루틴? 하나의 개별적인 작업을 루틴(routine)이라고 부르는데 코루틴이란 여러 개의 루틴들이 협력(co)한다는 의미로 만들어진 합성어. 프로세스와 스레드 하나의 프로그램이 실행되면 프로세스가 시작되는데 프로세스는 실행되는 메모리, 스택, 열린 파일 등을 모두 포함하기 때문에 프로세스 간 문맥 교환을 할때 많은 비용이 든다. 반면, 스레드는 자신의 스택만 독립적으로 가지고 나머지는 스레드끼리 공유하므로 문맥 교환 비용이 낮아 프로그래밍에서 많이 사용된다. 스레드 스레드 루틴을 만드려면 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현하여 사용한다. 이런식으로 사용이 가능하며, 익명 클래스를 사용하면 다음과 같이 사용이 가능하다. 스레드 풀 사용하기 몇 개의 스레드를 먼저 만들어 놓고 ..
[Kotlin] 9장. 표준 함수와 파일 입출력 람다식 람다식은 항상 중괄호로 묶여 있으며 중괄호 안에 매개변수는 화살표 왼쪽에 배치, 오른쪽에는 그에 따른 식을 구현한다. val 변수 이름: 자료형 선언 = { 매개변수[,...] -> 람다식 본문 } sum은 익명 함수로 만들어지며, 람다식의 x + y 값이 반환 된다. 여기서 x, y의 값은 고정된 것이 아닌 사용자가 마음대로 선언이 가능하다. 하지만, 매개변수가 1개인 경우 매개변수를 사용하여 표현할 수 있지만 매개변수를 생략하고 it으로 표기할 수 있다. 이 때, it 은 고정된 변수 이름이므로 변경해선 안된다. 클로저 람다식으로 표현된 내부 함수에서 외부 범위에 선언된 변수에 접근할 수 있는 개념을 말한다. 이 때, 람다식 안에 있는 외부 변수는 값을 유지하기 위해 람다식이 포획한 변수라고 ..
[Kotlin] 9장. 컬렉션 컬렉션 컬렉션의 종류로는 List, Set, Map 등이 있으며 자바와는 다르게 불변형(immutable)과 가변형(mutable)으로 나뉜다. List : 불변형 listOf , 가변형 mutableListOf, arrayListOf Set : 불변형 setOf , 가변형 mutableSetOf, hashSetOf, linkedSetOf, sortedSetOf Map : 불변형 mapOf , 가변형 mutableMapOf, hashMapOf, linkedMapOf, sortedMapOf 변수 선언시에 불변형인 val의 사용을 권장하듯이 컬렉션도 되도록이면 읽기 전용인 불변형으로 사용하는 것을 권장. List 불변형 List 값을 변경할 수 없는 불변형 List를 만드려면 헬퍼 함수인 listOf()를 ..
[Kotlin] 8장. 제네릭과 배열 2 - 배열 배열 기본적인 배열 표현 배열을 생성하기 위해서는 arrayOf() 나 Array() 생성자를 사용하면 되고, 빈 상태의 배열을 지정하는 경우 arrayOfNulls()를 사용하면 된다. 다차원 배열의 경우 arrayOf안에 다시 arrayOf로 배열을 선언하면 다차원 배열을 만들 수 있다. val arr = arrayOf(arrayOf(1,2,3), arrayOf(4,5,6), arrayOf(7,8,9)) for (e1 in arr) { for (e2 in e1) { println(e2) } println() } 과 같이 2차원 배열을 선언하고, for문을 사용해 각 값을 출력할 수 있다. 특정 자료형으로 제한하지 않는다면 여러가지 자료형을 혼합할 수 있다. val mixArr = arrayOf(1, ..
[Kotlin] 8장. 제네릭과 배열 1 - 제네릭 제네릭 제네릭은 클래스 내부에서 사용할 자료형을 나중에 인스턴스를 생성할 때 확정한다. 객체의 자료형을 컴파일할 때 체크하기 때문에 객체 자료형의 안정성을 높이고 형 변환의 번거로움이 줄어든다. 제네릭의 일반적인 사용법 앵글 브래킷() 사이에 형식 매개변수를 넣어 선언하며, 형식 매개변수는 하나 이상 지정할 수 없다. box3,4 처럼 생성자에서 유추될 수 있는 자료형이 있다면 선언된 자료형을 생략하고 호출이 가능하다. null 제어 제네릭은 기본적으로 null이 가능한 형태로 선언된다. 자료형에 ?를 붙여서 선언하게 되면 해당 값은 null이 들어갈 수 있다는 표시이다. 따라서 obj 객체에는 null 값이 들어가면 에러로 처리되지만, obj2 객체는 null 값이 들어가도 정상적으로 동작한다. nul..
[Kotlin] 7장. 다양한 클래스와 인터페이스 2 - 데이터 클래스와 연산자 오버로딩 DTO DTO는 Data Transfer Object로 데이터 전달을 위한 객체이다. JAVA에서는 POJO(Plain Old Java Object)라고 부르기도 하였다. DTO는 다음과 같은 특성을 가지고 있다. 구현 로직을 가지고 있지 않다. 순수한 데이터 객체를 표현하기 때문에 보통 속성과 게터/세터를 가진다. toString(), equals() 등과 같은 데이터를 표현하거나 비교하는 메서드를 가져야 한다. 하지만, Kotlin에서 DTO를 위해 데이터 클래스를 정의할 때, 게터/세터, toString(), equals()와 같은 메서드는 직접 만들 필요 없이 내부에서 자동적으로 생성된다. 자동으로 생성되는는 메서드는 다음과 같다. 프로퍼티를 위한 게터/세터 비교를 위한 equals() 키 사용을..