한 눈에 끝내는 고랭 기초
    • 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)
      최종 코드
    비동기 프로세스의 기본
    17 고루틴(Goroutine)
    비동기 프로세스의 기본

    Goroutine(이하 고루틴)은 여러 함수를 동시에(Concurrently) 실행할 수 있는 논리적 가상 스레드입니다. 스레드는 컴퓨터 구조에 대해 배우지 않은 수강생이라면 생소할 것입니다. 우리는 지금 Go언어를 배우는 것이기 때문에 컴퓨터 구조에 대해 깊은 이야기를 하지 않고 간단하게만 짚고 넘어가겠습니다. 우리는 컴퓨터로 한 가지 일만 하지 않습니다. 사용자는 여러가지 프로그램을 실행하고 프로그램은 메모리(CPU)에 할당되어 처리됩니다. 이것을 바로 '멀티 태스킹'이라고 합니다. CPU의 공간을 효율적으로 나눠 프로그램을 처리하는 것입니다. 우리는 이미 이런 일에 익숙해져 있습니다. 그런데 프로그램 안에서도 여러가지 일이 실행되고 처리됩니다. 이러한 프로세스(메모리에 할당된 프로그램) 안의 실행 흐름을 스레드라고 합니다. 당연히 하나의 스레드를 사용한다면 주어진 일을 다소 바보같이 순서대로 하나씩 동기처리합니다. 하지만 멀티 스레드가 되면 주어진 일을 동시에 처리하는 것이 가능합니다. 쉽게 말해서, 멀티 프로세스는 동시에 여러 프로그램을 실행하는 것이고 멀티 스레드는 프로그램 안에서 다양한 기능을 동시에 실행하는 것입니다.

    Java와 같은 언어에서는 함수를 호출할 때 멀티 스레드를 사용합니다. 하지만 Go언어에서는 스레드보다 훨씬 가벼운 비동기 동시 처리를 구현해 각각의 일에 대해 스레드와 1대 1로 대응하지 않고, 훨씬 적은 스레드를 사용합니다. 메모리 측면에서 스레드가 1MB의 스택을 갖을 때, 고루틴은 훨씬 작은 KB 단위의 스택을 갖고 필요시에 동적으로 증가합니다. 이는 굉장히 효율적이고 가벼운 기능으로서 비동기 프로세스를 구현할 때 Go언어의 장점이 극대화됩니다. 또한 다음 챕터에서 학습할 '고채널(Gochannel)'을 이용해 고루틴간의 통신도 굉장히 용이하게 할 수 있도록 했습니다.


    아직도 헷갈린 수강생을 위해 간단하게 말하겠습니다. Go언어에서는 함수에 고루틴을 선언함으로써 함수를 비동기적으로 동시에 실행할 수 있습니다. 문맥에서 알 수 있듯이 '비동기'적이라는 말은 한 번에 여러 일을 실행함을 의미합니다. 고루틴을 선언하는 방법은 함수 앞에 go를 입력하면 됩니다. 고루틴을 사용한 함수는 다른 함수와 상관 없이 동시에 실행됩니다.


    아래 비동기로 실행되는 것이 무엇인지 보여주는 아주 간단한 예제를 바로 실행해보세요.

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

    실행했으면 무언가 이상한 점을 느꼈을 것입니다. testGo() 함수의 fmt.Println("Hello goorm!")이 실행되지 않고 바로 프로그램이 종료되었을 것입니다. tesetGo() 함수를 고루틴으로 실행함으로써 main() 함수와 동시에 실행되기 때문에 testGo() 함수의 fmt.Println("Hello goorm!")이 호출되기 전에 main() 함수가 종료되고 프로그램이 종료됩니다. 따라서 main() 함수가 먼저 종료되지 않게 대기하기 위해 아래 예시와 같이 fmt.Scaln()을 입력해줍니다.

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

    그럼 정말 고루틴으로 실행하는 함수가 동시에 비동기적으로 실행되는지 피부로 느끼기 위해 반복문을 사용해 고루틴으로 함수를 호출해보겠습니다. 1부터 30까지 순차적으로 실행하는 반복문으로 난수를 생성해 함수 호출에 대기 시간을 설정하겠습니다. 이렇게 설정하면 비동기적으로 실행하기 때문에 숫자가 순서대로 출력되지 않을 것입니다.

    난수를 생성하기 위해 "math/rand" 패키지, 시간 출력을 위해 "time" 패키지를 import합니다.

    •  rand.Intn()는 정수형 난수를 생성하는 함수입니다.
    • "time"에서 쓰이는 시간은 모두 Duration형입니다. 이는 "time" 패키지 안에 선언된 구조체로서 int64형입니다. 
    • time.Sleep()은 프로그램에 대기 시간을 주는 함수입니다. 괄호 안은 Duration형을 써야합니다.


    아래 "time" 패키지의 여러 타입을 확인하고, 예시 코드를 바로 실행해보세요.

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

    고루틴에서 비동기적으로 호출되는 함수의  fmt.Println(n)실행 시간을 랜덤으로 지정했기 때문에 출력되는 숫자들이 뒤죽박죽인 것을 확인할 수 있습니다. 차이를 느끼기 위해 고루틴을 사용하지 않고 출력해보세요. 너무 오래걸리면 control + c를 입력하세요.

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

    지금까지 고루틴의 기본적인 개념과 사용 방법에 대해서 알아봤습니다. 다음 강의에서 실제로 고루틴을 활용할 수 있는 다양한 방법을 알아보겠습니다.

    질문하기