Small Grey Outline Pointer Java 메서드 2
본문 바로가기
Dev./java

Java 메서드 2

by sso. 2022. 5. 22.
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 으로 만들어줘야 한다

728x90

'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

댓글