채널은 코루틴끼리 통신을 위한 api이다.

Untitled

송신자와 수신자의 수에 제한이 없고 전송된 모든 값은 한번만 받을 수 있다.

Untitled

Channel 인터페이스는 SendChannelReceiveChannel을 구현한 인터페이스인데 이 인터페이스들은 각각 sendreceive라는 suspend 함수를 갖는다.

send는 채널의 용량이 모두 찼을 때 공간이 생길 때까지 중단된다.

receive는 채널에서 가져올 원소가 없을 때 원소가 생길 때까지 중단된다.

https://pl.kotl.in/Gj4FhV6Wo?theme=darcula

위와 같은 방식으로 수신부, 송신부를 만들면 수신부가 얼만큼의 원소가 보내질 지 알아야 한다는 단점이 있다. 일반적으로 수신자는 그 정보를 알지 못하기 때문에 채널이 닫힐 때까지 받을 수 있도록 for 루프나 consumeEach 함수를 사용한다.

https://pl.kotl.in/6AQ5UVCdE?theme=darcula&from=4&to=22"></iframe>

위 코드는 수신자가 채널이 닫힐 때까지 계속 원소를 받을 수는 있지만, 송신자가 채널을 닫는 것을 잊을 수 있다는 문제가 있다. 특히 예외가 발생한 경우가 그렇다.

이럴 경우 수신자가 계속 기다리기 때문에 ReceivedChannel을 반환하는 코루틴 빌더인 produce 함수를 사용하는 것이 안전하고 편리하다. produce 함수는 어떻게 종료되든 상관없이 close를 반드시 호출한다.

https://pl.kotl.in/rijuCVzQN?from=4&to=18&theme=darcula

Channel type

채널은 용량에 따라 4가지로 분류가 가능하다.