- 중첩 클래스의 종류

내부 클래스,. 로컬 클래스, 정적 중첩 클래스, 익명 클래스가 있다.

 

 

- 내부 클래스 (Inner Class)

클래스 또는 메소드 안에 또 다른 클래스를 생성하는 것을 의미한다.

내부 클래스는 외부 클래스의 모든 멤버를 자신의 멤버처럼 사용할 수 있다.

static 내부 클래스를 제외한 내부 클래스는 항상 외부 클래스 객체를 통해서 생성하게 된다.

 

 

- 로컬 클래스 (Local Class)

메소드 안에서 정의된 클래스 (메소드 안에서만 사용이 가능하다.)

외부 클래스의 모든 멤버에 접근이 가능하다. (private도 접근 가능)

 

 

- 정적 중첩 클래스 (Static Class)

내부 클래스가 static으로 정의된 경우를 의미한다.

외부 클래스에 관계없이 객체를 만들 수 있다.

 

 

- 익명 클래스 (Anonymous Class)

클래스를 정의하지 않고 객체를 정의할 때 사용한다.

1회용이므로 재활용이 불가능하다.

 


내부 클래스, 정적 중첩 클래스, 로컬 클래스 사용해보기!

 

내부 클래스

package day09;

class OuterClass {
    private int num1 = 10;

    public void method1() {
        System.out.println("num1 : " + num1);
    }

    public void printInner() {
        InnerClass inner = new InnerClass();
        inner.method2();
    }
    public class InnerClass {
        private int num2 = 20;

        public void method2() {
            System.out.println("OuterClass.num1 : " + num1);
            System.out.println("InnerClass.num2 : " +  num2);
        }
    }

}

public class InnerClass {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();

        outer.method1();
        outer.printInner();
        System.out.println("----------------------------------");

        // 내부 클래스 객체를 만드는 방법 (외부클래스 객체가 있어야 가능)
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.method2();
    }
}

위 코드의 결과

내부 클래스의 경우, 따로 InnerClass inner = new InnerClass(); 로 객체를 만들 수없다. 그래서 OuterClass를 통해 만드는 것이다.

 


 

정적 중첩 클래스

package day09;

public class StaticClass {
    public static void print() {
        System.out.println("static 메소드");
    }

    static class Static1 {
        int num = 0;

        public int add() {
            num++;
            return num;
        }
    }

    public static void main(String[] args) {
        print();
        StaticClass.print();

        StaticClass.Static1 static1 = new StaticClass.Static1();
        System.out.println(static1.add());
    }
}

위 코드의 결과

위 코드에서 static이 붙은 print()메소드는 따로 객체를 생성하지 않아도 사용이 가능하다.

일반 클래스안에 static class를 정의하게 되면 객체 생성시에는 내부 클래스와 동일하다.

 


 

로컬 클래스

package day09;

public class LocalClass {
    private int num1 = 10;

    public void method1() {
        int num2 = 20;

        class Local {
            private int num3 = 30;

            private final int num4 = 40;

            public void method2() {
                System.out.println("num1 : " + num1);
                System.out.println("num2 : " + num2);
                System.out.println("num3 : " + num3);
                System.out.println("num4 : " + num4);
            }
        }
        Local local = new Local();
        local.method2();
    }

    public static void main(String[] args) {
        LocalClass localclass = new LocalClass();
        localclass.method1();
    }
}

위 코드의 결과

method1() 안에 Local이라는 클래스를 만들고 그 안에 필드와 메소드를 선언해준다. 그리고 method1() 안에서 Local 클래스의 객체를 만들고, method2()를 호출해주면 메인 메소드에서 LocalClass의 객체를 통해 method2()을 출력할 수 있다. 

 

 


 

- 예외처리 (Exception)

문법에 맞게 작성되었다 하더라도 프로그램을 실행하면서 예상치 못한 오류가 발생한다.

프로그램 실행 중 비정상적으로 종료된다.

예측할 수 있는 예외, 예측 못하는 예외로 나뉜다.

 

 

✔️ 예외가 발생하는 원인

사용자가 잘못된 데이터를 입력하는 경우

개발자나 로직이나 계산을 잘못한 경우

하드웨어나 네트워크가 제대로 동작하지 못하는 경우

악의적으로 잘못된 연산을 요구하거나 시스템을 공격하는 경우

 

 

- 예외의 종류

 컴파일시에 예외 발생

 런타임시에 예외 발생

 

 

- 예외처리 코드

try {
    실제 코드가 들어가는 곳으로 예외 상황이 발생할 가능성이 있는 코드
    ...
    예외 발생 !
    ...          // 예외 발생 시, 진행 안함
} catch(예외객체타입1 참조변수1) {
    ...
    try 블록에서 예외 객체 타입1의 Exception 이 발생하면 오는 곳
    해당 코드를 실행 후 에러없이 벗어남
    ...
}catch(예외객체타입2 참조변수2) {
    ...
    try 블록에서 예외 객체 타입1의 Exception 이 발생하면 오는 곳
    해당 코드를 실행 후 에러없이 벗어남
    ...
}catch(예외객체타입3 참조변수3) {
    ...
    try 블록에서 예외 객체 타입1의 Exception 이 발생하면 오는 곳
    해당 코드를 실행 후 에러없이 벗어남
    ...
} [finally {
    try 블록에서 Exception 발생과 관계없이 무조건 실행되는 코드 (옵션)
}]

 

 

- 강제로 예외를 발생시키는 방법

 Exception 참조변수 = new Exception("예외가 발생하면 출력될 문자열");
 	...
 	...
	throw 참조변수;      // 예외 발생

 

 

✔️ throw 

강제로 예외를 발생시키고자 할 때 사용한다.

현재 메소드의 예외를 처리한 후 상위 메소드에 예외 정보를 전달한다.

 

 

✔ throws

현재 메소드에서 자신을 호출한 상위 메소드로 예외를 발생시킨다.

사용하는 메소드를 호출한 상위 메소드에서 예외처리에 대한 책임을 맡긴다.

 

 


예외 처리 사용해보기!

 

package day09;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Exception1 {
    public static void main(String[] args) {
//  Scanner 로 입력을 받아 해당 데이터가 숫자면 숫자를 출력, 문자면 -1을 출력하는 프로그램을 만들어보자
        Scanner sc = new Scanner(System.in);
        try {
            System.out.println("숫자를 입력하세요.");
            int num = sc.nextInt();
            System.out.println("숫자 : " + num);
        } catch (InputMismatchException ime) {
            System.out.println(-1);
        }
    }
}

 

위 코드의 결과_1

 

위 코드의 결과_2

 

 


 

public class Exception4 {
    public static void main(String[] args) {
        Exception e = new Exception("예외를 발생합니다!");

        try {
            throw e;
        } catch (Exception ex) {
            e.printStackTrace();
        }

        System.out.println("프로그램을 정상적으로 종료합니다!");

    }
}

위 코드의 결과

강제로 예외를 발생 시켰다. 빨간색은 예외처리로 나오는 문구이다.

복사했습니다!