웹_프론트_백엔드/단과

[단과_JAVA] 2020.01.29

shine94 2020. 1. 29. 21:19

1. 실생활 적용해보기(영화관 만들기) 

** 기존에 완성한 영화관 만들기에 거래명세서와 주석 추가 **

package cinema;

import java.text.SimpleDateFormat;
import java.util.Random;

import javax.swing.JOptionPane;

public class Cinema_0129 {
	public static void main(String[] args) {
		String title = "▥롯데 시네마▥";
		String main_menu = "①예매하기\n②구매하기\n"
				+ "③포인트 조회\n④쿠폰 등록\n⑤거래내역 조회\n⑥나가기";
		
		String film_menu = "①백두산(09:00)\n②겨울왕국2(13:00)\n"
				+ "③[청소년 관람 불가]나쁜녀석들3(23:00)\n④메인메뉴로 이동";
		
		String food_menu = "①팝콘(7000원)\n②콜라(3000원)\n"
				+ "③[청소년 구매 불가]맥주(4000원)\n④메인메뉴로 이동";
		
		String errMsg = "다시 시도해주세요.";
		String ageMsg = "나이를 입력하세요.";
		
		String msg = "";
		
		int choice = 0;
		int age = 0;
		
		int t_price = 11000; 
		
		int p_price = 7000;
		int c_price = 3000;
		int b_price = 4000;
		
		int price = 0;
		int money = 100000;
		int point = 0;
		
		//쿠폰번호를 랜덤하게 발행하기 위하여 Random타입의 변수 r 선언
		//r로 마침표를 찍어서 Random클래스 안에 있는 메소드에 접근한다.
		Random r = new Random();
		
		//결제 성공시 시간을 기록하기 위해 현재 시간을 알맞는 형식으로 바꿔주는 역할
		//SimpleDateFormat 타입의 sdf변수를 통해 format()메소드를 사용한다.
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초");
//		System.out.println(sdf.format(System.currentTimeMillis()));
		
		//현재 시간을 저장하기 위한 변수
		String time = "";
		
//		r.nextInt(10); // 0 ~ 9
		
		//100000~999999
		//0 ~ 899999 + 100000
		
		//6자리 쿠폰번호 발권
		int coupon = r.nextInt(900000) + 100000;
		
		//사용자가 입력한 쿠폰번호를 저장할 변수
		int myCoupon = 0;
		
		//Flag : 해당영역에 들어왔을 때 무언가를 표시하고자 할 때
		
		//쿠폰을 등록했는지 표시해주는 변수
		boolean couponCheck = false;
		
		//사용자가 음식을 구매했는지 표시해주는 변수
		boolean foodCheck = false;
		
		//거래 내역을 저장할 변수
		String list = "";
		
		System.out.println(coupon);
		
		while(true) {
			//사용자가 음식을 구매한 다음 다른 메뉴를 선택할 수 있기 때문에
			//반드시 매 반복마다 foodCheck를 false로 초기화 해주어야 한다.
			//만약 이 작업을 하지 않는다면 한번 음식을 구매한 사용자는 foodCheck가 평생 true이다.
			foodCheck = false;
			choice = Integer.parseInt(JOptionPane.showInputDialog(title + "\n" + main_menu));
			
			if(choice == 6) {break;}
			
			switch(choice) {
			//예매하기 영역
			case 1:
				//변수의 재사용
				//1. 효율적인 메모리 관리
				//2. 가독성이 떨어진다.
				choice = Integer.parseInt(JOptionPane.showInputDialog(film_menu));
				
				switch(choice) {
				//백두산(09:00)
				case 1:
					//밑의 결제 영역에서 일괄처리를 하기 위해
					//사용자가 예매하고자 하는 영화 정보를 msg에 담아준다.
					//이 영역에서는 성공인지 실패인지 판단할 수 없으므로 예매까지만 적어준다.
					msg = "백두산(09:00) 예매";
					break;
				//겨울왕국2(13:00)
				case 2:
					msg = "겨울왕국(13:00) 예매";
					break;
				//[청소년 관람불가]나쁜녀석들3(23:00)
				case 3:
					//나이를 입력받고 미성년자일 경우
					//나쁜 녀석들3(23:00) 예매 실패 / 미성년자 관람 불가 출력 후
					//continue로 결제 막기
					//성인일 경우 msg에 나쁜 녀석들3(23:00) 예매 저장
					age = Integer.parseInt(JOptionPane.showInputDialog(ageMsg));
					msg = "나쁜 녀석들3(23:00) 예매";
					if(age < 20) {
						//미성년자
						JOptionPane.showMessageDialog(null, msg + " 실패 / 미성년자 관람 불가");
						continue;
					}
					break;
				//메인메뉴로 이동
				case 4:
					continue;
				default:
					JOptionPane.showMessageDialog(null, errMsg);
					//정상적으로 영화를 선택하지 않았을 때 하단의 결제영역으로 내려가면 안된다.
					//따라서 continue를 사용해서 막아준다.
					continue;
				}
				//이 영역에 온다면 정상적으로 영화를 선택한 것이고(continue를 만나지 않았을 때)
				//모든 영화표의 가격은 동일하기 때문에
				//price에 영화표 가격을 담아 준다.
				//만약 각 영화 선택 영역에서 잔액부족 검사를 해준다면 영화 갯수만큼
				//똑같은 작업을 반복해 주어야 한다. 비효율적이다. 일괄처리로 이 문제를 해결할 수 있고 
				//하단에서 일괄처리를 하기 위해 사용자가 선택한 상품의 가격만
				//기억시켜준다.
				price = t_price;
				break;
			//구매하기 영역
			//팝콘(7000원), 콜라(3000원), [미성년자 구매 불가]맥주(4000원)
			//price변수를 통해서 일괄처리하기
			//맥주 구매시 미성년자 확인 후 처리
			case 2:
				choice = Integer.parseInt(JOptionPane.showInputDialog(food_menu));
				
				switch(choice) {
				//팝콘
				case 1:
					msg = "팝콘 구매";
					//각 상품의 가격이 다르기 때문에 사용자가 선택한 상품의 가격을 각각
					//price에 담아준다.
					price = p_price;
					break;
				//콜라
				case 2:
					msg = "콜라 구매";
					price = c_price;
					break;
				//[청소년 구매불가]맥주
				case 3:
					age = Integer.parseInt(JOptionPane.showInputDialog(ageMsg));
					msg = "맥주 구매";
					if(age < 20) {
						//미성년자
						JOptionPane.showMessageDialog(null, msg + " 실패 / 미성년자 구매 불가");
						continue;
					}
					price = b_price;
					break;
					//메인메뉴로 이동
				case 4:
					continue;
				default:
					JOptionPane.showMessageDialog(null, errMsg);
					continue;
				}
				//사용자가 음식을 정상적으로 선택했을 때 올 수 있는 영역
				foodCheck = true;
				break;
			//포인트 조회 영역
			case 3:
				JOptionPane.showMessageDialog(null, "잔여 포인트 : " + point + "점");
				continue;
			//쿠폰 등록 영역
			case 4:
				//couponCheck가 true일 때에는 쿠폰을 이미 등록한 사용자이기 때문에
				//중복 등록을 막아준다.
				if(!couponCheck) {
					myCoupon = Integer.parseInt(JOptionPane.showInputDialog("쿠폰번호(6자리) : "));
					
					if(coupon == myCoupon) {
						msg = "쿠폰등록 성공";
						couponCheck = true;
						
					}else {
						msg = "쿠폰등록 실패";
					}
				}else {
					msg = "이미 등록하셨습니다.";
				}
				JOptionPane.showMessageDialog(null, msg);
				continue;
				
			//거래 내역 조회
			case 5:
				//list에 아무 내용도 없다면 거래 내역 없음을 msg에 담아주고
				//내용이 있다면 그 내용 그대로를 msg에 담아준다.
				//조건식이 한 개이기 때문에 삼항 연산자를 사용한다. 
				msg = list.equals("") ? "거래내역 없음" : list;
				JOptionPane.showMessageDialog(null, msg);
				continue;
				
			default:
				JOptionPane.showMessageDialog(null, errMsg);
				continue;
			}
			
			//결제 영역
			
			//쿠폰을 사용하는 부분
			if(couponCheck && foodCheck) {
				//쿠폰이 등록된 사용자이며, 음식을 구매하려는 사용자일 경우
				
				//쿠폰을 사용한 시간을 time에 저장한다.
				time = sdf.format(System.currentTimeMillis());
				
				msg += "성공 / 결제 1회 무료 쿠폰 사용";
				
				//거래 내역에 메세지와 그 시간을 담아준다.
				list += msg + " / " + time +"\n";
				
				JOptionPane.showMessageDialog(null, msg);
				
				//쿠폰을 사용했기 때문에 false로 변경해준다.
				couponCheck = false;
				
				//새로운 쿠폰번호를 발행해 준다.
				coupon = r.nextInt(900000) + 100000;
				
				//개발자 테스트(출시시 반드시 삭제)
				System.out.println(coupon);
				continue;
			}
			//1점이라도 있다면 포인트가 자동으로 사용된다.
			if(point > 0) {
				if(point - price < 0) {
					//포인트 + 현금 결제
					if(money < price - point) {
						//잔액부족
						msg += " 실패 / 잔액부족";
					}else {
						time = sdf.format(System.currentTimeMillis());

						money -= price - point;
						point = 0;
						//(1)
						msg += " 성공 / 포인트 + 현금 결제";
						
						//거래 내역에 현재 잔액을 표시하지 않기 위해서
						//기존의 msg를 (1)과 (2)로 분리한다.
						//list에는 (1)만 담아준다.
						list += msg + " / " + time +"\n";
						
						//(2)
						msg += "\n현재 잔액 : " + money + "원";
					}
				}else {
					//포인트 결제
					time = sdf.format(System.currentTimeMillis());

					point -= price;
					msg += " 성공 / 포인트 결제";
					list += msg + " / " + time +"\n";
				}
				
			}else {
				//현금 결제
				if(money < price) {
					//잔액부족
					msg += " 실패 / 잔액부족";
				}else {
					time = sdf.format(System.currentTimeMillis());

					money -= price;
					point += price * 0.5;
					msg += " 성공";
					
					list += msg + " / 현금 결제" + " / " + time +"\n";
					
					msg += "\n현재 잔액 : " + money + "원";
				}
			}
			JOptionPane.showMessageDialog(null, msg);
		}
	}
}

 

 

2. 배열
 : 같은 자료형의 저장공간들이 나열되어 있는 것

 


3. 배열을 사용하는 목적
1) 변수를 여러번 선언하면 관리하기 힘들고 비효율적이다.

    따라서 여러 칸의 배열을 한 번만 선언한다.

 

2) 규칙성이 없는 값에 규칙성을 부여한다.


3. 배열의 선언
   자료형[] 배열명 = {값1, 값2,...};
   자료형[] 배열명 = new 자료형[칸수];

** Java에서 배열은 동적배열만 존재 **

** 따라서 칸수에 상수뿐만 아니라 변수도 가능 **

** new연산자는 뒤에 있는 값을 Heap메모리(동적)에 할당해주는 명령어이다 **

 


4. 배열의 사용
 : 인덱스로 값에 접근하고 대괄호 안에 인덱스를 넣어준다
   배열명[index] = 값;  //저장공간
   배열명[index];         //값
   배열명[index] = 값 + 배열명[index];
    //저장공간                   //값

 


5. 인덱스가 0부터 시작하는 이유?
 : 배열명은 배열의 시작주소를 가지고 있는 포인터이다 
   따라서 배열명에 연산을 하게 되면 포인터 연산이 되고 배열명 + 0은 시작주소이다 
   주소에 있는 값을 참조하기 위해서는 참조 연산자로 접근 해야하고

   이 문법이 복잡하기 때문에 []로 치환한다 
   대괄호 안에는 포인터 연산시 사용한 정수가 들어가고 이 정수를 인덱스라고 부른다 

   따라서 배열명은 시작 주소를 가지고 있기 때문에 인덱스는 0부터 시작한다 **

 

6. 참조한다란 말은 그 주소에 들어가서 값을 가져와라는 뜻!

'웹_프론트_백엔드 > 단과' 카테고리의 다른 글

[단과_JAVA] 2020.01.30  (0) 2020.01.30
[단과_Python] 2020.01.29  (0) 2020.01.29
[단과_Python] 2020.01.28  (0) 2020.01.28
[단과_JAVA] 2020.01.28  (0) 2020.01.28
[단과_Python] 2020.01.23  (0) 2020.01.23