한 눈에 끝내는 고랭 기초
    • 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)
      최종 코드
    배송 상태 확인(1)
    22 실전 프로젝트 - 고루틴으로 배송하기
    배송 상태 확인(1)

    이전 강의까지 해서 마일리지 상점의 주요 기능은 거의 완성했습니다. 이제 마지막 큰 기능인 '배송'이 남았습니다. 이 프로그램의 컨셉은 인터넷 쇼핑이어서 물품 판매는 모두 배송으로 처리합니다. 이 기능은 상품이 주문접수가 된 시점에서 "주문접수", "배송중", "배송완료" 상태를 보여줍니다. 이는 각 주문 건수마다 독립적으로 진행되는 시간이므로 고루틴과 채널을 활용하기에 아주 좋은 기능입니다.

    배송을 할 수 있는 건수는 총 5개입니다. 5개의 주문이 동시에 처리될 수 있고 배송이 완료되면 또 주문할 수 있는 그런 시스템입니다. 감이 오시나요? 만약 5개를 연속으로 바로 주문하면 5개의 물품이 배송이 시작됩니다. 이 물품이 하나라도 끝나야 추가주문을 할 수 있는 것입니다. 이는 장바구니 물품 주문도 동일합니다. 장바구니에 담긴 모든 품목들을 한번에 주문합니다. 여기서 주의해야 할 것은 주문하는 물품의 종류가 배송할 수 있는 건수가 아니라 한 개의 주문이 배송 건수입니다. 예를 들어, 장바구니에 롱패딩 5개, 빼빼로2개를 담고 주문하면 두개의 물품이 한 배송으로 처리되는 것입니다. 이는 현재 운영되고 있는 시스템을 그대로 따랐습니다. 


    이를 아주 쉽게 알 수 있도록 예를 들겠습니다. 마일리지 상점은 5대의 트럭을 운영해서 사용자가 주문한 물품을 배송합니다. 각 트럭은 번호가 있어서 구별됩니다. 5대의 트럭은 주문이 들어오기를 기다리고 주문이 들어오면 빠른 번호의 트럭부터 물품을 싣고 배송을 시작합니다. 이 트럭이 이동함에따라 사용자가 주문한 건수에 대한 상태가 "주문접수", "배송중", "배송완료"로 바뀝니다. 배송이 완료되면 다시 돌아와 주문이 들어오길 기다리는 것을 반복합니다. 따라서 동시에 배송을 할 수 있는 건수는 5개이고 5대의 트럭은 각자 비동기적으로 일을 처리합니다. 여기서 무언가 떠오른 분도 계실겁니다. 바로 각 배송마다 비동기적으로 프로세스를 진행하기 때문에 고루틴을 사용하고 배송 시작과 완료를 송/수신하기 위해 채널을 사용합니다.

    앞으로 진행할 내용은 배송 구조체, 기능을 구현하는 것입니다. 하나씩 알아보겠습니다.


    우선 주문 건수를 제한하는 변수를 만들어 주문 건수를 5개로 한정합니다. 주문처리가 되면 배송 건수를 1증가하고 5가 초과되면 주문하지 못하도록 합니다. main() 함수에 int형 변수를 하나 추가해 모든 주문이 완료되면 1 증가시킵니다. 그리고 if문을 써서 5개 이상은 주문하지 못하도록 주문 기능을 고칩니다.

    go

    주문 기능은 

    • buying() 함수로 바로 주문할 경우
    • bucketBuying() 함수로 장바구니 물품을 주문할 경우

    가 있습니다. 다른 함수들에서 한 변수의 숫자를 증가시키므로 포인터 변수로 매개변수를 추가합니다. 함수의 매개변수로 num *int을 추가했습니다. 전달인자는 아래와 같습니다.

    go

    주문을 하는 곳에 numbuy가 5이하일 경우만 주문할 수 있도록 합니다. 주문하면 배송 횟수를 1 증가시킵니다.  5를 초과한 경우 "배송 한도를 초과했습니다. 배송이 완료되면 주문하세요."를 출력하고 주문하지 않도록 합니다.

    아래 buy() 함수의 예시를 보겠습니다.

    go

    아래 bucketBuying() 함수의 예시를 보겠습니다.

    go

    이렇게하면 주문할 때마다 numbuy가 1씩 증가만 하고 줄어들지 않습니다. 왜냐하면 아직 저희는 배송 상태를 구현하지 않았기 때문입니다. 다음 강의에서 배송을 담당하는 구조체를 구현해보겠습니다.

    질문하기