try catch 문은 프로그래밍을 하다가 코드에서 오류나 발생 할 것 같은 예외상황을 경우를 미리 예상을 하고 만들어 놓는 것이다.
try catch 문은 문제 상황에 대한 정의 및 구분을 할 줄알아야한다.
문제상황의 구분은 회복 가능 여부를 판단 해야한다.
오류 : 회복이 불가능한 문제
예외 : 일반적으로 회복이 가능한 문제
예외 처리 전 컴파일 에러와 런타임 에러의 개념
컴파일 에러
자바 파일을 class 파일로 컴파일할 때 발생
런타임 에러
프로그램 실행도중에 맞닥뜨리게 되는 예외
예외의 종류
확인된 예외 - 컴파일 시점에 확인한다.

미확인된 예외
런타임 시점에 확인되는 예외
예외 처리가 반드시 필요하지 않은 예외
예외 발생과 try-catch, finally 문

우리가 메서드를 선언 할 때, 이 메서드가 위험하다는것을 미리 예측해야 합니다.
그리고 예측이 되어 있다면, 실제로 throw 키워드와 함께 이 메서드가 위험하다고 알려야 합니다.
try catch를 사용하는 이유
public class StudyException {
public static void main(String[] args) {
OurClass ourClass = new OurClass();
try {
// 1. 위험한 메소드의 실행을 "시도" 해 봅니다.
// "시도" 해보는 코드가 들어가는 블럭입니다.
ourClass.thisMethodIsDangerous();
} catch (OurException e) {
// 2. 예외가 발생하면, "잡아서" handling 합니다.
// 예외가 발생하는경우 "handling" 하는 코드가 들어가는 블럭입니다.
// 즉 try 블럭 내의 구문을 실행하다가 예외가 발생하면
// 예외가 발생한 줄에서 바로 코드 실행을 멈추고
// 여기 있는 catch 블럭 내의 코드가 실행됩니다.
System.out.println(e.getMessage());
} finally {
// 3. 예외의 발생 여부와 상관없이, 실행시켜야 하는 코드가 들어갑니다.
// 무조건 실행되는 코드가 들어가는 블럭입니다.
System.out.println("우리는 방금 예외를 handling 했습니다!");
}
}
}

자식을 먼저 처리를 해주고 부모를 처리 해야지 순서대로
처리가 됨
이처럼 범위가 더 좁은 예외를 처리하는 catch 블록을 먼저 명시하고, 범위가 더 넓은 예외를 처리하는 catch 블록은 나중에 명시해야만 정상적으로 해당 예외를 처리할 수 있습니다.
1. try 문 : 예외가 발생할 가능성이 있는 코드 블록
2. throw 문 : try 문에서 발생한 오류에 대한 정보를 전달
3. catch 절 : 발생한 예외에 대해 예외 핸들러가 처리할 내용을 담은 코드 블록
try {
예외를 처리하길 원하는 실행 코드;
} catch (e1) {
e1 예외가 발생할 경우에 실행될 코드;
} catch (e2) {
e2 예외가 발생할 경우에 실행될 코드;
}
...
finally {
예외 발생 여부와 상관없이 무조건 실행될 코드;
}
public class Exception01 {
public static void main(String[] args) {
byte[] list = {'a', 'b', 'c'};
System.out.write(list);
}
}
write 함수에 대한 예외를 처리하지 않아서 오류가 남
byte[] list = {'a', 'b', 'c'};
try {
System.out.write(list); a b c 출력
} catch (IOException e) {
e.printStackTrace();
}
try {
System.out.write(list);
} catch (IOException e) {
e.printStackTrace(); // 자식 클래스 ioexception
} catch (Exception e) {
e.printStackTrace(); // io의 부모 exception
}

제네릭
제네릭 예제
public class Generic {
// 2.
private T t;
// 3.
public T get() {
return this.t;
}
public void set(T t) {
this.t = t;
}
public static void main(String[] args) {
// 4.
Generic stringGeneric = new Generic<>();
// 5.
stringGeneric.set("Hello World");
String tValueTurnOutWithString = stringGeneric.get();
System.out.println(tValueTurnOutWithString);
}
}
타입을 유연하게 다루는 generic
c++을 통해서 객체지향을 공부를 했던 사람이라면 템플릿이 기억이 날 것이다.
제네릭은 템플릿과 아주 유사하다. <타입>이 들어간다. 템플릿을 통해서 우리가 어떤 자료형을
미리 넣을지는 모르니 <>하고 안에 우리가 원하는 타입을 선언을 할 수 있게 해준다.
제네릭의 장점
중복되거나 필요없는 코드를 줄여주는 것
타입 안정성을 해치지 않는 것

