한 눈에 끝내는 고랭 기초
    • 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)
      최종 코드
    배송 상태 확인(3)
    22 실전 프로젝트 - 고루틴으로 배송하기
    배송 상태 확인(3)
    주문이 완료됐을 때 채널에 데이터를 송신함으로써 배송 시작을 알렸으니 이제 deliveryStatus() 함수를 구현해보겠습니다. 이전 강의에서 고루틴으로 이 함수를 호출해 main루틴은 진행하고 따로 실행되고 있는 함수를 만든다고 했습니다. 그리고 이 함수들은 각각의 트럭에 기능을 부여하기 때문에 5개의 고루틴에서 실행되고 각각 번호가 부여된다고 했습니다.
    default

    위 그림과 같이 함수를 구현합니다. 그리고 호출할때 필요한 매개변수가 무엇일지 잘 생각해보기 바랍니다. 이전시간에 고루틴을 5개 만들때 전달인자를 보여주지 않았습니다. 아래 코드를 확인해보세요.

    go

    deliverystart는 당연히 채널 송/수신을 위한 것입니다. i는 고루틴 각각을(트럭을) 구분하기 위해 전달합니다. deliverylist는 배송 객체를 받고 마지막으로 numby는 최대 배송 가능 횟수를 포인터 변수로 전달합니다

    이를 구현한 함수는 아래와 같습니다.

    go

    이제 거의 다 만들었습니다. 이제 사용자가 주문한 품목에 대해 상태를 알기 위해 '배송 상태 확인'을 구현합니다. 이는 정말 단순합니다. 그냥 deliverylist[i]status 필드값만 출력하면 됩니다. 우리는 포맷을 지정해 출력할 것입니다.

    "배송상황: %s", deliverylist[i].status 포맷으로 출력합니다.

    go

    이렇게 하면 정말 주문한 것에 대해 배송 상황을 확인할 수 있습니다. 비동기성 프로그램을 직접 구현한 것입니다.

    이제 마일리지 상점에 마지막 기능을 남겨두고 있습니다. 트럭이 이동만 하면 될까요? 트럭에 물건을 싣고 이동해야합니다. 트럭에 물건을 싣는 과정을 구현하면 모든 코드 구현이 끝납니다.

    직관적인 생각으로는 주문과 동시에 사용자가 선택한 아이템 바로 onedelivery에 저장하면 될 것 같습니다. 하지만 여기서 간과하는 것은 onedelivery가 아니라 deliverylist[i]. onedelivery라는 것입니다. 주문을 하는 시점에서 i값을 이용해 대기준인 트럭에 주문 물품을 실어야하는데 어느 몇번 트럭이 대기중인지 알 수 없습니다. 여기서 트럭 번호의 기능을 하는 것은 바로 


    go

    이 부분입니다. 그래서 고루틴으로 함수가 호출되면서 i값을 전달받는 것입니다. 따라서 상품을 주문하면 중간에 주문 정보를 잠깐 저장하고 대기중인 트럭이 바로 이 정보를 가져갈 수 있도록 중간 저장 변수를 만들어야합니다. 주문한 품목과 수량을 저장하는 map인 tempdelivery를 생성합니다.

    go

    그러면 주문 기능을 하는 곳에서는 해당 품목을 바로 onedelivery 맵에 저장하는 것이 아니라 우선 tempdelivery에 저장하고 채널이 수신될 때 tempdelivery값 대기하고있던 deliverylist[i].onedelivery에 저장하면 됩니다. 물론 가져오면서 초기화를 해야겠죠? 따라서 주문을 하는 두 코드(buying, bucketBuying)에서 물품과 수량들을 tempdelivery에 저장합니다.

    go
    go

    이제는 임시 저장한 것을 deliveryStatus() 함수에서 가져와서 deliverylist[i].onedelivery에 저장합니다. 여러 함수에서 값을 저장하고 가져오는 것이기 때문에 포인터로 변수로 가져옵니다. 그리고 값을 저장했으면 초기화해줍니다.

    go
    go

    이제 트럭에 상품도 실었고 배송 상태까지 변경합니다. 모든 기능이 구현됐습니다. 이제 4번 기능인 '배송상태 확인'만 구현하면 됩니다. 지금 4번 기능을 실행하면 어떤 품목이 배달되는지는 확인할 수 없고 배송 상황만 출력됩니다. 이제 어떤 상품이 배송되는지 알 수 있으니 이를 포맷을 지정해 출력해봅니다.

    • (주문 상품1 이름), (배송 수량)개 /(주문 상품2 이름), (배송 수량)개 /..... 배송상황 : (배송상황)

    포맷으로 출력합니다. 그리고 만약 배송중인 것이 없으면 "배송중인 상품이 없습니다."를 출력합니다.

    이를 구현하기 위해 

    1. 배송중인 상품이 있는지 없는지 확인
    2. 배송 상황 출력

    기능을 구현합니다. 저는 아래와 같이 했습니다. 

    go

    이제 상품을 주문하고 배송 상태 확인 기능을 실행해보세요. 잘 되나요? 마일리지 상점의 모든 기능을 구현했습니다.

    지금까지 따라와주셔서 감사합니다. 저의 코드는 절대 정답이 아닙니다. 어떻게 보면 길고 어떻게 보면 짧은 코드지만 어떻게 코딩하느냐에 따라 코드 길이가 많이 달라질 수 있습니다. 저도 분명히 부족한 부분이 있습니다. 단지 수강생분들께서 막히는 부분이 없도록 가이드를 제시해주었을 뿐입니다. 이 프로그램도 여기서 끝이 아닙니다. 추가할 수 있는 기능이 무궁무진합니다. 매뉴를 이리저리 왔다갔다 하거나, 편집자가 되어 판매 물품을 수정할수도 있고, 마일리지를 충전할 수도 있고, 장바구니 물품을 초기화하지 않고 각각을 수정할 수 있기도 하고 등등의 가능성이 열려있습니다. 프로그래밍이 그렇습니다. 끝은 없고 정답도 없습니다. 비동기성 프로그래밍의 장점을 최대한 살린 프로젝트를 제작해보려고 했는데 많이 도움이 됐는지 모르겠습니다. 이 프로젝트로 조금이라도 흥미를 느끼셨다면 코드를 더욱 개선해보세요. 그것도 코딩 능력 향상에 큰 도움이 됩니다. 그리고 이제 이 개념을 활용해서 여러 분야에서 Go언어를 사용해보길 바랍니다. 


    다시 한 번 감사드립니다.

    다음 강의에서 코드 전체 분량을 보여드리겠습니다.

    질문하기