package day11;
import java.util.Scanner;
//
//1~내가 입력한 정수까지의 누적합 구해주는 메서드
//두 정수의 나눗셈 메서드
//정수를 한글로 바꿔주는 메서드 (입력예 1024 -> 출력예 일공이사
public class MethodTask {
//1~내가 입력한 정수까지의 누적합 구해주는 메서드
void getSumFrom1(int end){ //리턴타입이 없으므로 void로
int result=0;
if(end>1) {
for(int i=1; i<end+1; i++) {
result+=i;
}
System.out.println(result);
}else {
System.out.println("1보다 큰 수를 입력하세요");
}
}
//두 정수의 나눗셈 메서드
void div(int num1, int num2){
//음수도 나눗셈이 되기 때문에 0이 아닐 때로 조건
double result = 0.0;
if(num2!=0) {
System.out.println((double)num1/num2);
result=Double.parseDouble(String.format("%.3f", ((double)num1/num2)));
System.out.println(result);
}else {
System.out.println("0으로 나눌 수 없습니다");
}
}
//정수를 한글로 바꿔주는 메서드 (입력예 1024 -> 출력예 일공이사
public static void main(String[] args) {
//스태틱이 위험한 이유 처음 시작할때부터 메모리에 올라가 있기 때문에 프로그램 종료 될 때 까지 올라가 있어서 실행시 느려진다
//여기서는 소속을 알려주는 방법으로 메서드 호출
MethodTask m = new MethodTask(); //클래스파일 이름 m = new 클래스파일 이름
m.getSumFrom1(1);
m.getSumFrom1(10);
m.div(10, 0);
m.div(10, 3);
m.div(10, 5);
}
}
1보다 큰 수를 입력하세요
55
0으로 나눌 수 없습니다
3.3333333333333335
3.333
2.0
2.0
String.format("%.3f", ((double)num1/num2));
format(String format, Object ...args) : String -String
String format - "" 안에 서식문자 넣어준다
Object - 모든 타입을 담고 있는 클래스 실수 정수 문자 문자열 다 담을 수 있다
String -String - 리턴값의 리턴타입
format을 쓰면 통째로 문자열 값인것을 알아야 한다
리턴타입이 문자열, 사용한 부분 전체를 리턴값으로 보자
package day11;
import java.util.Scanner;
//정수를 한글로 바꿔주는 메서드 (입력예 1024 -> 출력예 일공이사
public class MethodTask {
//정수를 한글로 바꿔주는 메서드 (입력예 1024 -> 출력예 일공이사
void changeToHangle(String data){ //정수로 입력 받으면 길이를 알 수 없으므로 문자열로 받는다
String hangle = "공일이삼사오육칠팔구";
String result = "";
int num = Integer.parseInt(data); //나머지, 나누기를 해줘야지만 자릿수(한글)를 알 수 있기 때문에 int num 선언
for (int i = 0; i < data.length(); i++) {
result += hangle.charAt(num % 10); //그 인덱스에 있는 문자를 가져온다 일의 자리 숫자의 인덱스
num /= 10; //일의자리 숫자부터 출력 되고 그 다음자리 수를 출력하려면 10으로 나눠줘야한다
//배열은 생성됐을때 length라는 상수가 자동으로 만들어지고 거기에 길이가 들어간다
//하지만 클래스에서 length를 구현하려면 String 클래스의 length라는 메서드를 사용해야함 => length() 로 작성한 이유
System.out.println(result);
}
for(int i=data.length()-1; i>-1; i--) {
System.out.print(result.charAt(i));
}
}
public static void main(String[] args) {
//스태틱이 위험한 이유 처음 시작할때부터 메모리에 올라가 있기 때문에 프로그램 종료 될 때 까지 올라가 있어서 실행시 느려진다
//여기서는 소속을 알려주는 방법으로 메서드 호출
MethodTask m = new MethodTask(); //클래스파일 이름 m = new 클래스파일 이름
m.changeToHangle("1024");
}
}
1024
일공이사
String hangle = "공일이삼사오육칠팔구";
배열로 안하는 이유? 문자열은 문자 배열이기 때문에, 내부에 [] 가 있다
hangle.charAt(num % 10)
대괄호로 접근하지 않고, charAt메서드를 통해 접근.
hangle.charAt 0 이라고 하면, "공" 이라는 문자값이다 인덱스의 0번째 값!
영화관 키오스크 메서드 활용하여 다시 만들기
import javax.swing.JOptionPane;
//메서드 사용하여 키오스크 프로그램 다시 만들기
public class New_CGV {
String ageMsg="[청소년 구매 불가 상품]\n나이를 입력하세요\n"; //전역변수
int age; // 전역변수는 자동초기화가 되므로, 0을 지워도 된다
boolean t_check; //예매완료인지 아닌지 확인하기
boolean bookTicket(){
boolean cCheck = false;
String films ="①라이온킹(08:00)\n②스파이더맨(12:00)\n③사일런스(23:00)[청소년관람불가]\n④뒤로가기\n";
int choice=Integer.parseInt(JOptionPane.showInputDialog(films));
//choice의 역할은 위에서 이미 다 사용되었기 때문에 여기서 다시 사용 가능하다 "변수의 재사용" 메모리를 아낄 수 있다
if(choice==1) {
JOptionPane.showMessageDialog(null, "라이온킹 예매 완료(08:00)");
}
else if(choice ==2) {
JOptionPane.showMessageDialog(null, "스파이더맨 예매 완료(12:00)");
}
else if(choice==3) {
age = Integer.parseInt(JOptionPane.showInputDialog(ageMsg)); //나이를 입력받아 비교해야하므로 정수로 변환 Integer.parseInt
if(age > 19) {
JOptionPane.showMessageDialog(null, "사일런스 예매 완료(23:00)");
}
else {
t_check = false;
//청불 영화 나이 체크하기
//여기서 처음으로 false로 만들어줬다면 다시 true로 안바뀐다 왜냐? while문 밖에서 선언했기 때문에
//따라서 선언부에 초기화로 선언하고 while문 안에서 true값을 넣어준다
JOptionPane.showMessageDialog(null, "다시 시도해 주세요");
}
}
else {
JOptionPane.showMessageDialog(null, "메인메뉴로 이동 합니다.");
cCheck = true;
}
return cCheck;
}
public static void main(String[] args) {
String helloMsg="★어서오세요 CGV 입니다.★\n";
String menuMsg = "①예매하기\n②구매하기\n③포인트조회\n④나가기\n";
//String ageMsg="[청소년 구매 불가 상품]\n나이를 입력하세요\n";
//String films ="①라이온킹(08:00)\n②스파이더맨(12:00)\n③사일런스(23:00)[청소년관람불가]\n④뒤로가기\n";
String foods ="①팝콘\n②콜라\n③맥주\n④뒤로가기\n";
int choice = 0;
int money = 10000000;
int point=0;
int t_price = 10000;
int f_price = 3000;
New_CGV c = new New_CGV();
while(true) {
//메인 메뉴이므로 무한반복문 안에 들어가서 그래야 매번 메뉴가 뜨게 된다
c.t_check=true;
choice = Integer.parseInt(JOptionPane.showInputDialog(helloMsg+menuMsg));
if(choice == 4) break; //뷰단에서 3번을 선택할 시 나가기 메뉴를 선택하므로 창이 꺼진다
//3번 나가기는 위의 if문으로 걸러졌으니, 1과 2번이 아닐 경우 컨티뉴로 되돌아가도록 설정한다
if(!(choice >=1 && choice <=3)) continue;
switch(choice) {
//예매하기 영역
case 1 :
//변수의 재사용
if(money - t_price < 0) {
JOptionPane.showMessageDialog(null, "잔액이 부족 합니다");
continue;
}
if(c.bookTicket()) continue;
if(c.t_check) { //t_check 예매확인이 되었을 때 영화비 빠져나감
if(point > 0) {
if(point - t_price >= 0) {
point -= t_price; //포인트로 티켓을 구매할 수 있음
}else {
money -= (t_price-point); //티켓 가격에서 포인트를 뺀 다음 그 남은 차액은 내 돈에서 빼준다
point = 0; //point를 0으로 초기화
}
}else {
money -= t_price;
point += (int)(t_price * 0.5); //point 50% 적립
}
JOptionPane.showMessageDialog(null, "현재 잔액: " +money+"원");
}
break;
//구매하기 영역 (매점)
case 2 :
if(money - f_price < 0) {
JOptionPane.showMessageDialog(null, "잔액이 부족 합니다");
continue;
}
choice=Integer.parseInt(JOptionPane.showInputDialog(foods));
//choice의 역할은 위에서 이미 다 사용되었기 때문에 여기서 다시 사용 가능하다 "변수의 재사용" 메모리를 아낄 수 있다
if(choice==1) {
JOptionPane.showMessageDialog(null, "팝콘 구매 완료");
}
else if(choice ==2) {
JOptionPane.showMessageDialog(null, "콜라 구매 완료");
}
else if(choice==3) {
JOptionPane.showMessageDialog(null, "맥주 구매 완료");
}
else {
JOptionPane.showMessageDialog(null, "메인메뉴로 이동 합니다.");
continue;
}
if(point > 0) {
if(point - f_price >= 0) {
point -= f_price; //포인트로 티켓을 구매할 수 있음
}else {
money -= (f_price-point); //티켓 가격에서 포인트를 뺀 다음 그 남은 차액은 내 돈에서 빼준다
point = 0; //point를 0으로 초기화
}
}else {
money -= f_price;
point += (int)(f_price * 0.5); //point 50% 적립
}
JOptionPane.showMessageDialog(null, "현재 잔액: " +money+"원");
break;
//포인트 조회 영역
case 3 :
JOptionPane.showMessageDialog(null, "잔여 포인트: "+ point + "점");
break;
}
}
}
}
전역변수가 자동초기화가 되는 이유?
전역변수는 모든 영역에서 사용 되는데 초기화를 깜빡한다면 오류가 심각하기 때문에 컴파일러가 자동초기화 해준다
전역변수 전체 지역에서 사용 가능
main 메서드는 static이 붙어 있기 때문에 전역변수라 할 지라도 static이 먼저 렘이 올라간다
전역변수 올라가기전에, 메인 메서드에서 사용하게 되면 모르기 때문에 오류가 난다
그래서 소속을 알려주거나, 똑같이 static 으로 만들어줘야 한다
'Dev. > java' 카테고리의 다른 글
Java :: Class(생성자) (0) | 2022.05.23 |
---|---|
Java :: Class(객체화) (0) | 2022.05.22 |
Java 2차원 배열로 매장별 매출 구하기 (0) | 2022.05.21 |
Java 배열 (0) | 2022.05.21 |
Java class/method 연습문제 (0) | 2022.05.16 |
댓글