송신 전용, 수신 전용 채널
18 채널(Channel)
송신 전용, 수신 전용 채널

지금까지 채널에 대해 학습할 때 단방향 송/수신만 예시로 실행해봤습니다. 예를 들어, 채널에 데이터를 송신하는 루틴은 송신만, 채널에서 데이터를 수신하는 루틴은 수신만 했습니다. 그런데 사실 특별한 선언이 없으면 채널은 송신과 수신에 있어 자유롭습니다. 송신을 하고 이후에 수신도 할 수 있고, 다른 루틴에서도 수신을 하고 이후에 송신도 할 수 있는 것입니다. 


아래 지금까지 배운 것에서 크게 벗어나지 않는 채널의 예시 코드를 바로 실행해보세요.

참고로 채널을 함수의 매개변수로 전달할 때는 "(매개변수이름 chan 채널데이터타입)" 형태로 입력합니다.

실행 언어: go
실행 결과를 확인해보세요!

위 코드는 버퍼를 만들지 않았기 때문에 동기 채널입니다. channel1 루틴은 ch에 데이터를 송신하고, channel2 루틴은 ch에서 데이터를 수신하는 작업을 두 번 반복하고, 그 다음에 반대 방향으로 같은 방법으로 송/수신을 합니다. 즉 꼭 수신 루틴과 송신 루틴을 따로 두지 않았기 때문에 양방향으로 송/수신이 기본적으로 가능하다는 것입니다. 

그런데, 채널을 함수의 매개변수로 전달하거나 반환할 때 채널로 송신만 할 것인지 수신만 할 것인지 설정할 수 있습니다. 자료형을 어떻게 선언하느냐에 따라 송/수신의 역할이 달라지는데, "chan<- 채널데이터타입"을 입력하면 송신 전용 루틴(송신 채널), "<-chan 채널데이터타입"을 입력하면 수신 전용 루틴(수신 채널)으로만 사용할 수 있습니다.


아래 송신 전용, 수신 전용 채널을 보여주는 예시를 바로 실행해보세요.

실행 언어: go
실행 결과를 확인해보세요!

송/수신 채널의 활용


특정 루틴에서 채널을 사용하기 위해서는 채널을 꼭 가지고 있어야 합니다. 위 예시 코드는 세 개의 고루틴(채널을 생성한 main 루틴, main 루틴에서 만든 채널을 가져다 쓰는 sendeChannel의 고루틴과 receiveChannel의 고루틴)이 있습니다. 채널을 사용할 때 꼭 알아야 하는 것이 있습니다. 채널을 사용하기 위해서는 꼭 해당 루틴에 채널이 있어야하는 것입니다. 어떻게 보면 당연한 이야기인데 루틴의 수와 채널의 수가 많아져 헷갈릴 때 이것을 기억한다면 큰 도움이 될 것입니다.


아래 수신 전용 채널을 반환하는 예시 코드를 바로 실행해보세요.

실행 언어: go
실행 결과를 확인해보세요!

위 코드는 sum() 함수에서 채널을 생성하고 수신 전용 채널로 반환합니다. 그 다음 main() 함수에서 ch에 수신 채널을 대입하고(sum()에서 반환한 것) <-ch로 채널을 수신합니다. 이렇게 간단해 보이는 흐름도 사실 머릿속에 흐름이 그려지지 않는다면 100% 이해하기 힘들 것입니다. 아래 그림을 보고 흐름을 이해하세요.

이제는 세 개의 루틴에서 두 개의 채널로 데이터를 주고 받습니다. 한 루틴은 채널에 두 데이터를 송신하는 역할을 하고 한 루틴은 채널에 있는 데이터를 수신해서 새로운 채널에 두 데이터를 더한 값을 메인 루틴에 송신합니다.

아래 예시 코드를 처음에 보면 굉장히 헷갈릴 수 있습니다. 바로 실행해보고 최대한 이해한 후 그림으로 흐름을 이해하기를 바랍니다.

실행 언어: go
실행 결과를 확인해보세요!

화살표가 많은 것은 데이터의 흐름을 일일이 표시했기 때문에 그런 것입니다. 눈여겨 봐야할 점은 두 채널의 데이터가 어느 루틴으로 송/수신되느냐입니다. 빨간색은 데이터와 프로그램의 흐름이고,  보라, 초록, 노란색은 채널의 데이터 송/수신 흐름입니다. 그리고 하늘색은 채널을 닫았다는 것을 알려줍니다.

  • 고루틴A는 main 루틴에서 만들어진 채널을 이용해 고루틴B에 송신합니다.
  • 고루틴B는 고루틴A의 데이터를 수신하기 위해 numch 채널을 매개변수로 가져와 수신합니다. 그리고 main 루틴에서 만들어진 채널을 이용해 main 루틴에 데이터를 송신합니다.

사실 위 그림의 흐름만 봐서는 굉장히 복잡해 보이지만 위에서 제시한 채널의 흐름의 두 핵심만  파악하면 쉽게 이해할 수 있습니다. 그리고 이 강의에서 제일 중요한 송/수신 전용 채널을 매개변수와 반환값으로 활용한 것을 꼭 확인하기를 바랍니다.

질문하기
추가 자료
no files uploaded

추가 자료가 없습니다

여기서 새로운 학습 자료를 확인하세요!
선생님이 추가한 자료들을 바로 확인할 수 있어요.