디지털 컨버전스/JAVA

[Java] 사칙연산 계산기, 예외처리, try-catch , 지역 변수, 난수

gimyeondong 2020. 2. 10. 08:56

 

  • 사칙연산 계산기

 

 


  • 예외 처리
    • Checked Exception 빨간줄, 컴파일 단계에서 확인
    • Unchecked Exception 실행 단계계에서 확인
  • Try-Catch

try-catch

  • Exception e : 객체지향
  • 경우의 수를 나눌 때 catch가 여러개 붙을 수 있음

예외처리로 숫자가 아닌 값을 처리하려는 시도, continue, break(무한반복 나가기)
새로운 문제 발생! 변수를 찾을 수 없다.

 


지역 변수는 생성된 지역의 중괄호가 끝나면 사라진다.

  • 변수의 Life cycle
    • 지역 변수는 생성되고 그 지역이 끝날 때 사라진다.

지역 밖에서 같은 이름의 변수 선언시 지역 안에서는 밖에서 먼저 생성된 변수를 인식


 

미리 지역 밖에서 변수 선언 후 지역 내에서 사용
2번 숫자 입력만 틀렸을 경우, 1번 숫자 입력을 반복할 필요 없도록 try-catch를 두번 사용


import java.util.Scanner;
public class Quiz_02 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = 0;
		int control = 0;
		while(true) {
			System.out.println("***ATM 시뮬레이터***");
			System.out.println("1. 잔액조회");
			System.out.println("2. 입금하기");
			System.out.println("3. 출금하기");
			System.out.println("4. 종료하기");
			try{
				System.out.print(">> ");
				control = Integer.parseInt(sc.nextLine());
			}catch(Exception e){
				System.out.println("숫자를 입력해주세요");
				continue;//숫자를 입력해주세요와 입력번호 다시 확인이 동시출력 되지 않도록
				//다음 반복으로 이동
			}
			if(control == 4) {
				System.out.println("ATM 시뮬레이터를 종료합니다.");
				System.exit(0);
			}else if(control == 1 || control == 2 || control == 3){
				// 여기에 스위치 구문 들어가도 구동은 똑같이 됨
			}else{
				System.out.println("입력 번호를 다시 확인해주세요.");
			}
			switch(control) {
			case 1 :
				System.out.println("현재 보유 잔액은 "+ num+" 입니다.");
				break;
			case 2 :
				while(true) {
					try {
						System.out.println("얼마를 입금하시겠습니까?");
						System.out.print(">> ");
						int add = Integer.parseInt(sc.nextLine());
						System.out.println("입금 후 잔액은 "+(num += add));
						break;
					}catch(Exception e) {
						System.out.println("입금액은 숫자여야 합니다.");
					}					
				}
				break;
			case 3 :
				while(true) {
					try {
						System.out.println("얼마를 출금하시겠습니까?");
						System.out.print(">> ");
						int minus = Integer.parseInt(sc.nextLine());
						if (minus<=num) {
							System.out.println("출금 후 잔액은 "+(num -= minus));
						} else {
							System.out.println("잔액이 부족합니다.");
						}
						break;
					}catch(Exception e) {
						System.out.println("출금액은 숫자여야 합니다.");
					}
				}
				break;
			}
		}
	}
}

//atm 시뮬레이터
//오류시 메세지
//숫자 넣는 곳에 문자 들어갈시 예외처리

사칙연산 계산기

import java.util.Scanner;
public class Quiz_03 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int account = 0;//초기화 되는 것을 막기 위해 while문 밖으로
		while(true) {
			System.out.println("=== ATM 시뮬레이터 ===");
			System.out.println("1. 잔액조회");
			System.out.println("2. 입금하기");
			System.out.println("3. 출금하기");
			System.out.println("4. 종료하기");
			System.out.print(">> ");
			String menu = sc.nextLine();// 문자 입력시 번거로움 막기 위해 String
			if(menu.contentEquals("1")){
				System.out.println("현재 잔액은 "+account+ " 원 입니다");
			}else if(menu.contentEquals("2")) {
				System.out.println("얼마를 입금하시겠습니까?");
				while(true) {
					try {
						int input = Integer.parseInt(sc.nextLine());
						System.out.println(input+ " 원이 입금되었습니다.");
						account += input;
						break;
					}catch(Exception e){
						System.out.println("입력값이 숫자가 아닙니다.");
						e.printStackTrace();
					}
				}
			}else if(menu.contentEquals("3")) {
				System.out.println("얼마를 출금하시겠습니까?");
				while(true) {
					try {
						int output = Integer.parseInt(sc.nextLine());
						if(account >= output) {
							System.out.println(output+ " 원이 출금되었습니다.");
							account -= output;
						}else {
							System.out.println("잔액이 부족합니다.");	
						}
						break;
					}catch(Exception e){
						System.out.println("입력값이 숫자가 아닙니다.");
						e.printStackTrace();//빨간 메세지 뜨지만 계속 진행, 개발자를 위한 메세지
					}
				}
			}else if(menu.contentEquals("4")) {
				System.out.println("ATM 시뮬레이터를 종료합니다.");
				System.exit(0);
			}else {
				System.out.println("메뉴를 확인해 주세요.");
			}
		}
	}
}

  • 난수 RandomNumber
    • 임의의 값 또는 무작위로 만들어지는 알 수 없는 값
  • 난수생성의 활용
    • 주사위 게임, 포커게임 및 슈팅게임 등
  • 난수 생성 Method
    • Math 클래스 내부의 random() method
    • 0~1.0 사이의 값을 무작위로 Return
    • 원하는 난수 범위를 구하기 위해 적절한 연산과 형 변환이 필요
    • Math.random()*(최대-최소+1)+최소
  • RAM : 휘발성 메모리, 전력공급이 중단되면 데이터가 사라짐
  • 하드디스크 : 반영구적, 자기디스크(자력)
  • 난수를 생성하고 가공 할 수 있어야 한다.
public class Exam_03 {

	public static void main(String[] args) {
		// 0 ~ 9 사이 수 구하기
		double d = Math.random();
		int randNum = (int)(d*(9 - 0 + 1)+0);
		System.out.println(randNum);

		//난수를 가공할 수 있어야 한다.
		//구하고자 하는 난수 범위의 최대값 y, 최소값x
		//ran * (y-x+1) + x
		//24~37 범위 -> ran(37-24+1)+24 -> (ran * 14)+24 -> (난수의 최소값 0 ~ 최대값13)+24

		//cf. (int)d*(9-0+1)+0 : 연산 우선 순위를 고려하지 않으면 무조건 0이 나옴
		// -> (int)(d*(9-0+1)+0) 
	}
}

public class Quiz_04 { //난수 범위 지정
	public static void main(String[] args) {
	
		double d1 = Math.random();
		System.out.println("0~9까지의 랜덤 수 : "+(int)(d1*10));
		
		double d2 = Math.random();
		System.out.println("1~10까지의 랜덤 수 : "+((int)(d2*10)+1));
		
		double d3 = Math.random();
		System.out.println("20~35까지의 랜덤 수 : "+((int)(d3*16)+20));
		
		double d4 = Math.random();
		System.out.println("0또는 1 : "+(int)(d4*2));
	}
}

//주사위 굴리기
public class Quiz_05 {
	public static void main(String[] args) {
		System.out.println("주사위 굴리기!");
		double r1 = Math.random();
		int d1 =(int)(r1*6+1);
		System.out.println("첫 번째 주사위 : "+d1);
		double r2 = Math.random();
		int d2 =(int)(r2*6+1);
		System.out.println("두 번째 주사위 : "+d2);
		System.out.println("두 주사위의 합 : "+(d1+d2));
	}
}

 

import java.util.Scanner;
//동전 앞 뒤 맞추기 풀이
public class Quiz_06 {
	public static void main(String[] args) {		
		Scanner sc = new Scanner(System.in);

		while(true) {
			int com = (int)(Math.random() * 2 + 1);	 //난수 생성이 반복문 안에 오도록

			System.out.println("===동전 앞 뒤 맞추기===");
			System.out.print("숫자를 입력해주세요 (1.앞면/2.뒷면): ");
			int	player = Integer.parseInt(sc.nextLine());

			if(com == player) {
				System.out.println("맞췄습니다^^");
			}else {
				System.out.println("땡! 틀렸습니다.");			
			}
		}
	}
}
import java.util.Scanner;
//가위 바위 보 게임
public class Quiz_07 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.println("===가위 바위 보 게임===");
		while(true) {
			int com = (int)(Math.random() * 3 + 1);
			System.out.print("숫자를 선택하세요(1.가위/2.바위/3.보): ");
			int player = Integer.parseInt(sc.nextLine());

			if(player==1) {
				System.out.println("당신은 가위를 냈습니다.");
				switch(com) {
				case 1 :
					System.out.println("컴퓨터는 가위를 냈습니다.");
					System.out.println("==================");
					System.out.println("무승부");	
					break;
				case 2 :
					System.out.println("컴퓨터는 바위를 냈습니다.");
					System.out.println("==================");
					System.out.println("컴퓨터가 이겼습니다. ㅠㅠ");
					break;
				case 3 :
					System.out.println("컴퓨터는 보를 냈습니다.");
					System.out.println("==================");
					System.out.println("당신이 이겼습니다!");	
					break;		
				}
			}else if(player==2){
				System.out.println("당신은 바위를 냈습니다.");
				switch(com) {
				case 1 :
					System.out.println("컴퓨터는 가위를 냈습니다.");
					System.out.println("==================");
					System.out.println("당신이 이겼습니다!");	
					break;
				case 2 :
					System.out.println("컴퓨터는 바위를 냈습니다.");
					System.out.println("==================");
					System.out.println("무승부");
					break;
				case 3 :
					System.out.println("컴퓨터는 보를 냈습니다.");
					System.out.println("==================");
					System.out.println("컴퓨터가 이겼습니다. ㅠㅠ");	
					break;		
				}			
			}else if(player==3){
				System.out.println("당신은 보를 냈습니다.");
				switch(com) {
				case 1 :
					System.out.println("컴퓨터는 가위를 냈습니다.");
					System.out.println("==================");
					System.out.println("컴퓨터가 이겼습니다. ㅠㅠ");	
					break;
				case 2 :
					System.out.println("컴퓨터는 바위를 냈습니다.");
					System.out.println("==================");
					System.out.println("당신이 이겼습니다!");
					break;
				case 3 :
					System.out.println("컴퓨터는 보를 냈습니다.");
					System.out.println("==================");
					System.out.println("무승부");		
					break;	
				}		
			}
		}
	}
}

import java.util.Scanner;
//사칙연산 계산기 - 강사 코드입니다. 참조해주세요.
public class Quiz_08 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("=== 계산기 프로그램 ===");

		while(true) {
			System.out.print("연산자 입력 (+,-,*,/) : ");
			String oper = sc.nextLine();

			if(oper.contentEquals("q")) {
				System.out.println("계산기 프로그램을 종료합니다.");
				System.exit(0);
			}else if(!oper.contentEquals("+") && !oper.contentEquals("-") &&
					!oper.contentEquals("*") && !oper.contentEquals("/")){
				System.out.println("연산자를 확인하세요.");
				continue;
			}

			int num1;
			int num2;

			while(true) {
				try {
					System.out.print("첫 번째 수 : ");
					num1 = Integer.parseInt(sc.nextLine());
					break;
				}catch(Exception e) {
					System.out.println("입력된 값이 숫자가 아닙니다.");
				}
			}
			while(true) {
				try {
					System.out.print("두 번째 수 : ");
					num2 = Integer.parseInt(sc.nextLine());
					break;
				}catch(Exception e) {
					System.out.println("입력된 값이 숫자가 아닙니다.");
				}
			}
			System.out.println("===== 결 과 =====");

			switch(oper) {
			case "+":
				System.out.println(num1 + " + " + num2 + " = " + (num1 + num2));
				break;
			case "-":
				System.out.println(num1 + " - " + num2 + " = " + (num1 - num2));
				break;
			case "*":
				System.out.println(num1 + " *" + num2 + " = " + (num1 * num2));
				break;
			case "/":
				System.out.println(num1 + " / " + num2 + " = " + (num1 / (double)num2));
				break;
			}
		}
	}
}

import java.util.Scanner;
//ATM Simulator - 강사 코드입니다. 참조해주세요.
public class Quiz_09 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int account = 0;

		while(true) {
			System.out.println(" === ATM 시뮬레이터 ===");
			System.out.println("1. 잔액조회");
			System.out.println("2. 입금하기");
			System.out.println("3. 출금하기");
			System.out.println("4. 종료");
			System.out.print(">> ");
			String menu = sc.nextLine();

			if(menu.contentEquals("1")) {
				System.out.println("현재 잔액은 " + account + " 원 입니다.");
			}else if(menu.contentEquals("2")) {

				while(true) {
					System.out.print("얼마를 입금하시겠습니까 ? ");
					try {
						int input = Integer.parseInt(sc.nextLine());
						System.out.println(input + " 원이 입금되었습니다.");
						account += input;
						break;
					}catch(Exception e) {
						System.out.println("입력값이 숫자가 아닙니다.");
					}
				}
			}else if(menu.contentEquals("3")) {
				while(true) {
					try {
						System.out.print("얼마를 출금하시겠습니까 ? ");
						int output = Integer.parseInt(sc.nextLine());

						if(account >= output) {
							System.out.println(output + " 원이 출금되었습니다.");
							account-=output;
						}else {
							System.out.println("잔액이 부족합니다.");
						}
						break;
					}catch(Exception e) {
						System.out.println("입력 값이 숫자가 아닙니다.");
						e.printStackTrace();
					}
				}
			}else if(menu.contentEquals("4")) {
				System.out.println("시스템을 종료합니다.");
				System.exit(0);
			}else {
				System.out.println("메뉴를 다시 확인하세요.");
			}
		}
	}
}

https://cafe.naver.com/hellolang 사칙연산 계산기 강사님 코드

https://cafe.naver.com/hellolang ATM 강사님 코드

  • PPT 자료 59~63 슬라이드 까지 진도 나갔습니다.
  • 계산기 풀이는 별다른 것은 없었는데, try-catch문에서 e.printStackTrace();를 넣어주면 프로그램을 실행시키면서도 왜 예외가 처리되었는지 알수 있다고 하셨습니다.
  • 그 후에는 난수에 대해서 예제 풀이를 했습니다.
  • 난수는 Math.random()*(범위의최대값-범위의최소값+1)+범위의최소값으로 범위를 지정할 수 있다는 것만 알면 문제풀이가 가능 합니다.
  • 마지막 63슬라이드 가위바위보게임 예제는 숙제입니다.