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 |