웹개발 수업/JAVA

웹개발_JAVA 14

gugigugi92 2023. 2. 7. 17:18
package exceptionTest;
import java.util.Scanner;
public class ExceptionTask {
   public static void main(String[] args) {
//      5개의 정수만 입력 받기
//      - 무한 입력 상태로 구현
//      - q 입력 시 나가기
//      - 각 정수는 배열에 담기
//      - if문은 딱 한 번만 사용하기 
      Scanner sc = new Scanner(System.in);//1
      int[] arData = new int[5];//2 5개 배열담기
      String temp = null; //5 q를 입력할 수 도 있으니 문자열로 받음     
      for(int i=0;;) {//3 조건식이 없으면 무한 반복
         System.out.print(i + 1 + "번째 정수[q: 나가기]: "); //4 정수 입력받는 출력문
         temp = sc.next(); //6입력받기
         if(temp.toLowerCase().equals("q")) {break;} //7 전부다 소문자로 바꿔서 q 입력시 종료     
         try {
            arData[i] = Integer.parseInt(temp); //8입력받은 문자열을 정수형으로 바꾸고 arData에 저장
            i++;
         } catch (NumberFormatException e) {//9숫자가 아닌데 숫자형식으로 나오려한다할때 오류메세지
            System.out.println("정수만 입력해주세요.");     
         } catch (ArrayIndexOutOfBoundsException e) {//10 인덱스번호가 넘어가면 오류
            System.out.println("5개의 정수만 입력이 가능합니다.");        
            for (int j = 0; j < arData.length; j++) {
               System.out.print(arData[j] + " "); //입력받은 값들 출력
            }        
            break;     
         } catch (Exception e) {
            System.out.println("다시 시도해주세요.");
         }
      }
   }
}​
package lambdaTask;

import java.util.Iterator;
import java.util.Scanner;

//[람다 식 심화 실습]
//여러 개의 정수를 입력받아서 알맞는 덧셈, 뺄셈 결과를 확인하는 애플리케이션 제작
//
//입력 예1) 7 + 35 - 9
//출력 예1) 33
//
//입력 예2) -9 + 8 + 10
//출력 예2) 9
//
//* "ABC".split("")은 [A][B][C] 3칸 문자열 배열로 리턴된다.
//   "A,B,C".split(",")은 [A][B][C] 3칸 문자열 배열로 리턴된다.
//   split("구분점")을 전달하면 문자열에서 동일한 구분점을 기준으로 문자열 값을 잘라낸 후 문자열 배열로 리턴한다.
//   구분점을 여러 개 사용할 때에는 split("구분점|구분점")으로 사용하며, "+", "-"를 구분점으로 사용할 때에는 "\\+", "\\-"로 표현한다.
//   예)"4 + 9".split("\\+")은 [4][9] 2칸 문자열 배열로 리턴
//
//* 사용자가 정상적으로만 입력한다는 가정 하에 구현하도록 한다.
//* 두 정수를 전달받은 후 int로 리턴하는 calc 추상메소드 선언(함수형 인터페이스 제작)
//* 두 정수의 덧셈, 뺄셈을 구해주는 함수형 인터페이스를 리턴하는 static 메소드 선언(람다식 리턴)
//* 전체 식을 전달받은 후 String[]로 리턴하는 getOpers 추상메소드 선언(함수형 인터페이스 제작)
//* main메소드에 getOper를 람다식으로 구현
//* 첫번째 정수가 음수일 경우 오류 해결
public class MyMath {
	public static Calc operate(String oper) { // 3 두 정수의 덧셈뺄셈을 받기위한 것이니 calc타입
		Calc calc = null;// 4
		return oper.equals("+") ? (n1, n2) -> n1 + n2 : (n1, n2) -> n1 - n2;// 5
		// 앞에 매계변수를 써서(n1,n2)-> 3항연산자로 아래 스위치문 대체
		// +-만 있을때 가능
		//정수 를 받아서 계산할 조건식	 	
//		switch(oper) {//5 정수 를 받아서 계산할 조건식	 
//		case "+":
//			calc = (n1,n2)-> n1+n2;
//			break;
//		case "-":
//			calc = (n1,n2)-> n1-n2;
//			break;
//		}
//		return calc;//6 calc 리턴
	}

	public static void main(String[] args) {
		OperCheck operCheck = e -> {// 7
			String result = "";//11 누적시킬 변수 선언 
			for (int i = 0; i < e.length(); i++) {// 8 전체수식에서
				char c = e.charAt(i); //9 각각의 문자를 c에 담고
				if (c == '-' || c == '+') { //10 -인지 +인지  연산자별로 구분
					result += c;//12 result에 c에담긴 문자를 누적
				}
			}
			return result.split("");//13 for문 리턴
		};
	
	
	String message = "정수의 덧셈, 뺄셈에 대한 식을 입력하세요.";//14 상황에따른 메세지, 입력 사용 선언
	String exampleMessage = "예)9+7-5";
	String expression = null; // 입력받을것
	Scanner sc = new Scanner(System.in);
	String[] opers = null;//17 입력받은 연산자를 담아줄 변수
	String[] numbers=null;//19 입력받은 정수들을 담아줄 변수
	int number1 =0, number2= 0;//15 정수 선언 / 초기화
	System.out.println(message); //16 상황에따른 출력할 메세지
	System.out.println(exampleMessage);
	expression = sc.nextLine();//입력받을 정수,연산자
	
	opers = operCheck.getOpers(expression);//18 oper에 받은연산자들을 담아줌
	numbers = expression.split("\\+|\\-"); //20 number split으로 분리 해서 number에 받은 정수를 담아준다
										   //numbers에서 첫번째 정수를 가져온뒤 다음 정수와 연산을 해야한다
										   //처음 number1 값에 계속 새로가져온 number2랑 연산하고
										   //그 결과를 number1에 계속 저장해야한다
	//number1 = Integer.parseInt(numbers[0]);//21 numbuer1은 입력받은 numbers[0]의 값을 저장
											 //26 split으로 끊었을때 맨앞 정수가 -이면 앞에 숫자가 없어서 빈문자열 이기때문에 오류/변경
	  number1= Integer.parseInt(numbers[0].equals("")? opers[0]+numbers[1]:numbers[0]);
											//빈문자열일때 연산자-와 입력한정수를 합치고, 아닐시 첫 입력받은 정수 그대로
			  								
		for (int i = 0; i < opers.length; i++) {//22연산자 개수만큼 연산하기에 opers.length
				if(i==0 && number1<0) {continue;}//27 i가 0이면 밑에거 수행 안함
				number2 = Integer.parseInt( numbers[i+1]);//23 number2에 numbers 입력받은 1번째방부터 저장
				number1 = MyMath.operate(opers[i]).calc(number1,number2); //24 더할지 뺄지 결정하기위해 전달
		}																  //결과값을 number1에 저장
			System.out.println(number1);//25입력받은 식 출력
	}
}
package lambdaTask;
@FunctionalInterface
public interface Calc {
public int calc(int number1, int number2);//1 입력받을 정수 함수형 인터페이스 선언
}
package lambdaTask;
@FunctionalInterface
public interface OperCheck {
	public String[] getOpers(String expression);//2 전체 수식를 받아오는 추상메서드
}												//6 수식을 받아오기위해 (String expression 추가)

 

출력화면

 


예외 처리
   컴파일 시(빨간밑줄), 빌드(문법상 문제없지만 메모리등 빌드시 생기는 오류)시, 
   런타임(사용자문제, 하지말라는것을 했을떄)시 오류가 발생하면
   여러가지 오류가 발생한다.
   보통 오류가 발생하지 않도록 제어문을 사용하지만,
   제어문을 사용할 수 없을 경우 예외 처리 문법을 사용한다.

예외 처리 문법
  try{
      오류가 발생할 수 있는 문장

   }catch(예외이름 객체명){
      오류 발생 시 실행할 문장
  //catch 강제종료를 하고싶지않을때 실행
   }...

   } finally {
      catch에서 잡히지 않은 오류가 있더라도 무조건 실행
   }
//오류가 발생했다는 것은 그 오류객체,필드가 메모리에 올라갔다는것
//해당 타입의 필드가 메모리에 올라갔는데 주소값을 담을 수 없다면 강제종료


예외 발생
   직접 예외를 발생시키기 위해서는 예외 던지기를 사용해야 하며, 이 때에는 생성자 호출 전 throw 키워드를 사용한다.
   예) throw new BadWordException();

사용자 정의 예외
   기본적으로 제공되는 예외가 아닌 특정 상황에서 직접 예외를 만들어야 한다면, Exception 혹은
   RuntimeException을 상속받아서 예외 클래스를 선언해야 한다.
   Exception은 컴파일러가 체크를 하기 때문에 예외처

리를 강제로 해야하고,
   RuntimeException은 컴파일러가 체크하지 않기 때문에 예외처리를 선택할 수 있다.

package exceptionTest;

public class ExceptionTest {
public static void main(String[] args) {
	int[] arData = new int[5];
	try { // 단축키 Art+Shift+z
		arData[5]=10;
	} catch (ArrayIndexOutOfBoundsException e) {			
	// Exception으로 모든 예외 잡기 가능 모든 예외는 Exception 클래스 상속
		
		e.printStackTrace(); // 현재 시점에서 연계된 모든 코드부분의 라인 번호가 출력된다 (오류 추적)
		System.out.println(e.getMessage()); // 오류 메세지 출력
		System.out.println("칸을 넘어갔습니다");		
	}	}}

실행화면

package exceptionTest;

public class ExceptionTest {
public static void main(String[] args) {
	try {
	System.out.println(10/0); 
	
	}catch(NumberFormatException e){
		System.out.println("0으로 나눌 수 없습니다.");
//	}catch(Exception e) { // 타입이 달라서 못잡고 finally가 출력
//		System.out.println("알수 없는 오류");
//	}
	}finally { 	
		System.out.println("반드시 실행되어야하는 문장"); //catch에서 잡히지 않은 오류가 있더라도 무조건 실행
	}

}
}

 

package exceptionTest;
import java.util.Scanner;
public class ExceptionTask {
   public static void main(String[] args) {
//      5개의 정수만 입력 받기
//      - 무한 입력 상태로 구현
//      - q 입력 시 나가기
//      - 각 정수는 배열에 담기
//      - if문은 딱 한 번만 사용하기 
      Scanner sc = new Scanner(System.in);//1
      int[] arData = new int[5];//2 5개 배열담기
      String temp = null; //5 q를 입력할 수 도 있으니 문자열로 받음     
      for(int i=0;;) {//3 조건식이 없으면 무한 반복
         System.out.print(i + 1 + "번째 정수[q: 나가기]: "); //4 정수 입력받는 출력문
         temp = sc.next(); //6입력받기
         if(temp.toLowerCase().equals("q")) {break;} //7 전부다 소문자로 바꿔서 q 입력시 종료     
         try {
            arData[i] = Integer.parseInt(temp); //8입력받은 문자열을 정수형으로 바꾸고 arData에 저장
            i++;
         } catch (NumberFormatException e) {//9숫자가 아닌데 숫자형식으로 나오려한다할때 오류메세지
            System.out.println("정수만 입력해주세요.");     
         } catch (ArrayIndexOutOfBoundsException e) {//10 인덱스번호가 넘어가면 오류
            System.out.println("5개의 정수만 입력이 가능합니다.");        
            for (int j = 0; j < arData.length; j++) {
               System.out.print(arData[j] + " "); //11입력받은 값들 출력
            }        
            break;     
         } catch (Exception e) {//12
            System.out.println("다시 시도해주세요.");
         }
      }
   }
}

package exceptionTest;
// 의도적 예외 발생 시키기

import java.util.Scanner;

public class Chatting {
public static void main(String[] args) {
	
	System.out.println("안          녕".replaceAll(" ",""));// 공백을 없애는 매서드
	System.out.println("   안     녕   ".trim().replaceAll(" ",""));// 공백을 없애는 매서드
	//앞뒤 공백을 없애는 메서드
	
	Scanner sc = new Scanner(System.in);
	String message = null;
	
	System.out.println("메세지:");
	message = sc.nextLine();
	
	if(message.equals("바보")) {
		//예외발생  
		
		try {//RuntimeException 이면 try.. catch없이 오류 없음 
			 //강제종료를 원할시 try catch를안쓰고 RuntimeException 상속
			throw new BadWordException("비속어는 사용할 수 없습니다");
			//throw를 써줘야 exception이라고 판단된다
		} catch (BadWordException e) {
		for(int i = 0; i<message.length();i++) {
			System.out.print("*"); // 메세지 길이만큼 *을 출력
		}
		System.out.println();
		}
		
	}
	
}
}
package exceptionTest;
// ***Exception 상속: 컴파일러가 체크(컴파일 오류), 강제종료 하기 싫다.
//***RuntimeException 상속: 컴파일러가 체크하지 않음(빌드 또는 런타임 오류), 강제종료 해야한다.
public class BadWordException extends /*RuntimeException*/Exception {

	public BadWordException(String message) {
	super(message);
	//수퍼에 원하는 메세지를 전달하면 콘솔창에 원하는 메세지 보낼수 잇음
	}
}