한 눈에 끝내는 고랭 기초
    • 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)
    21 실전 프로젝트 - 주문하기, 장바구니 담기
    장바구니 확인(1)

    이전 강의에서 물품을 바로 주문하는 것이 아니라 장바구니에 추가하는 것을 구현했습니다. 그렇다면 사용자가 장바구니에 추가한 물품들이 어떤 것인지 알 수 있도록 출력하는 기능인 '장바구니 확인' 기능을 구현해야합니다. 아무것도 생각하지 않고 저번처럼 쉬운 기능부터 생각해봅니다. 사용자 객체의 map형 필드값을 그대로 출력하면 끝이겠죠? 그런데 그냥 출력하지 않고 딱 한가지만 고려합니다. buyer.shoppingbucket을 모두 출력하는 것이 아니라 장바구니에 물품이 없을때는 "장바구니가 비었습니다."라고 출력합니다. 물품이 한 개 이상 있으면 "%s, 수량: %d\n" 포맷으로 출력해봅니다. 물론 buyer.shoppingbucket의 key와 value값을 모두 접근하기 위해 for range문을 사용합니다.

    충분히 고민하고 아래 예시 코드를 확인해보세요.

    go

    buyer.shoppingbucket의 길이를 기준으로 길이가 0이면(장바구니에 품목이 없으면) "장바구니가 비었습니다."를 출력하고 아니면 장바구니의 모든 품목의 이름과 수량을 출력합니다. 저는 이 부분을 장바구니가 비었는지 안비었는지 확인하고 출력하는 기능을 한다는 뜻으로 emptyBucket()이라는 이름의 함수로 따로 생성하겠습니다.

    go
    go

    장바구니 상품 주문


    장바구니에 물품을 담기만 하면 사실 의미가 없습니다. 장바구니에 담은 물품들을 주문할 수 있어야합니다. 따라서 '장바구니 확인' 기능에 '주문' 기능을 추가할 것입니다. 바로 상품들을 한번에 주문하는 '장바구니 상품 주문' 기능입니다. 따라서 장바구니 물품 확인을 선택하면

    1. 장바구니 물품 주문
    2. 메뉴로 돌아가기
    3. 실행할 기능을 입력하시오:

    를 출력하고 선택할 수 있게 구현합니다. 물론 for문을 이용해서 틀린 선택을 하면 다시 선택하게끔 구현합니다. 물론 이를 선택하는 번호를 사용자에게 입력받는 변수를 선언합니다. 아래 예시가 있습니다.

    go

    이제 bucketmenu가 1일 때 즉, 장바구니의 물품을 주문했을 때 기능을 구현할 차례입니다. 그런데 여기서 판별할 것이 있습니다.

    • 장바구니에 추가한 물품의 포인트의 총 합이 사용자의 잔여 포인트보다 많을 경우
      • '주문'을 해야 포인트가 차감되기 때문에
    • 담아놓은 상태에서 바로 주문을 해서 장바구니에 있는 물품의 수량이 잔여 수량보다 많을 경우
      • 장바구니에 담을 당시에는 잔여 수량이 20개여서 15개를 담았는데 그 후에 10개를 주문하면 5개가 초과되는 상황이 발생함

    따라서 이를 각각 판별하는 기능을 구현해야합니다. 우선 requiredPoint() 함수를 만들어 1. 장바구니의 총 필요 마일리지를 계산하고 2. 필요 마일리지와 보유 마일리지를 출력하고 3. 마일리지가 부족할 시에는 "마일리지가 %d점 부족합니다."라는 메시지와 false를 반환합니다. buyer.shoppingbucket의 품목 이름과 담은 수량을 접근하기 위해 for range문을 사용합니다.

    우선 총 필요 마일리지를 구현해봅니다. (내 장바구니의 품목 == 품목 리스트(item[i].name))면 bucketpoint 변수를 선언해 (품목의 포인트*장바구니품목에 수량)을 초기화하고 모두 더합니다. 이는 조금만 생각하면 구현할 수 있습니다.


    go

    그리고 emptyBucket() 함수가 물품 리스트를 출력하므로 그 밑에 함수를 호출합니다. 그리고 살수 있는지 없는지를 판별하는 변수를 선언 및 초기화합니다.

    go

    그럼 이제 장바구니의 물품 수량이 잔여 수량을 초과할 경우를 판별하는 함수를 만듭니다. 저는 excessAmount() 함수를 만들었습니다. 이 함수도 똑같이 true/false 값을 반환합니다. 이 기능은 위 함수 구조와 아주 흡사합니다. 초과한 품목에 따라 "%s, %d개 초과"포맷으로 출력합니다. 물론 초과할 경우 false 그렇지 않을 경우 true를 출력합니다.

    go

    그리고 바로 requiredPoint() 함수 밑에 호출합니다. 이때 똑같은 변수에 반환값을 초기화하는데 이유는 둘중에 한개라도 false가 나오면 어차피 구매가 불가능하기 때문입니다.

    go
    질문하기