한 눈에 끝내는 고랭 기초
    • 01
      시작하기에 앞서
    • 강의대상
      Go란?
      실습 환경 구축 - 구름IDE
      Hello goorm! 출력해보기
    • 02
      변수와 상수
    • 콘솔 출력 함수의 기본
      변수의 선언과 초기화
      상수의 선언과 초기화
      간단한 덧셈
      잘못된 신상정보
    • 03
      연산자
    • 연산자 종류
      연산자 우선순위
      콘솔 입력 함수의 기본
      간단한 덧셈과 곱셈
      몫과 나머지
    • 04
      자료형
    • 자료형의 종류와 특징
      문자열의 표현
      자료형의 변환
      강제 형 변환
    • 05
      콘솔 출력과 입력 함수
    • 콘솔 출력 함수(Print)
      콘솔 입력 함수(Scan)
      정돈된 표
      신상정보 입력과 출력
    • 06
      반복문 - for
    • 오로지 for
      구구단
      빛나는 이등변삼각형
    • 07
      조건문 - if/else
    • 조건에 따른 실행과 흐름 분기
      7과 9의 배수
      두 수의 차
    • 08
      분기문 - switch
    • swich문에 의한 선택적 실행
      안좋은 계산기
    • 09
      제어문
    • break, continue, goto문
      구구단2
      두 수를 더하면 99
    • 10
      컬렉션
    • 배열(Array)
      슬라이스(Slice)
      맵(Map)
      역행렬
      가장 긴 이름
      중간고사 평균 점수
    • 11
      함수
    • Go언어에서의 함수
      전역변수와 지역변수
      매개변수
      반환값(리턴값)
      익명 함수
      오름차순 정렬
      아이패드를 사주는 조건
      역학적 에너지
    • 12
      클로저
    • 외부 변수 접근 : 클로저
      동전 정리
    • 13
      구조체와 메소드
    • 구조체
      메소드
      성적 저장 프로그램
      역학적 에너지2
    • 14
      인터페이스(interface)
    • 메소드의 집합 인터페이스
      직육면체와 원기둥
    • 15
      defer와 panic()
    • 지연 처리 defer
      종료하는 panic(), 복구하는 recover()
      엘리베이터
      중간고사 평균 점수2
    • 16
      에러 처리
    • 에러 처리의 기본
      에러 출력 및 처리
      중간고사 평균 점수3
    • 17
      고루틴(Goroutine)
    • 비동기 프로세스의 기본
      고루틴의 활용
      고루틴 실습
    • 18
      채널(Channel)
    • 고루틴의 데이터 통로 : 채널
      비동기 채널과 버퍼
      동기 채널
      채널 닫기
      송신 전용, 수신 전용 채널
      채널 select문
      고루틴 실습2
      메시지 전송
      동기 채널 실습
      비동기 채널 실습
    • 19
      패키지(package)
    • 패키지의 개념
    • 20
      실전 프로젝트 - 마일리지 상점
    • 프로젝트를 시작하기 앞서
      실습모드에서 실습
      마일리지 상점의 주요 기능
      필수 구조체와 매인 메뉴
      잔여 수량, 잔여 포인트 구현
    • 21
      실전 프로젝트 - 주문하기, 장바구니 담기
    • 구매 구현(1)
      구매 구현(2)
      장바구니에 담기
      장바구니 확인(1)
      장바구니 확인(2)
    • 22
      실전 프로젝트 - 고루틴으로 배송하기
    • 배송 상태 확인(1)
      배송 상태 확인(2)
      배송 상태 확인(3)
      최종 코드
    송신 전용, 수신 전용 채널
    undefined undefined
    송신 전용, 수신 전용 채널

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


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

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

    go
    Check out the results of running the code !

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

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


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

    go
    Check out the results of running the code !

    송/수신 채널의 활용


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


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

    go
    Check out the results of running the code !

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

    default

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

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

    go
    Check out the results of running the code !
    default

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

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

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

    Q&A