예외의 종류
- Checked Exception : 컴파일 시점에 확인되는 예외이며, 반드시 예외 처리를 해줘야 하는 예외
- Unchecked Exception : 런타임 시점에 확인되는 예외이며, 예외 처리가 반드시 필요하지 않는 예외
컴파일
- 프로그래밍 언어로 작성한 코드가 컴퓨터가 이해할 수 있는 언어로 변환되는 것
컴파일 에러
- 대부분 자바 프로그래밍 언어의 규칙을 지키지 않았을 때 발생
- 해결 방법 : 문법에 맞게 다시 작성한다
런타임 에러
- 문법적인 오류가 아닌, 프로그램이 실행 도중 맞닥뜨리는 예외
throw & throws (메서드가 위험하다는 것을 미리 예측)
- 개발자가 직접 예외를 발생시키고 싶을 때 사용하며, throw는 예외 내용을 던져주지 않기 때문에 직접 예외를 만들어서 사용
- throws : 메서드 이름 뒤에 붙으며, 이 메서드가 어떤 예외사항을 던질 수 있는지 알려주는 예약어
- throw : 메서드 안에서 실제로 예외 객체를 던질 때 사용하는 예약어이며, 실제로 던지는 예외 객체 하나와 같이 써야함
try ~ catch ~ finally
- try : try 블럭 내에 있는 로직을 일단 실행을 시도함
- catch(예외 클래스) : 로직 실행중 예외가 발생하면 catch 블럭 내의 코드가 실행됨
- finally : 예외 발생 여부와 상관없이 무조건 실행시켜야 하는 코드가 들어감
Throwable Class
- 시작은 모든 객체의 원형인 Object에서 시작한다.
- 문제 상황을 뜻하는 Throwable Class가 Object Class를 상속받는다.
- Throwable Class의 자식으로는 Error와 Exception 클래스가 있다.
- Error와 Exception 클래스는 각각 IOError(입출력 에러) 클래스, RuntimeException 클래스와 같이 구분해 처리된다.
- RuntimeException을 상속받은 예외는 UnCheckedException, 상속받지 않은 예외는 CheckedException 으로 구현돼있다.


Chained Exception (연결된 예외)
- 연결하는 이유 : 여러 가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함
- initCause() : 지정한 예외를 원인 예외로 등록하는 메서드
- getCause() : 연결 예외를 반환하는 메서드
Generic
효용 : 중복되거나 필요 없는 코드를 줄여주면서도 타입 안정성을 해치지 않음
문법 : public class 클래스명 { ... }
static을 사용할 수 없으며(Type 변수는 인스턴스 변수로 간주되기 때문), 제네릭 배열을 생성 할 수 없다.
public class Generic<T> {
private T t; // 변수명 T는 Type 변수
public T get() {
return this.t;
}
public void set(T t) {
this.t = t;
}
public static void main(String[] args) {
// 타입 변수를 String으로 사용
Generic<String> stringGeneric = new Generic<>();
stringGeneric.set("Hello World");
}
}다수의 타입 변수를 사용할 수 있다.
public class Generic<T, U, E> {
public E multiTypeMethod(T t, U u) { ... }
}
Generic<Long, Integer, String> instance = new Generic();
instance.multiTypeMethod(longVal, intVal);
상속과 타입의 관계는 그대로 적용됨
와일드카드를 통해 제네릭의 제한을 구체적으로 정할 수 있음
public class ParkingLot<T extends Car> { ... } // Car 클래스를 상속한 클래스만 사용가능
ParkingLot<BMW> bmwParkingLot = new ParkingLot();
ParkingLot<Iphone> iphoneParkingLot = new ParkingLog(); // error!