본문 바로가기

프로그래밍 언어

(13)
Garbage Collector (GC) 코딩을 하다보면 수 많은 함수 내에서 여러가지 변수와 객체들을 선언 및 생성하여 사용한다.fun main(){ val obj = Something()}class Something{}Java의 객체는 JVM 가상 메모리 영역 중 Heap 영역에 저장이 된다.서버 또는 애플리케이션 등 실행 과정에 있어 수 많은 객체들을 사용하게 되는데 사용 후 더 이상 사용하지 않는, 참조되지 않는 객체들은 메모리 누수(Memory Leak)를 방지하기 위해 개발자가 직접 메모리에서 회수해야 한다.하지만 모든 사람은 실수를 하듯, 모든 객체를 완벽하게 관리하기란 불가능에 가깝다.Java에는 사용하지 않는 객체를 자동으로 메모리에서 회수해주는 Garbage Collector가 존재한다. JVM 메모리다음과 같은 코드를 ..
Flow 중간 연산자 흐름 제어1. debouncedebound 연산자는 데이터 발행 후 설정한 ms 내에 추가적인 데이터가 발행되는 경우, 기존의 데이터는 무시되고 새로 발행된 데이터를 기준으로 다시 ms를 측정하여 추가 데이터가 발행되지 않는 경우 해당 데이터를 수집한다.데이터 1번 발행 후 250ms 내에 데이터 2번 발행1번 데이터는 무시, 2번 데이터 발행 후 250ms 내에 3번 데이터 발행2번 데이터 또한 무시3번 데이터 발행 이후 250ms 내에 추가적인 데이터 발행이 없었으므로 3번 데이터 수집 2. samplesample 연산자는 설정 시간 간격 내에서 발행 데이터의 최신 값을 수집한다.변환 1. filterfilter 조건에 부합하는 데이터만 추출한다.val flowData: Flow = flow { ..
Flow Builder 1. flow내부에서 emit을 통해 동적 데이터를 발행할 수 있다.fun flowBuilder() = flow { var number = 0 while(true){ delay(1000) emit(number++) }}2. asFlowList와 같은 데이터 컬렉션을 Flow로 변환해준다.val list = listOf(1,2,3,4,5)val flow: Flow = list.asFlow() 3. flowOf정적인 Flow 데이터 흐름을 생성할 수 있다.val flow: Flow = flowOf(1,2,3,4,5)
Coroutine Flow Flow는 데이터 스트림의 일종으로 Coroutine 기반으로 데이터를 수집하는 기능이다. Producer: Flow Builder를 통해 데이터를 생산Intermediary: 생산 된 데이터를 중간에서 가공하는 역할 (선택)Consumer: 데이터가 넘어올 때마다 수집Flow의 특징1. Flow는 데이터 요청 시점부터 발행 시작fun main() { val scope = CoroutineScope(Dispatchers.IO) val flow = flow { var number = 0 while (true) { delay(1000L) emit(number++) } } scope.launch { ..
Channel 채널은 코루틴에서 지원하는 데이터 스트림 구조를 갖고 있는 일종의 자료구조이다.val cahnnel = Channel() 채널에서는 데이터를 전송 및 수신 할 수 있다.channel.send(data)val receiveData = channel.receive() 이렇게만 보면 Queue와 다른점을 찾기 어려워보이지만 채널의 큰 특징에는 일시정지(Suspend)가 있다. Suspendval channel = Channel()CoroutineScope(Dispatchers.IO).launch { for(i in 1..5){ channel.send(i) println("$i send!") } println("send Done!") channel.close()}r..
[Kotlin] Scope Function kotlin Scope Function에는 apply, also, with, run, let 총 5가지의 Function이 있다. 자기 자신의 객체를 반환하는 함수1. applyinline fun T.apply(block: T.() -> Unit): Tapply는 객체의 프로퍼티(속성)을 정의할 때 사용한다. val product: Product = Product().apply { // this id = 1 name = "컴퓨터" price = 1000000 category = Category.ELECTRONICS}data class Product( var id: Int = 0, var name: String = "", var price: Int = 0, va..
runCatching 예외 처리 runCatching은 Kotlin에서 제공하는 예외처리 함수로 성공, 실패에 따른 결과를 Result 객체로 변환하여 반환한다.inline fun runCatching(block: () -> R): Resultinline fun T.runCatching(block: T.() -> R): Result Result 생성runCatching 내부적으로도 try-catch문을 사용하여 작업의 성공, 실패 여부를 통해 Result 객체의 value 를 설정한다.@InlineOnly@SinceKotlin("1.3")public inline fun runCatching(block: () -> R): Result { return try { Result.success(block()) } c..
[Kotlin] 정렬 1. sort() 와 sorted()sort() 는 Mutable 상태에 사용하는 메서드이다.sorted()는 Immutable 상태에 사용한다.List는 Immutable 상태이므로 List에 sort()를 사용하면 오류가 발생한다.반대로 Mutable한 Array에 sorted를 사용하면 문제 없이 정렬이 수행된다. 다만, sort()는 기존에 있던 배열 또는 ArrayList에 정렬을 수행시켜주지만sorted()는 정렬된 배열 또는 리스트를 반환한다.val array = arrayOf(4, 3, 2, 1)array.sort()// array : [1, 2, 3, 4]val array2 = arrayOf(4, 3, 2, 1)val newArray2 = array2.sorted()// array2 : ..
추상 클래스 우리가 기존에 사용하던 클래스의 구조는 다음과 같다. class A { private val a = 0 public fun method(){...} } 당연히 A 클래스에 대한 객체를 생성할 수 있고, 객체에 대한 메서드 또한 문제 없이 사용할 수 있다. 추상 클래스는? 반면 추상 클래스의 구조는 다음과 같다. 필드 일반 메서드 추상 메서드 abstract class A { // 필드 lateinit var name: String val age = 20 fun normalMethod(){...} // 일반 메서드 abstract fun method() // 추상 메서드 abstract fun method2(){...} // 오류 발생 } A를 추상 클래스, method 함수를 추상 메서드라고 한다. 추상..
[Kotlin] 배열과 리스트 복사 코딩을 하다보면 배열 또는 리스트를 복사해야할 일이 생긴다. 기존의 배열은 그대로 두고 새로운 배열을 만들어 데이터 변경을 해야하기 때문이다. 복사에는 두 가지 복사가 있다. 1. 얕은 복사 2. 깊은 복사 얕은 복사 얕은 복사란 주소값이 복사된 것을 말한다. 쉽게 말하자면 변수명만 다르고 내용물은 같은 경우이다. val list = Array(3, {0}) // [0, 0, 0] val list2 = list 위와 같은 경우 list2의 값을 변경하면 list도 같이 변한다. val list = Array(3, {0}) // [0, 0, 0] val list2 = list list2[0] = 1 println(list[0]) // 1 이는 ArrayList, List 모두 같다. 우리가 알고 싶은건 깊..