본문 바로가기

3월 ~ 5월) 자바/java

13Day - (정적 내부클래스) OuterTwo & OuterTwoApp / OuterThree & OuterThreeApp / (익명 클래스)Anonymous & AnonymousApp / (패키지) SubjectApp / SubjectApp & JavaSubject & OracleSubject & JavaSubject // (입출력) CalcAgeApp // (접근제..

임포트

https://hjjungdev.tistory.com/102

 

인텔리J(IntelliJ) 임포트(Import) / Eclipse Ctrl + Shift + O in IntelliJ IDEA

1. 문제상황 Eclipse에서 CTRL + SHIFT + O "Organize Imports"를 눌러 패키지를 자동으로 가져옵니다. IntelliJ IDEA의 경우 CTRL + ALT + O "Optimize Imports" 를 누르면 사용되지 않은 가져 오기가 제거되고 패키지는

hjjungdev.tistory.com

 


package nested;

OuterTwo 

public class OuterTwo {
    private  int outerNum;

    public OuterTwo(int outerNum) {
        super();
        this.outerNum = outerNum;
    }

    public int getOuterNum() {
        return outerNum;
    }

    public void setOuterNum(int outerNum) {
        this.outerNum = outerNum;
    }

    public void outerDisplay() {
        System.out.println("outerNum = " + outerNum);

//        // 외부클래스는 정적 내부클래스로 객체를 생성하여 접근제한자에 상관없이 정적 내부클래스 필드 또는 메소드 참조 가능
//        InnerTwo innerTwo = new InnerTwo(200);
////        System.out.println("innerNum = " + innerNum); // 에러떠서 △만듦
//        System.out.println("innerNum = " + innerTwo.innerNum); // 에러떠서 △만듦
//        innerTwo.innerDisplay();

        // 외부클래스에서는 정적 내부클래스를 사용하여 정적필드 또는 정적메소드 접근 가능

    }


    // 정적 내부클래스 (Static InnerClass) - static 제한자를 사용하여 클래스 선언
    // > 정적 내부클래스에서는 static을 제한자를 사용하여 필드 또는 메소드 선언 가능

    public static class InnerTwo {
        private int innerNum;
        private static int staticNum = 300;

        public InnerTwo() {
            // TODO Auto-generated constructor stub
        }

        public InnerTwo(int innerNum) {
            super();
            this.innerNum = innerNum;
        }

        public int getInnerNum() {
            return innerNum;
        }

        public void setInnerNum(int innerNum) {
            this.innerNum = innerNum;
        }

        public static int getStaticNum() {
            return staticNum;
        }

        public static void setStaticNum(int staticNum) {
            InnerTwo.staticNum = staticNum;
        }

        public void innerDisplay() {
            System.out.println("innerNum = "+innerNum);
            System.out.println("staticNum = "+staticNum);

            //정적 내부클래스에서는 외부클래스의 필드 또는 메소드 참조 불가능
            // > 외부클래스의 정적필드 또는 정적메소드는 참조 가능
            // System.out.println("outerNum = "+outerNum);
            // outerDisplay();
        }
    }
}

 

 OuterTwoApp 

 

import nested.OuterTwo.InnerTwo;
public class OuterTwoApp {

    public static void main(String[] args) {
        OuterTwo outerTwo = new OuterTwo(100);

        outerTwo.outerDisplay();
        System.out.println("---------------------------------------------");
        
        // 정적 내부클래스의 생성자를 직접 호출하여 객체 생성 가능
        InnerTwo innerTwo = new InnerTwo(200); // (설정해주고)임포터시켜줌 >> 그래야 에러 안남
        innerTwo.innerDisplay(); //

        System.out.println("---------------------------------------------");
    }
}


outerNum = 100
---------------------------------------------
innerNum = 200
staticNum = 300
---------------------------------------------

 


package nested;

 

 OuterThree 

public class OuterThree {
    private int outerNum;

    public OuterThree() {
        // TODO Auto-generated constructor stub
    }

    public OuterThree(int outerNum) {
        super();
        this.outerNum = outerNum;
    }

    public int getOuterNum() {
        return outerNum;
    }

    public void setOuterNum(int outerNum) {
        this.outerNum = outerNum;
    }

    public void outerDisplay() {
        System.out.println("outerNum = "+outerNum);

        // 외부클래스에서는 지역클래스 사용 불가능
        // InnerThree innerThree=new InnerThree();
    }

    public void local() {
        // 지역클래스(LocalClass) : 메소드 내부에 선언된 클래스 - 메소드가 종료되면 자동 소멸
        // > 지역클래스에는 final 또는 abstract 제한자만 사용하여 선언 가능
        // > 접근제한자 및 static 제한자를 사용하여 지역클래스를 선언할 경우 에러 발생
        // > 비동기식 처리를 위한 스레드 객체를 생성하기 위해 사용
        class InnerThree {
            int innerNum;

            void innerDisplay() {
                System.out.println("innerNum = "+innerNum);
            }
        }

        // 지역클래스가 선언된 메소드에서만 객체를 생성하여 필드 또는 메소드 참조 가능
        InnerThree innerThree = new InnerThree();
        innerThree.innerNum = 200;
        innerThree.innerDisplay();
    }
}

 

 OuterThreeApp

public class OuterThreeApp {
    public static void main(String[] args) {
        OuterThree outerThree = new OuterThree(100);

        outerThree.outerDisplay();
        outerThree.local();

    }
}


outerNum = 100
innerNum = 200

 


 

package nested;

(익명 클래스) Anonymous

public interface Anonymous {
    void display();
}

 

AnonymousApp

public class AnonymousApp {
    public static void main(String[] args) {
        // 인터페이스를 사용하여 참조변수는 생성가능하지만 객체 생성 불가능
        // > 인터페이스는 클래스가 상속받기 위한 자료형
        // > 인터페이스를 상속받은 자식클래스는 인터페이스에 선언된 모든 추상 메소드를 반드시 오버라이드 선언
        // > 인터페이스를 상속받은 자식클래스로 객체를 생성하여 인터페이스로 생성된 참조변수에 저장 가능

        // Anonymous anonymous = new Anonymous(); // 오류

        // 인터페이스를 상속받은 이름이 없는 자식클래스를 선언하고 인터페이스의 메소드를
        // 오버라이드 선언하여 객체 생성 가능 - 익명의 내부클래스 (지역클래스)
        // 익명의 내부클래스 (Anonymous InnerClass) 인터페이스 또는 추상클래스를 상속받은 이름이 없는 자식클래스
        // > 익명의 내부클래스는 상속받은 인터페이스 또는 추상클래스의 모든 추상메소드를 오버라이드 선언
        Anonymous anonymous = new Anonymous() {
            @Override
            public void display() {

            }
        };

    }
}

 

 


 

(패키지) 

// 패키지 - 같은 목적의 자료형을 명확하게 구분하여 그룹화 하기 위해 사용
// Java 참조형 - 클래스, 인터페이스, 열거형
// Java 자료형을 보다 쉽게 관리하기 위해 패키지 사용
// > 패키지의 이름은 도메인을 역방향으로 나열하고 그룹명을 지정하여 작성하는 것을 권장
// 도메인 - 인터넷에서 개인 또는 그룹이 사용하기 위한 네트워크 식별자
// ex) itwill.xyz : 도메인 >> xyz.itwill.board

// 패키지에 작성된 소스파일의 처음 위치에는 소스파일이 작성된 패키지를 반드시 명확하게 작성
// 형식) package 패키지경로;
// > Java 자료형이 어떤 패키지에서 선언된 자료형인지를 명확하게 구분하여 사용

// import 키워드 : 다른 패키지에 작성된 Java 자료형을 명확히 표현하여 접근하기 위한 키워드
// 형식) import 패키지경로.자료형; >> 자료형 대신 *(전체) 사용 가능
// > package 키워드로 작성된 명령 하단에 선언하며 자료형 위에 선언
// 이클립스에서는 다른 패키지에 작성된 자료형을 사용할 경우 import 명령을 자동 완성하는 기능
// 제공 - [Ctrl]+[Space] => 같은 이름의 자료형이 여러개인 경우 선택
// > [Ctrl]+[Shift]+[O] >> import 명령을 정리하는 단축키 : 불필요한 자료형에 대한 import
// 설정을 제거하거나 필요한 자료형에 대한 import 설정을 추가하는 기능 제공
package xyz.itwill.app;

SubjectApp 

import xyz.itwill.subject.OracleSubject;
import xyz.itwill.subject.JavaSubject;

// 자료형의 이름이 같은 경우 import 처리 불가능
// import xyz.uniwill.subject.JavaSubject;

public class SubjectApp {
    public static void main(String[] args) {
        // 같은 패키지에 작성된 클래스는 패키지 경로 표현 없이 클래스 접근 가능
        // > 형식) 클래스명
        // 다른 패키지에 작성된 클래스는 반드시 패키지 경로를 표현해야만 클래스 접근 가능
        // > 형식) 패키지경로.클래스명
        // xyz.itwill.subject.OracleSubject subject1=new xyz.itwill.subject.OracleSubject();

        // 다른 패키지에 작성된 클래스를 import 처리한 경우 패키지 경로 표현없이 클래스 접근 가능
        OracleSubject subject1 = new OracleSubject();
        subject1.display();

        JavaSubject subject2 = new JavaSubject();
        subject2.display();

        //import 설정이 불가능 자료형은 패키지 경로를 반드시 표현해야만 접근 가능
        xyz.uniwill.subject.JavaSubject subject3 = new xyz.uniwill.subject.JavaSubject();
        subject3.display();
    }
}

아이티윌 학원의 Oracle 과정입니다.
아이티윌 학원의 Java 과정입니다.
유니윌 학원의 Java 과정입니다.

 


 

package xyz.itwill.subject;

 JavaSubject 

public class JavaSubject {
    public void display() {
        System.out.println("아이티윌 학원의 Java 과정입니다.");
    }
}

 

 

package xyz.itwill.subject;

OracleSubject 

public class OracleSubject {
    public void display() {
        System.out.println("아이티윌 학원의 Oracle 과정입니다.");
    }
}

 

package xyz.uniwill.subject;

JavaSubject 

public class JavaSubject {
    public void display() {
        System.out.println("유니윌 학원의 Java 과정입니다.");
    }
}

 


package xyz.itwill.app;

(입출력)

CalcAgeApp

// 키보드로 이름과 태어난 년도를 입력받아 나이를 계산하여 이름과 나이를 출력하는 프로그램 작성
// ex) 이름 입력 >> 홍길동
// 태어난 년도 >> 2000
// [결과] 홍길동님의 나이는 24살 입니다.
import java.util.Date;
import java.util.Scanner;

// 키보드로 이름과 태어난 년도를 입력받아 나이를 계산하여 이름과 나이를 출력하는 프로그램 작성
// ex) 이름 입력 >> 홍길동
// 태어난 년도 >> 2000
// [결과] 홍길동님의 나이는 24살 입니다.
public class CalcAgeApp {
    public static void main(String[] args) {
        // Scanner 클래스로 객체를 생성하여 참조변수에 저장 ▽
        Scanner scanner = new Scanner(System.in);


        // 키보드를 이용하여 사용자로부터 이름과 태어난 년도를 입력받아 변수에 저장
        System.out.print("이름 입력 >> ");
        String name = scanner.nextLine();

        System.out.print("태어난 년도 >> ");

        int birthYear = scanner.nextInt();
        // java.util.Date 클래스로 객체를 생성하여 참조변수에 저장
        // > Date 클래스 : 날짜와 시간을 저장하기 위한 클래스
        // > Date 클래스의 기본 생성자를 사용하여 객체를 생성하면 시스템(OS)의 현재 날짜와
        //시간이 저장된 Date 객체 생성
        Date now = new Date();

        // Date.getYear() : Date 객체에 저장된 날짜와 시간에서 년도를 정수값으로 반환하는 메소드
        // > 1900년을 기준으로 1년에 1씩 증가된 정수값으로 반환
        // > @Deprecated 어노테이션이 적용된 메소드
        // @Deprecated 어노테이션 : 메소드 사용을 권장하지 않도록 설정하는 어노테이션
        // > @Deprecated 어노테이션이 적용된 메소드를 호출할 경우 경고 발생
        // @SuppressWarnings 어노테이션 : 경고 메세지를 제거하는 어노테이션
        // > value 속성을 사용하여 경고 관련 속성값을 설정
        // > value 속성외에 다른 속성이 없는 경우 속성값만 설정 가능
        // @SuppressWarnings(value = "deprecation")
        
        @SuppressWarnings("deprecation")
        int currentYear = now.getYear() + 1900;

        // 현재 년도와 태어난 년도를 이용하여 나이 계산
        // int age = 2023 - birthYear + 1;
        int age = currentYear-birthYear + 1;


        // 결과 출력
        System.out.println("[결과] " + name + "님의 나이는 " + age + "살 입니다.");

        scanner.close();
    }
}


이름 입력 >> 정대만
태어난 년도 >> 1990
[결과] 정대만님의 나이는 34살 입니다.

 


 

(접근제한자)

package xyz.itwill.access;

PrivateMember

// 접근제한자 (Access Modifier) - 클래스,필드, 메소드에 대한 접근 설정을 제한하기 위한 키워드
// > private, package(default), protected, public


// private - 클래스 내부에서만 접근 가능하며 클래스 외부에서는 접근 불가능
public class PrivateMember {
    private int num;
@SuppressWarnings("unused")
    private  void  display() {
        System.out.println("num = " + num);
    }
}

 

package xyz.itwill.access;

PrivateMemberUse

public class PrivateMemberUse {
    public void run() {
        @SuppressWarnings("unused")
        PrivateMember member = new PrivateMember();

        // private 접근제한자로 설정된 필드와 메소드에 접근할 경우 에러 발생
        // member.num=100;
        // member.display();
    }
}

 


// public - 모든 패키지의 클래스에서 접근가능하도록 설정

// public 접근 제한자를 사용하여 클래스 선언 - public 클래스
// > public 클래스로 설정된 클래스는 모든 패키지의 클래스에서 접근 가능
// > public 클래스로 설정되지않은 클래스는 다른 패키지의 클래스에서 접근 불가능
// > 하나의 소스파일에는 public class를 하나만 설정 가능

 

package xyz.itwill.access;

PublicMember

public class PublicMember { // public 에선 class 에서, 다른곳으로 끌어와서 사용가능
    public int num;

    public void display() {
        System.out.println("num = " + num);
    }
}

 

 

package xyz.itwill.access;

PublicMemberUse

public class PublicMemberUse {
    public void run() {
        PublicMember member = new PublicMember();

        member.num = 100;
        member.display();
    }
}

 

package xyz.itwill.other;

PublicMemberOtherUse

import xyz.itwill.access.PublicMember; // PublicMember에 public빠지면 임포트안됨
public class PublicMemberOtherUse {
    public void run() {
        PublicMember member = new PublicMember();

        member.num=100;
        member.display();
    }
}

 


//protected 접근 제한자 : 같은 패키지의 클래스에서 접근 가능하도록 설정
// => 다른 패키지의 클래스에서 접근 불가능
// => 다른 패키지의 클래스에서 protected 접근 제한자의 필드 또는 메소드의 클래스를 상속을
// 받은 경우 접근 가능

 

package xyz.itwill.access;

ProtectedMember

public class ProtectedMember {
    protected int num;

    protected void display() {
        System.out.println("num = "+num);
    }
}

 

package xyz.itwill.access;

ProtectedMemberUse  

public class ProtectedMemberUse {
    public void run() {
        ProtectedMember member=new ProtectedMember();

        member.num=100;
        member.display();
    }
}

 

package xyz.itwill.other;

ProtectedMemberOtherUse

import xyz.itwill.access.ProtectedMember;

public class ProtectedMemberOtherUse {
    public void run() {
        @SuppressWarnings("unused")
        ProtectedMember member = new ProtectedMember();

        //member.num=100;
        //member.display();
    }
}

 

package xyz.itwill.other;

ProtextedMemberOtherInheritanceUse

import xyz.itwill.access.ProtectedMember;

public class ProtextedMemberOtherInheritanceUse extends ProtectedMember {
    public void run() {
        num = 100;
        display();
    }
}

 

 


 

 

package xyz.itwill.access;

PackageMember

//  Package 접근제한자
public class PackageMember {
    int num;
    void display() {
        System.out.println("num = " + num);
    }
}

 

package xyz.itwill.access;

PackageMemberUse

public class PackageMemberUse {
    public void run() {
        PackageMember member = new PackageMember();

        member.num = 100;
        member.display();
    }
}

 

package xyz.itwill.other;

PackageMemberOtherInheritanceUse

import xyz.itwill.access.PackageMember;

public class PackageMemberOtherInheritanceUse extends PackageMember {
    public void run() {
        // num=100;
        // dispaly();
    }
}

 

package xyz.itwill.other;

PackageMemberOtherUse

import xyz.itwill.access.PackageMember;

public class PackageMemberOtherUse {
    public void run() {
        @SuppressWarnings("unused")
        PackageMember member=new PackageMember();

        //member.num=100;
        //member.display();
    }
}

 

 


// 패키지 - 같은 목적의 자료형을 명확하게 구분하여 그룹화 하기 위해 사용
// Java 참조형 - 클래스, 인터페이스, 열거형
// Java 자료형을 보다 쉽게 관리하기 위해 패키지 사용
// > 패키지의 이름은 도메인을 역방향으로 나열하고 그룹명을 지정하여 작성하는 것을 권장

 


// 도메인 - 인터넷에서 개인 또는 그룹이 사용하기 위한 네트워크 식별자
// ex) itwill.xyz : 도메인 >> xyz.itwill.board

// 패키지에 작성된 소스파일의 처음 위치에는 소스파일이 작성된 패키지를 반드시 명확하게 작성
// 형식) package 패키지경로;
// > Java 자료형이 어떤 패키지에서 선언된 자료형인지를 명확하게 구분하여 사용

 

// import 키워드 : 다른 패키지에 작성된 Java 자료형을 명확히 표현하여 접근하기 위한 키워드
// 형식) import 패키지경로.자료형; >> 자료형 대신 *(전체) 사용 가능
// > package 키워드로 작성된 명령 하단에 선언하며 자료형 위에 선언
// 이클립스에서는 다른 패키지에 작성된 자료형을 사용할 경우 import 명령을 자동 완성하는 기능
// 제공 - [Ctrl]+[Space] => 같은 이름의 자료형이 여러개인 경우 선택
// > [Ctrl]+[Shift]+[O] >> import 명령을 정리하는 단축키 : 불필요한 자료형에 대한 import
// 설정을 제거하거나 필요한 자료형에 대한 import 설정을 추가하는 기능 제공

 

package xyz.itwill.subject;

JavaSubject

public class JavaSubject {
    public void display() {
        System.out.println("아이티윌 학원의 Java 과정입니다.");
    }
}

 

package xyz.itwill.subject;

OracleSubject

public class OracleSubject {
    public void display() {
        System.out.println("아이티윌 학원의 Oracle 과정입니다.");
    }
}

 

package xyz.uniwill.subject;

JavaSubject

public class JavaSubject {
    public void display() {
        System.out.println("유니윌 학원의 Java 과정입니다.");
    }
}

 

package xyz.itwill.app;

SubjectApp

import xyz.itwill.subject.OracleSubject;
import xyz.itwill.subject.JavaSubject;

// 자료형의 이름이 같은 경우 import 처리 불가능
// import xyz.uniwill.subject.JavaSubject;

public class SubjectApp {
    public static void main(String[] args) {
        // 같은 패키지에 작성된 클래스는 패키지 경로 표현 없이 클래스 접근 가능
        // > 형식) 클래스명
        // 다른 패키지에 작성된 클래스는 반드시 패키지 경로를 표현해야만 클래스 접근 가능
        // > 형식) 패키지경로.클래스명
        // xyz.itwill.subject.OracleSubject subject1=new xyz.itwill.subject.OracleSubject();

        // 다른 패키지에 작성된 클래스를 import 처리한 경우 패키지 경로 표현없이 클래스 접근 가능
        OracleSubject subject1 = new OracleSubject();
        subject1.display();

        JavaSubject subject2 = new JavaSubject();
        subject2.display();

        //import 설정이 불가능 자료형은 패키지 경로를 반드시 표현해야만 접근 가능
        xyz.uniwill.subject.JavaSubject subject3 = new xyz.uniwill.subject.JavaSubject();
        subject3.display();
    }
}


아이티윌 학원의 Oracle 과정입니다.
아이티윌 학원의 Java 과정입니다.
유니윌 학원의 Java 과정입니다.

 

 



 

(예외처리) 

try catch

// 예외 - 사용자에 의해 프로그램이 잘못 실행되거나 프로그램이 잘못 개발되어 실행될 경우
// 발생되는 프로그램 오류

// > 프로그램 실행시 예외가 발생되면 예외가 발샌된 지점에서 프로그램에 깅제 종료
// > 예외가 발생되어 프로그램에 강제로 종료되는 것을 방지하거나 프로그램이 강제로 종료된
// 이유를 알기위해 예외 처리(ExceptionHandle) 필드

 


// Java에서는 예외를 처리하기 위해 다양한 예외클래스를 제공
// 예외클래스 (ExceptionHandle) - 예외 관련 정보를 저장하기 위한 클래스
// > Exception 클래스를 상속받아 작성된 자식클래스
// > 프로그램 실행시 예외가 발새오디면 예외클래스로 객체를 생성하여 제공

// Throwable 클래스 - 프로그램에서 발생되는 모든 오류정보를 저장하기 위한 부모 클래스
// > 자식클래스 : Error , Exceoption 클래스

// 예외 종류
// 1. 일반 예외 : 프로그램 실행시 예외가 발생될 가능성이 높아 컴파일시 예외 처리를 하지않은 에러 발생
// 2. 실행 예외 : 프로그램 실행시 예외가 발생될 가능성이 낮아 예외처리를 하지않아도 컴파일시
// > RuntimeException 클래스를 상속받은 클래스로 예외처리
// > 실행 예외는 예외처리를 하지않은 경우 JVM이 자동으로 예외 처리하여 예외 메시지 제공

 


// 예외 처리방법 - try ~ catch 구문사용
// 형식 ) try {
// 예외가 발생될 수 있는 명령;
// ...
// } catch(예외클래스 참조변수) {
// 예외가 발생될수 있는 명령;
// ...
// } finally {
// 예외 발생과 상관없이 무조건 실행될 명령;
// ...
// }

 


// > try 키워드로 생성된 블럭의 명령을 실행할 때 예외가 발생될 경우 JVM이 해당 예외에 대한 예외 클래스로 객체 생성
// > try 키워드로 생성된 블럭에서 발생된 예외 관련 객체를 catch 키워드로 설정된 블럭으로 전달하여
// 참조변수에 저장 - 참조변수에 저장된 옝하 관련 객체의 메소드를 호출하여 예외 처리
// > try 키워드로 생성된 블럭에서 예외가 발생되면 프로그램이 종료되지 않고, catch 키워드의 블록으로
// 프로그램의 흐름(스레드)이 이동하여 예외처리 명령 실행
// > catch키워드로 블럭을 여러개 작성 가능 - 다양한 예외를 구분하여 예외처리 가능
// finally 키워드의 블럭에는 예외 발생과 상관없이 무조건 실행될 명령 작성 - 생략 가능
// > 사용 자원에 대한 제거 명령 실행

 

ExceptionHandleApp

package xyz.itwill.exception;
public class ExceptionHandleApp {
    public static void main(String[] args) {


//        int[] array = {10,20,30,40,50}; //배열사용하는이유? 일괄처리
//
//        try {
//            // 배열요소의 첨자가 사용범위를 벗어난 경우 ArrayIndexOutOfBoundsException 발생
//            for (int i = 0; i < array.length; i++) { // for (int i = 0; i <= array.length; i++) 하면 이퀄발생(오류)
//                System.out.println("array[" + i + "] = " + array[i]); // 예외 발생
//            }
//            System.out.println("[에러] 프로그램에 예기치 못한 오류가 발생되었습니다.");
//
//
//        System.out.println("---------------------------------------------");
//        System.out.println("[메세지] 프로그램이 정상적으로 실행 되었습니다.");



        System.out.println("00000000000000000000000-------------------000000000000000000000000000000");




        int[] array = {10,20,30,40,50}; //배열사용하는이유? 일괄처리

        try {
            // 배열요소의 첨자가 사용범위를 벗어난 경우 ArrayIndexOutOfBoundsException 발생
            for (int i = 0; i < array.length; i++) { // for (int i = 0; i <= array.length; i++) 하면 이퀄발생(오류)
                System.out.println("array[" + i + "] = " + array[i]); // 예외 발생
            }
            System.out.println("[메세지] 프로그램이 정상적으로 실행 되었습니다.");
            // try에서 예외가 발생되면 catch에서 잡음

        } catch (ArrayIndexOutOfBoundsException e) { // 예외객체를 전달받아 참조변수에 저장
            // 프로그램 사용자에게 예외 관련 메시지 출력 => 선택

            // 프로그램 개발자에게 예외 관련 메세지를 기록하여 제공 - 에러 로그 > 필스
            // > 참조변수에 저장된 예외 관련 객체의 메소드를 호출하여 작성
            // Throwable.getMessage() - 예외객체에 저장된 예외 메세지를 반환하는 메소드
            System.out.println("[예외]" + e.getMessage());

            // Throwable.printStackTrace() : 예외가 발생된 경로를 역추적하여 발생된 정보를 제공받아 출력하는 메소드
            e.printStackTrace();
        } finally {
            System.out.println("[메세지] 예외 발행과 상관없이 무조건 실행될 명령");
        }
    }
}

array[0] = 10
array[1] = 20
array[2] = 30
array[3] = 40
array[4] = 50
[메세지] 프로그램이 정상적으로 실행 되었습니다.
[메세지] 예외 발행과 상관없이 무조건 실행될 명령