- 중첩 클래스의 종류
내부 클래스,. 로컬 클래스, 정적 중첩 클래스, 익명 클래스가 있다.
- 내부 클래스 (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);
}
}
}
public class Exception4 {
public static void main(String[] args) {
Exception e = new Exception("예외를 발생합니다!");
try {
throw e;
} catch (Exception ex) {
e.printStackTrace();
}
System.out.println("프로그램을 정상적으로 종료합니다!");
}
}
강제로 예외를 발생 시켰다. 빨간색은 예외처리로 나오는 문구이다.
'국비 > JAVA' 카테고리의 다른 글
DAY 10 : 스레드(Thead) (0) | 2022.10.21 |
---|---|
DAY 09 - 2 : 파일 입출력 (0) | 2022.10.13 |
DAY 08 - 2 : 컬렉션 프레임워크 (Set, Map) (0) | 2022.10.12 |
DAY 08 - 1 : 제네릭, 컬렉션 프레임 워크 ( List) (0) | 2022.10.12 |
DAY 07 : Wrapper Class, static, 추상 클래스, 인터페이스, 패키지 (1) | 2022.10.11 |