Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Kubernetes 자격증
- AI
- mysql 튜닝
- IntelliJ
- CKA
- 공부
- kotlin querydsl
- 정보처리기사 실기 기출문제
- Pinpoint
- 코틀린 코루틴의 정석
- Java
- Elasticsearch
- tampermonkey
- AWS EKS
- Linux
- 기록으로 실력을 쌓자
- Spring
- Kubernetes
- 정보처리기사실기 기출문제
- 정보처리기사 실기
- aws
- kotlin coroutine
- MySQL
- CloudWatch
- kotlin spring
- kotlin
- APM
- CKA 기출문제
- PETERICA
- minikube
Archives
- Today
- Total
피터의 개발이야기
[Kotlin] Kotlin의 채널 소개 본문
반응형
ㅁ 들어가며
ㅇ Kotlin의 채널은 코루틴 간에 데이터를 안전하게 전송하고 공유하기 위한 통신 기본 요소다. 채널은 동시성 프로그래밍에서 매우 유용한 도구로, 생산자-소비자 패턴을 구현하는 데 특히 적합하다.
ㅁ 채널의 기본 개념
ㅇ 채널은 일종의 파이프라인으로 생각할 수 있다. 개념적으로 큐와 유사하다. 한쪽 끝에서 데이터를 보내고 다른 쪽 끝에서 데이터를 받는다. 이를 통해 여러 코루틴 간의 안전한 통신이 가능해진다.
@Test
fun should_pass_data_from_one_coroutine_to_another() {
runBlocking {
// given
val channel = Channel<String>()
// when
launch { // coroutine1
channel.send("Hello World!")
}
val result = async { // coroutine2
channel.receive()
}
// then
assertThat(result.await()).isEqualTo("Hello World!")
}
}
ㅁ 채널의 종류
ㅇ Kotlin에서는 두 가지 주요 유형의 채널을 제공한다.
- 버퍼 없는 채널 (Unbuffered Channel)
- 버퍼 있는 채널 (Buffered Channel)
ㅁ 버퍼 없는 채널
버퍼 없는 채널은 송신자와 수신자가 만날 때만 데이터 전송이 이루어진다. 이는 동기화된 통신을 제공한다.
ㅁ 버퍼 있는 채널
버퍼 있는 채널은 지정된 크기의 버퍼를 가지며, 버퍼가 가득 차기 전까지는 송신 작업이 즉시 완료된다.
ㅁ 채널 사용 예제
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val channel = Channel<Int>()
launch {
// 데이터 송신
for (x in 1..5) {
channel.send(x * x)
}
channel.close() // 채널 닫기
}
// 데이터 수신
for (y in channel) {
println(y)
}
println("Done!")
}
ㅇ 이 예제에서는 1부터 5까지의 제곱값을 채널을 통해 전송하고 수신한다.
ㅁ 채널의 주요 연산
ㅇ 채널에는 몇 가지 주요 연산이 있다.
send()
: 채널에 데이터를 보낸다.receive()
: 채널에서 데이터를 받는다.close()
: 채널을 닫는다.
ㅁ 채널 사용의 장점
- 안전한 동시성: 채널은 여러 코루틴 간의 안전한 통신을 보장한다.
- 유연성: 다양한 동시성 패턴을 구현할 수 있다.
- 가독성: 복잡한 비동기 로직을 더 읽기 쉽게 만든다.
ㅁ 고급 채널 사용
ㅇ 채널은 더 복잡한 시나리오에서도 사용될 수 있다. 예를 들어, 팬인(fan-in)과 팬아웃(fan-out) 패턴을 구현할 수 있다:
fun CoroutineScope.produceNumbers() = produce<Int> {
var x = 1
while (true) {
send(x++)
delay(100)
}
}
fun CoroutineScope.square(numbers: ReceiveChannel<Int>): ReceiveChannel<Int> = produce {
for (x in numbers) {
send(x * x)
}
}
fun main() = runBlocking {
val numbers = produceNumbers()
val squares = square(numbers)
for (i in 1..5) {
println(squares.receive())
}
println("Done!")
coroutineContext.cancelChildren()
}
ㅇ 이 예제에서는 숫자를 생성하는 프로듀서와 이를 제곱하는 프로세서를 구현했다.
ㅁ 마무리
Kotlin의 채널은 코루틴 기반 동시성 프로그래밍에서 강력한 도구다. 채널을 통해 복잡한 동시성 패턴을 구현할 수 있으며, 코드의 가독성과 유지보수성을 높일 수 있다. 채널의 올바른 사용은 효율적이고 안전한 동시성 코드 작성에 큰 도움이 된다.
ㅁ 함께 보면 좋은 사이트
반응형
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin] Kotlin과 Spring 환경에서 JSR-305란? (2) | 2024.11.07 |
---|---|
[Kotlin] 코틀린에서 null인 경우 분기처리하는 방법 (0) | 2024.09.02 |
[Kotlin] Kotlin에서 Long 타입이 null일 때 기본값을 설정하는 방법 (1) | 2024.08.28 |
[Kotlin] Kotlin과 Builder 패턴 (0) | 2024.08.27 |
[Kotlin] Spring 멀티모듈, JAR 파일로 배포하는 방법 (0) | 2024.08.22 |
Comments