프로젝트-마일리지 상점

프로젝트-마일리지 상점

프로젝트-마일리지 상점에 대해 알아보자.


프로젝트를 시작하기 앞서


프로그래밍 언어라는 것은 활용 범위와 방법에 따라서 너무나도 다양한 내용들이 있기 때문에 웹 서버, 브라우저, 검색 엔진, 컴파일러 등등 쉬워보이는 언어라도 어떤 것을 다루느냐에 따라 그 내용과 깊이가 달라집니다.
그래서 다른 프로그래밍 언어Go언어의 특징과 개념에 대해 설명하며 기본 개념에 대한 강의가 구성되었고, Go언어의 특징인 비동기 프로그래밍 개념에 무게를 실었습니다. 되도록 어느 분야에서 Go언어를 사용해도 꼭 필요한 개념을 위주로 설명했습니다. 강의 내용을 늘리면 한 없이 늘릴 수 있지만 지금까지 배운 필수 개념들을 확실하게 적용할 수 있는 프로젝트를 직접 실습해보는 것이 더욱 도움되고 강의의 목표에 맞다고 생각했습니다.
따라서 지금까지 배운 Go언어기본 개념을 바탕으로 실전 프로젝트를 제작했습니다.

마일리지 상점의 주요 기능


실전 프로젝트로 인터넷 상점의 주요 기능을 구현한 ‘마일리지 상점’을 제작해봅니다. 프로젝트를 시작하기 앞서, 코딩에는 정답이 없습니다. 코드라는 것은 어떻게 작성하느냐에 따라 얼마든지 다른 방법으로 만들 수 있습니다.
그렇기 때문에 너무 틀에 갖혀 생각하지 않고 여러가지 가능성을 염두해두고 실습해보길 바랍니다.

마일리지 상점은 구매자에게 1,000,000 포인트를 지급하고 포인트 한도 내에서 물품을 구입하는 프로그램입니다. 기능으로는

구매
잔여 수량 확인
잔여 마일리지 확인
배송 상태 확인
장바구니 확인
프로그램 종료

가 있습니다. 그리고 구입할 수 있는 물품은 총 5개가 있습니다.
사진

구매


마일리지 상점의 핵심 기능이라는 것은 설명하지 않아도 잘 알 것입니다. 구매 기능을 실행하면 저장한 물품들의 정보가 출력됩니다. 구입하고싶은 물품을 선택하면 구입할 수량을 입력하는데, 잔여 수량보다 큰 수를 입력하거나 가지고있는 포인트보다 크면 주문이 불가능합니다. 또한, 잘못된 수를 입력해도 주문이 불가능합니다.

구입할 수 있는 적당한 수량을 입력했다면 바로 주문할지, 장바구니에 담을지 선택합니다. 바로 주문을 하면 주문이 접수되고 배송이 시작됩니다. 그런데 배송 가능 한도(5회)를 초과하면 주문이 불가능합니다. 배송 가능 한도는 강의에서 따로 설명하겠습니다. 그리고 장바구니에 담으면 장바구니에 품목이 저장됩니다.

잔여 수량 확인


물품의 구입 가능한 수량인 잔여 수량을 나타냅니다. 수량은 물품을 구입해야만 소모됩니다. 물품을 장바구니에 추가하면 마일리지가 소모되지 않습니다.

잔여 마일리지 확인


물품을 구입할 수 있는 잔여 마일리지를 나타냅니다. 마일리지는 물품을 구입해야만 소모됩니다. 물품을 장바구니에 추가하면 마일리지가 소모되지 않습니다.

배송 상태 확인


물품을 구매하면 배송이 시작됩니다. 배송은 주문후 10초동안 “주문접수”, 30초동안 “배송중”, 10초 동안 “배송완료” 상태가 됩니다. 최대 5개의 주문을 할 수 있습니다. 배송이 완료되면(배송완료 상태가 끝나면) 배송 가능 목록이 한 자리가 생깁니다.

장바구니 확인


장바구니에 추가한 물품들을 확인합니다. 장바구니의 모든 물품이 잔여 수량과 마일리지 한계에 충족한다면 주문할 수 있습니다.

프로그램 종료


프로그램은 프로그램 종료 메뉴를 선택해야 종료할 수 있습니다.

필수 구조체와 메인 메뉴


기본적인 메소드와 메인 메뉴 선택창을 구현합니다. 메소드는 어떤 객체의 정보를 담고 생성하는 기능을 합니다. 마일리지 상점에 필수적으로 등장하는 메소드는 두 개입니다. 물품들의 정보를 필드값으로 갖는 item 와 사용자의 정보를 필드값으로 갖는 buyer 입니다.

item 필드 : 이름(string), 가격(int), 수량(int)
buyer 필드/메소드 : 포인트(int), 장바구니목록(map)

눈여겨 봐야할 필드값장바구니목록입니다. 장바구니 목록은 사용자가 장바구니에 담은 물품의 이름(string)과 수량(int)을 맵형식으로 저장합니다. 따라서 생성자도 만드는 것이 좋습니다. 생성자는 buyer객체를 만듦과 동시에 point를 1000000으로 초기화하고 map을 생성하도록 만듭니다. 이때, item은 총 5개이므로 구조체 슬라이스를 생성합니다. 그리고 생성자로 buyer 객체도 생성합니다.

type item struct {
	name string
	price int
	amount int
}

type buyer struct {
	point int
	shoppingBucket map[string]int
}

func newBuyer() *buyer {
	d := buyer{}
	d.point = 1000000
	d.shoppingBucket = map[string]int{}
	return &d
}

그리고 main() 함수 안에서 items 슬라이스와 buyer 객체를 생성자를 이용해 생성하고 item들의 정보를 입력해 객체들을 생성합니다.

번호를 입력하면 각 번호에 맞는 기능이 실행됩니다. 잘못된 번호를 입력하면 다시 처음으로 돌아갑니다. 각 메뉴 마지막은 “엔터를 입력하면 메뉴 화면으로 돌아갑니다.”를 출력하고 엔터를 입력하면 처음으로 돌아가게 합니다. 프로그램 종료는 return문을 이용합니다.

for {
	menu := 0 // 첫 메뉴

	fmt.Println("1. 구매")
	fmt.Println("2. 잔여 수량 확인")
	fmt.Println("3. 잔여 마일리지 확인")
	fmt.Println("4. 배송 상태 확인")
	fmt.Println("5. 장바구니 확인")
	fmt.Println("6. 프로그램 종료")
	fmt.Print("실행할 기능을 입력하시오 :")	

	fmt.Scanln(&menu)
	fmt.Println()

	if menu == 1 { // 물건 구매

		fmt.Print("엔터를 입력하면 메뉴 화면으로 돌아갑니다.")
		fmt.Scanln()
	} else if menu == 2 { // 남은 수량 확인

		fmt.Print("엔터를 입력하면 메뉴 화면으로 돌아갑니다.")
		fmt.Scanln()
	} else if menu == 3 { // 잔여 마일리지 확인

		fmt.Print("엔터를 입력하면 메뉴 화면으로 돌아갑니다.")
		fmt.Scanln()
	} else if menu == 4 { // 배송 상태 확인

		fmt.Print("엔터를 입력하면 메뉴 화면으로 돌아갑니다.")	
		fmt.Scanln()
	} else if menu == 5 { // 장바구니 확인

		fmt.Print("엔터를 입력하면 메뉴 화면으로 돌아갑니다.")	
		fmt.Scanln()
	} else if menu == 6 { // 프로그램 종료
		fmt.Println("프로그램을 종료합니다.")

		return // main함수 종료
	} else {
		fmt.Println("잘못된 입력입니다. 다시 입력해주세요.\n")
	}
}	

이를 모두 완성하면 메뉴화면 구성은 완료한 것입니다. 기능은 없지만 번호를 입력할 수 있고 프로그램 종료를 선택하기 전까지 계속 반복되어야 합니다.

잔여 수량, 잔여 포인트 구현


잔여 포인트는 사실 사용자 객체의 포인트 필드를 출력하면 끝입니다. 딱 한 줄만 추가하면 됩니다. fmt.Printf() 함수를 사용해 “현재 잔여 마일리지는(포인트)점입니다.” 포맷으로 출력합니다.

else if menu == 3 {
	fmt.Printf("현재 잔여 마일리지는 %d점입니다.\n", buyer.point)
	fmt.Print("엔터를 입력하면 메뉴 화면으로 돌아갑니다.")
	fmt.Scanln()
}

잔여 수량 확인


잔여 수량도 같은 방식으로 출력합니다. “(물품이름), 잔여 수량 : (개수)” 포맷으로 출력합니다. 각 아이템 객체를 순서대로 출력해야하기때문에 for문을 활용해야합니다.

else if menu == 2 { // 남은 수량 확인
	for i := 0; i < 5; i++{
		fmt.Printf("%s, 잔여 수량: %d\n",items[i].name, items[i].amount)
	}
	fmt.Print("엔터를 입력하면 메뉴 화면으로 돌아갑니다.")
	fmt.Scanln()
}

정리


프로그램을 개발할 때 '분석-설계-구현-테스트-유지보수' 순으로 하는데 프로그램의 기능을 미리 정의하여 설계를 한다면 나중에 구현할 때 편리합니다. 그리고 기능을 추가하기 전목업, 프로토타입 정도의 화면을 설계를 하면 더 좋습니다.


© 2022. All rights reserved. 신동민의 블로그