-
day22 - JAVA (자바 , 접근 제한자, 예외 처리(Exception Handle))KIC/JAVA 2021. 7. 17. 17:21반응형
[접근 제한자]
[접근 제한자 ex]
[다른 패키지의 Modifier2 클래스]
package javaPro.java_modifier2; public class Modifier2 { private int v1 = 10; int v2 = 20; // (접근 제어자 default로 설정) protected int v3 = 30; public int v4 = 40; @Override public String toString(){ return v1 + ", " + v2 + ", " + v3 + ", " + v4; } }
[modifierEx]
package javaPro.java_modifier; import javaPro.java_modifier2.Modifier2; /* * 접근 제한자. * private < (default) < protected < public * class package 상속 모두 */ class Modifier { private int v1 = 100; int v2 = 200; protected int v3 = v1; public void method() { System.out.println("chap8.Modifier.method() 메서드임"); System.out.println("v1 = " + v1); System.out.println("v2 = " + v2); } } class Modifier3 extends Modifier2 { public void method() { //System.out.println("v1= " + v1); // v1 의 접근 제어자가 private라 접근 불가능 //System.out.println("v2= " + v2); // v2 의 접근 제어자가 (default)라 접근 불가능 // 여기서 default 면 접근 불가능 아닌가요? 네 2는 다른 패키지인데 System.out.println("v3= " + v3); // v3 의 접근 제어자가 protected 라 접근 가능 Modifier2를 상속받은 클래스는 접근 가능 System.out.println("v4= " + v4); // 모든 접근 허용이 public 이라 접근 가능 } } public class ModifierEx1 { public static void main(String[] args) { Modifier m1 = new Modifier(); //System.out.println(m1.v1); // 접근 불가. private 이기 때문 System.out.println(m1.v2); // 접근 기능. (default) 이기 때문 (같은 패키치 내부) System.out.println(m1.v3); // 접근 기능. protected이기 때문 (같은 패키지 내부) m1.method(); Modifier3 m3 = new Modifier3(); //System.out.println("m3.v1 = " + m3.v1); // 접근 불가. private이기 때문 //System.out.println("m3.v2 = " + m3.v2); // 접근 불가. default 같은 패키지가 아니기 때문 //System.out.println("m3.v3 = " + m3.v3); // 접근 불가능 protected. 같은 패키지가 아니면서, 상속도 받지 않았기 때문 게터 세터로 받을 것 //위의 Modifier3 클래스는 Modifier2를 상속 받은 클래스이기 때문에 접근이 가능했던 것 System.out.println("m3.v4 = " + m3.v4); // 접근 가능 public //Math m = new Math(); // Math의 생성자의 접근 제어자를 private으로 막아놨기 때문에 객체 생성 불가 } }
[예외 처리(Exception Handle)]
-> 프로그램을 작성하다 보면 수많은 에러 (error)에 부딪치게 된다.
-> 에러가 발생하면 프로그램은 에러가 발생한 곳에서 멈추게 된다.
-> 에러는 그 종류와 프로그램에 미치는 심각성이 각기 다르므로 대처하는 방법이 다를 수밖에 없다.
-> 예외라는 것은 에러 중에서 대처할 수 있는 에러라고 말할 수 있다.-> 예외처리는 예외를 방치하거나 에러로 인한 프로 그램 수행결과가 잘못동작을 하는 것이 아니라, 에러를 잡고 처리하는 방법을 제공한다.
-> 따라서 예외의 긍정적인 측면은 특정에러에 대응방법을 제공한다는 것이다.
-> 자바에서는 예외가 발생할 수 있는 곳에 예외처리를 하도록 강제화 한다.
-> 예를 들어 파일을 읽어들이는 부분이나, JDBC에서 드라이버를 로딩할때 등이 그렇다.
-> 예외를 다룰 때는 예외가 발생하는 부분에서 처리하는 try catch-finally 와 메소드 차원에서 처리하는 throws가 있다.[예외 상황의 종류 및 예외 클래스의 계층 구조]
-> Error 클래스의 자손이 발생하면 치명적인 오류이므로 프로그램이 종료되는 것이 당연하다.
-> Exception 클래스의 자손이 발생하면 Error 클래스보단 덜 치명적인 오류이므로 프로그램이 종료되는 것보다는 오류 메시지 등 을 내보내고 오류 발생 가능성이 있는 부분에 대해서 미리 프로그램으로 처리를 해주는 것이다.
-> 즉, 예외처리의 대상은 Exception 클래스 및 자손 클래스들이다.-> 예외 클래스는 java.lang 패키지 내에 속하지만, IOException 클래스 및 그 하위 클래스는 java.io 패키지에 속한다.
[예외 처리]
[try- catch - finally]
-> try블록 안에는 예외가 발생할 수 있는 문장(코드)를 넣고 예외가 발생하면 catch블록에서 처리한다.
-> catch블록은 예외가 발생하지 않으면 실행되지 않는다.
-> finally 블록은 예외가 발생하든 하지 않든 반드시 실행되야 하는 문장을 기술한다. 따라서 finally 블록에서는 리소스를 해제하는 코드가 주로 들어간다.[다중 catch]
-> try 블록은 여러 종류의 예외를 발생시킬 수 있다. 따라서 try 블록 다음에 여러 개의 catch문이 나올 수 있다.
-> 여러 개의 catch문이 나올 경우 에러발생 시 매개변수(감시자)에 기술된 예외 타입이 같거나, 발생한 예외의 상위클래스와 같은 첫 번째 catch문이 실행된다.
-> catch의 순서는 중요하다. 다중 catch문 사용 시 catch의 순서는 좁은 범위의 예외처리에서 넓은 범위의 예외처리를 하는 문장순으로 기술해야 한다.(ex: NullPointerException -> RuntimeException -> Exception 순으로 기술)
[throws]
-> 자바에서 제공하는 메소드 내의 특정 블럭에서 예외를 처리하는 방법
-> throws는 던진다는 의미로 예외가 발생하면 throws 다음에 기술 된 예외처리 클래스로 던져서 처리한다는 의미
-> throws 다음에는 예외처리 클래스를 여러개 기술 할 수 있는데, 이때 좁은 범위에서 넓은 범위 순으로 기술한다.
ex)
예외 처리
package javaPro.java_exception; /* * 예외처리 * try 블럭: 예외가 발생할 가능성이 있는 문장들. * 예외가 발생한 경우 제어 catch 블럭으로 이동. * catch블럭 : 예외가 발생하면 호출되는 블럭 * 예외가 발생되면, 예외는 잡고, 정상적으로 실행을 함. * try 블럭과 함께 사용 해야함. */ public class ExceptionEx1 { public static void main(String[] args) { try { System.out.println(2); //System.out.println(1/0); // 여기서 오류 System.out.println(3); System.out.println(4); } catch(ArithmeticException e){ System.out.println("0으로 나누지 마세요."); System.out.println(5); } } }
다중 catch
package javaPro.java_exception; public class ExceptionEx2 { public static void main(String[] args) { try{ //ArrayIndexOutOfBoundsException 예외 발생 System.out.println(args[0]); //1 입력안함 -> main에서 데이터를 받아오지 않는다. //NumberFormatException 예외 발생 System.out.println(Integer.parseInt("3")); //ArithmeticException 예외 발생 System.out.println(10/Integer.parseInt("0")); String str = null; System.out.println(str.charAt(0)); //NullPointerException 예외 발생 } catch(ArrayIndexOutOfBoundsException e){ System.out.println("command 라인에 파라미터 입력하세요"); } catch(ArithmeticException e) { System.out.println("0으로 나누지 마세요"); } catch(NullPointerException e){ System.out.println("Null 입니다."); } catch(NumberFormatException e){ System.out.println("a를 숫자로 입력하세요"); } catch(RuntimeException e) { System.out.println("1. 오류 발생 위에 것들의 parent 예외"); } catch(Exception e) { System.out.println("2. 오류 발생. 모든 것의 parent 예외"); } } }
finally
package javaPro.java_exception; public class ExceptionEx3 { public static void main(String[] args) { try{ System.out.println(1); System.out.println(2); System.out.println(3/0); } catch(Exception e) { System.out.println(4); return; } finally { System.out.println("무조건 실행하는 finally: " + 5); } System.out.println(6); //위에 return이 있어서 이건 실행 x } }
커스텀 exception
package javaPro.java_exception; import java.util.Scanner; import javax.security.auth.login.LoginException; public class ExceptionEx4 { public static void main(String[] args) { try{ String id = "hong"; String pw = "1234"; Scanner scan = new Scanner(System.in); System.out.println("아이디 입력"); String inputId = scan.nextLine(); System.out.println("비번 입력"); String inputPw = scan.nextLine(); if (id.equals(inputId) && pw.equals(inputPw)){ System.out.println("로그인 성공"); } else if(!id.equals(inputId)){ throw new LoginFailException("id 틀림"); //자체적으로 만든 예외 } else{ throw new LoginFailException("비번 틀림"); } } catch(LoginFailException e){ System.out.println("=============" + e.getMessage()); e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } } } class LoginFailException extends Exception { String msg; LoginFailException(String msg) { this.msg = msg; } @Override public String getMessage(){ return msg; } }
300x250'KIC > JAVA' 카테고리의 다른 글