※복습
로컬 클래스
- 메서드 안에 클래스 정의한 것
- 메서드 내부 지역 변수 선언 시 상수로 처리되도록 final 예약어를 의무적으로 붙여줘야 했지만, JDK 1.8 이후부터 컴파일러에 의해서 final 예약어가 내부적으로 추가된다.
🎇익명 클래스(객체)
- 일반적으로 일회성으로 사용할 객체를 사용할 때 사용함.
- 이름 자체의 의미는 '이름 없는 객체'로서, 추상 메서드를 구현한 객체를 말한다.
익명 객체 생성 조건
- 클래스 상속 또는 인터페이스의 추상 메서드를 구현해야 생성이 가능하다.
- 메서드 내부(local) 또는 멤버 변수 위치에서 생성이 가능하다.
익명 객체 생성
추상클래스타입 변수 = new 추상클래스() { 구현 코드 }
인터페이스타입 변수 = new 인터페이스() { 구현 코드 }
- 메서드의 매개변수가 추상 클래스(인터페이스) 타입으로 선언된 경우, 메서드 호출 시 추상 클래스(인터페이스) 내부에 선언된 추상 메서드를 구현해줘야 생성이 가능하다.
- 메모리 관점에서 보면, 힙에 생성되었다가 참조가 끊기면 GC(Garbage Collector)에 의해 삭제된다.(재사용이 불가능하다.)
익명 객체 구현 방법
- 인터페이스 타입의 필드 또는 변수를 선언하고 구현 객체를 초기값으로 대입한다.
Ex)
public interface Person{
void wake();
}
Person field = new Person() { // 멤버 변수에 구현 객체 초기값으로 대입.
void work() {
System.out.println("출근합니다.");
}
@Override
void wake() {
System.out.println("아침 6시에 일어납니다");
work();
}
};
- 메서드 내부에 지역변수로서 인터페이스 타입의 필드 또는 변수를 선언하고 구현 객체를 초기값으로 대입.
Ex)
void method1() {
Person localVar = new Person() {
void walk() {
System.out.println("산책합니다.");
}
@Override
void wake() {
System.out.println("아침 7시에 일어납니다.");
walk();
}
};
localVar.wake();
}
- 메서드 매개변수로서 인터페이스 타입의 필드 또는 변수를 선언하고 메서드 호출 시 구현 객체를 매개값으로 대입.
Ex)
public class Anonymous{
void method2(Person person) {
person.wake();
}
}
Anonymous anony = new Anonymous();
anony.method2(
new Person() {
void study() {
System.out.println("공부합니다.");
}
@Override
void wake() {
System.out.println("8시에 일어납니다.");
study();
}
}
);
익명 객체 로컬 변수 사용
- 메서드 내 변수값은 메서드 내 로컬 클래스 객체 안에서 사용될 경우 final로 선언된다.
- 이는 멀티 스레드 사용 시 하나의 스레드 내 지역 변수를 다른 스레드에서 사용 시 final 변수를 복사하여 사용하도록 해주어 실제 final 변수 값에는 변화가 없도록 해주기 위해 final 변수로 선언해준다.
🎇예외 처리
- 프로그램 실행 시 예외가 발생하지 않고 정상 실행되도록 처리하는 것.
- 에러(Error) : 컴퓨터 하드웨어 오동작 또는 고장으로 인해 응용프로그램 실행에 오류가 발생하는 것.
- 예외(Exception) : 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류.
- 자바는 예외가 발생할 가능성이 높은 코드를 컴파일 시 예외 처리 유무를 확인한 뒤 컴파일 예외 처리가 되지 않은 경우 컴파일 되지 않도록 해준다.
예외 클래스
예외와 예외 클래스
-
일반 예외 : RuntimeException이 아닌 Exception ( 컴파일 시 예외 발생 )
-
실행 예외 : RuntimeException ( 실행 도중에 예외 발생 )
-
JVM은 프로그램 실행 도중 예외 발생 시 예외 클래스로 객체를 생성한 다음 예외 처리 코드에서 예외 객체를 사용할 수 있도록 해준다.
RuntimeException 종류
NullPointerException
- 가장 빈번한 실행 예외로서, 객체 참조가 없는 상태에서 객체 사용 시 발생.
ArrayIndexOutOfBoundsException
- 배열에 없는 인덱스의 값을 사용한 경우 발생.
- 메서드의 매개변수 및 연산 시 연산되는 변수 타입을 잘못 사용한 경우 발생.
ClassCastException
- 대입된 객체와 다른 클래스 타입으로 변환할 경우 발생.
예외 처리
예외 처리 코드
- try-catch-finally
- try{ 예외 발생 코드}
- catch { 예외 처리 코드}
- finally { 예외 발생 여부와 상관없이 실행되는 코드 }
예외 발생시 실행 순서
예외 발생하지 않을 때 실행 순서
finally 사용 이유
- 예외 처리와 무관하게 실행되야 하는 코드 작성 시 사용.
- finally 구문은 생략이 가능함.
예외 종류에 따른 처리 코드
다중 catch
- 발생되는 예외별로 다르게 처리하고 싶은 경우 사용.
catch 순서
- 상위 예외 클래스가 하위 예외 클래스보다 아래에 위치해야 한다.
- 만약, 상위 예외 클래스가 상단에 위치하면 하위 클래스는 catch 될 확률이 거의 없다.
- 일반적으로 Exception(상위 예외 클래스)으로 예외 처리하기 보다는 예외마다 하위 예외클래스 단위로 처리해 주는 것이 좋다.
예외 떠넘기기 : throws
- 메서드 선언부에서 발생한 예외를 메서드 호출하는 곳에서 처리하도록 예외를 전가하는 것.