채널 select문 - 한 눈에 끝내는 고랭 기초
한 눈에 끝내는 고랭 기초
    • 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)
      최종 코드
    채널 select문
    18 채널(Channel)
    채널 select문

    이번 강의에서 배울 채널에서의 select문은 '분기문' 챕터에서 학습한 switch문과 거의 흡사한 용법으로 사용됩니다. switch문은 어떠한 조건이 주어졌을 때, 그 조건에 맞는 부분을 실행합니다. 쉽게 말해서, 실행 흐름을 제어하는 것입니다. switch문을 학습한지 오래되어 기억하지 못한다면 아래 코드를 바로 실행해보세요.

    go
    Check out the results of running the code !

    콘솔에 1, 2, 3을 순서대로 출력하는 것이 아니라 num은 3이기 때문에 case 3:에 의해 fmt.Println("3")만 실행합니다. 이와 마찬가지로 채널 데이터를 수신하거나 송신할 때 select문을 사용하면 먼저 송신이 된 채널을 수신하고 해당 부분을 실행하거나 채널로 데이터를 송신할 수 있습니다.


    select문을 사용하기 전에 지금까지 사용해왔던 일반적인 흐름의 채널 송/수신 예시 코드를 바로 실행해보세요.  

    go
    Check out the results of running the code !

    위 코드에서는 총 4개의 루틴이 있습니다. 

    • ch1, ch2 채널을 생성하고 3초 기다리는 main 루틴
    • 1000밀리초를 대기하고 ch1에 'true'를 송신하는 것을 반복하는 고루틴
    • 500밀리초를 대기하고 ch2에 'true'를 송신하는 것을 반복하는 고루틴
    • ch1 수신, "ch1 수신" 출력, ch2 수신, "ch2 수신" 출력을 순서대로 반복하는 고루틴

    이제는 클로저의 사용이 익숙할 것이라고 생각합니다. 클로저는 main 루틴에서 생성한 채널들을 매개변수 없이 접근합니다. 채널 ch1ch2에 데이터를 송신하는 두 고루틴은 각 채널에 데이터를 송신하기 전에 서로 다른 대기 시간을 가집니다. 데이터를 수신하는 루틴은 ch1, ch2 순서로 데이터를 수신합니다. 이때, 고루틴이 모두 동시(Concurrency)에 시작되어 ch2 채널이 ch1 채널보다 데이터가 먼저 송신돼도 수신 루틴에서 ch1 채널을 먼저 수신하기 때문에 ch1 채널을 수신할 때까지 기다려야합니다. ch1 채널 데이터가 1000밀리초만에 수신되면 이미 송신을 마친 ch1 채널 데이터가 수신됩니다. 이 과정을 반복하면 결국 ch1 채널과 ch2 채널은 동일하게 1000밀리초를 기다리는 것입니다.


    분명히 ch2 채널이 이미 송신 되었음에도 불구하고 ch1 채널이 송신되는 것을 기다리는 것은 굉장히 효율적이지 않습니다. 따라서 이러한 상황에 송신된 채널을 선택적으로 처리하는 select문을 사용해 채널 데이터 송/수신 효율을 높일 수 있습니다. 채널 수신에 있어서 select문의 형태를 먼저 알아보겠습니다.

    go

    switch와 다르게 select 뒤에 따로 검사할 변수나 식을 두지 않습니다. case의 수신자 채널이 송신되면 해당 case를 실행합니다. 위 코드를 select문으로 수정해보겠습니다.


    아래 코드를 바로 실행해보세요.

    go
    Check out the results of running the code !

    수신 루틴에서 select문을 사용했기 때문에 ch2 채널은 ch1 채널에 데이터가 송신될 때까지 기다리지 않고 송신되면 바로 select문에 의해 바로 수신됩니다. 그리고 switch문에서 case 뒤에 표현식을 사용할 수 있었던 것처럼 select문에서는 "case 변수 := <- 채널:" 형식으로 데이터 수신과 동시에 변수에 데이터를 초기화할 수 있습니다. 조금만 수정해 위 예시에 바로 적용해보겠습니다.

    go
    Check out the results of running the code !

    맨 위에서 언급한 것처럼 select문은 송신된 채널이 있을 때, 그 채널을 수신하는 기능을 하는 것 뿐만이 아니라 case를 이용해 채널에 데이터를 송신할 수 있습니다. select문에 채널에 데이터를 송신하는 case가 있다면 항상 데이터를 송신하고, 채널에 데이터가 수신됐다면 데이터를 받는 case가 실행됩니다. 쉽게 말해서 송신자와 수신자가 모두 select문에 있을때 송신된 데이터가 없으면 계속 송신자 case를 실행해 데이터를 송신합니다.


    아래 예시 코드를 바로 실행해보세요.

    go
    Check out the results of running the code !

    콘솔에 출력되는 것을 확인해보면, ch1과 ch2의 채널에 데이터가 송신되지 않는 대기 시간 중간에 case ch3 <- "goorm":으로 데이터를 송신하고 200밀리초 후에 데이터를 수신하는 것을 알 수 있습니다. 

    Q&A