일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- decorator 패턴
- 마이크로서비스
- Kotlin
- 익명클래스
- MySQL
- Spring
- MSA
- spring microservice
- java
- ansible
- 자바
- Algorithm
- kubernetes
- CRD
- cloud native
- 코틀린
- 클라우드 네이티브 자바
- nGrinder
- Semaphore
- 쿠버네티스
- Stress test
- ingress
- devops
- 헬름
- 머신러닝
- Microservice
- cloud native java
- 동기화
- Adapter 패턴
- 클라우드 네이티브
- Today
- Total
목록Kotlin (13)
카샤의 만개시기
채널은 넌블로킹 전송 개념으로 SendChannel과 ReceiveChannel 인터페이스를 이용해 값들의 스트림을 전송하는 방법을 제공합니다. fun main() = runBlocking { val channel = Channel() launch { // 여기에 다량의 CPU 연산작업이나 비동기 로직을 둘 수 있다. for (x in 1..5) channel.send(x * x) } // 5개의 값을 채널로부터 받는다 repeat(5) { println(channel.receive()) } println("Done!") launch { for (x in 1..5) channel.send(x * x) channel.close() // 모두 보내고 닫기 명시 } // for 루프를 사용해 끝까지 읽기 fo..
코루틴의 문맥 코루틴은 항상 특정 문맥에서 실행되는데 이런 문맥은 CoroutineContext에 의해 정의되고 내부적으로 CommonPool이 지정되어 코루틴이 사용할 스레드의 공동 풀을 사용하게 됩니다. 코루틴은 이 pool에 이미 초기화되어 있는 스레드 하나 이상을 선택하여 초기화하기 때문에 스레드를 생성하는 오버헤드가 적고 하나의 스레드에 다수의 코루틴을 지정할수 있어 성능이 빠릅니다. 특정 스레드 개수를 지정하려면 다음과 같이 사용자 문맥을 지정해 만들수 있습니다. val threadPool = Executors.newFixedThreadPool(4) val myContext = threadPool. asCoroutineDispatcher() async(myContext) { ... }코루틴이 ..
프로그램에서 태스크를 수행할 때 운영체제를 사용할 수 있게 하고 특정한 작업에 작업 시간을 할당하는 것을 선점한다라고 합니다. 선점형 멀티태스킹(Preemptive Multitasking)은 운영체제가 강제로 태스크의 실행을 바꾸는 개념이고 협력형 멀티태스킹은 태스크들이 자발적으로 양보하며 실행을 바꿀 수 있는 개념입니다. 코루틴은 이러한 협력형 멀티태스킹을 이용하여 동시성 프로그래밍을 지원하는데, 해당 루틴을 일시 중단(Suspended)하는 방식으로 Context-Switching을 없애고, 최적화된 비동기 함수를 통해 비선점형으로 작동하기 때문에 복잡한 넌블로킹 코드를 간결하게 해주며 더 나은 성능을 지원합니다. launch와 async 코루틴에서 사용되는 함수는 suspend()로 선언된 지연 함..
시퀀스는 순차적인 컬렉션으로 요소의 크기를 특정하지 않고, 나중에 결정할 수 있는 컬렉션이다. 예를 들어 특정 파일을 줄 단위로 읽어서 마지막 라인 수를 모를때 사용할 수 있다. 따라서 시퀀스는 처리 중에는 계산하고 있지 않다가 toList()나 count()와 같은 최종 연산에 의해 결정 된다. generateSequence()로 생성 fun main() { // 시드값 1을 시작으로 1씩 증가하는 시퀀스 정의 val nums: Sequence = generateSequence(1) { it + 1 } // take()를 사용해 원하는 요소 개수만큼 획득하고 toList()를 사용해 List 컬렉션으로 반환 println(nums.take(10).toList()) }위 코드에서 take(10)을 했을때..
DSL(Domain-Specific Language)은 특정 주제에 특화된 언어를 의미하며, 데이터베이스에 접근하기 위한 SQL이 대표적인 DSL이다. 이 밖에도 화면 레이아웃을 단순화한 DSL이나 웹 접근을 단순화한 DSL 등의 많은 프레임워크가 만들어져 있다. 코틀린에서는 고차함수와 람다식의 특징을 이용하여 읽기 좋고 간략한 코드를 만들수 있다. 우리가 목표로 할 DSL 코드는 다음과 같다 data class Person( var name: String? = null, var age: Int? = null, var job: Job? = null) data class Job( var category: String? = null, var position: String? = null, var extensi..
takeIf 함수 람다식이 true이면 결과값을 반환. public inline fun T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else nulltakeUnless 함수 람다식이 false이면 결과값을 반환. public inline fun T.takeIf(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null예제 val user = "KaSha" val str = "Sha" var index = 0 index = user.indexOf(str).takeIf { it >= 0 } ?: -1 index = user.indexOf(str).takeUnless ..
코틀린의 스코프 함수는 다음 5가지 함수를 제공하며 기본적으로 매우 비슷하다. apply, with, let, also, run 추가적으로 use 함수도 제공한다. 스코프 함수는 receiver와 code block을 받아 제공된 코드 블럭을 제공된 수신자에서 실행한다. 자바의 함수형 인터페이스(Funtional Interface)와 비슷하다고 보면 된다. 함수 이름 람다식의 접근 방법 반환 방법 let it block 결과 also it T caller (it) apply this T caller (this) run this block 결과 with this block 결과 let 함수 public inline fun T.let(block: (T) -> R): R { ... return block(th..
제네릭은 클래스 내부에서 사용할 자료형을 컴파일 시간에 검사하여 인스턴스를 생성할 때 확정하는 방법입니다. 제네릭을 사용하면 객체의 자료형을 컴파일할 때 체크하기 때문에 객체 자료형의 안정성을 높이고, 형 변환의 번거로움이 줄어듭니다. 제네릭을 사용하기 위해서는 앵글 브래킷() 사이에 타입 매개변수를 넣어 선언합니다. 다수 조건의 타입 매개변수 제한 매개변수의 타입을 제한하기 위해서는 where 키워드를 사용하여 지정된 제한을 모두 포함하는 경우에만 허용하도록 할 수 있습니다. 다음 예제는 a와 b에 들어갈 자료형을 Number이면서 Comparable을 구현하고 있는 타입으로 제한하고 있습니다. fun getMax(a: T, b: T): T where T:Number, T:Comparable { ret..