ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.