List.of , 예외 처리
목차
[ List.of();]
1. List.of();
1-1. List.of 사용 예시 1
1-2. List of 사용 예시 2
[예외처리]
2. 예외 처리 Checked Exception
2-1. 예외 처리 Unchechked Exception
2-2. 예외를 사용하지 않고, 'true or false'를 리턴하는 메소드로 수동으로 예외 처리를 해주면?
2-3. throws 키워드를 쓰는 이유
2-4. 예외 처리를 회피하기만 해서는 안된다
2-5. Custom Exception
1. List.of();
최신 자바에서 추가 된 문법
List에 .of이라는 스태틱 메소드가 있다는 것.
이 스태틱 메소드를 호출하게 되면 처음부터 add1, add2가 들어간 리스트를 만들 수 있다.
그렇게 만들면 일일이 하나하나 추가를 하는 것보다 더 깔끔하게 코드를 작성할 수 있다.
- 기존
ex)
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
1-1. List.of(); 사용 예시 1
ex)
public static void main(string[] args){
BaseballGame baseballGame = new BaseballGame(List.of('1', '2', '3', '4', '5'));
BaseballGame baseballGame2 = new BaseballGame();
1-2. List of(); 사용예시 2
ex)
List<Integer> list2 = List.of(1, 2, 3);
이런 식으로 정리하면 이 리스트2는 add를 별도로 해주지 않아도 미리 1, 2, 3이 세팅된 리스트로 만들 수가 있다.
[ 예외 처리 ]
프로그램 실행 중에 발생할 수 있는 예기치 않은 상황을 대비하여 예외 상황을 처리하는 것
Checked Exception vs Unchecked Exception
2. Checked Exception :
무조건적으로 예외처리를 하게끔 만들어둔 Exception종류.
이 Checked Exception이 발생하면 이걸 무조건 트라이 캐치를 통해서 처리를 해야하고
그렇지 않으면 컴파일조차 안된다고 예외를 처리하게끔 강제하는 것.
2-1. Unchechked Exception :
처리를 해도 되고 안해도 되는 종류
자바에서는 코드 작성 시 컴파일러가 다양한 검사를 수행한다.
그중 하나가 예외 처리를 명시적으로 강제하는 것.
//checked exception//을 사용하면, 개발자가 예외가 발생할 수 있다는 것을 인지하고
처리할 수 있게 강제 할 수 있다. 이리하면 런타임에 예상하지 못한 예외가 발생될 가능성을 줄일 수 있다.
2-2.
[[ 예외를 사용하지 않고, 'true or false'를 리턴하는 메소드로 수동으로 예외 처리를 해주면?]]
[ 오류의 원인을 파악하기 어렵다. ]
- 입력 값이 유효하지 않은 이유 (잘못된 문자, 빈 문자열 등)를 파악하기 어려워 디버깅이 어렵다.
- 다양한 오류 상황에 맞게 세분화된 처리 방식을 적용하기 어렵다.
우리는 다양한 에러 상황을 '구분' 해야될 필요가 있다.
[ 상위 호출자가 에러 처리를 강제당하지 않는다. ]
- 예외는 호출자에게 오류가 발생했음을 확실하게 알릴 수 있고, 'throws'를 통해 반드시 예외 처리를 하도록
강제할 수 있지만, 'true/false'는 // 강제성이 없다. //
2-3. [ throws 키워드를 쓰는 이유 ]
- throws를 쓰는 이유는 사실상 예외처리를 '회피'하는 것이다.
예외 처리를 예외가 발생한 메소드를 호출하는 쪽에서 하게 만드는 것.
지금 당장은 이 예외를 처리를 안할거고 대신에 나를 호출하는 쪽은 이 예외가 발생할 수도 있으니까
너가 해! < 회피, 나를 호출하는 쪽이 처리를 해줬으면 좋겠어. 라는 의미로 throws를 사용.
2-4. [ 예외 처리를 회피하기만 해서는 안된다 ]
throws로 예외를 계속 미루기만 한다면, 실제로 그 예외를 처리할 주체가 누구인지 모르게된다.
그래서 결국에는 예외를 처리할 주체가 누군가는 있어야한다. 계속해서 throws로 미룰 수는 없고
누군가는 예외를 처리해야 한다.
결국 최상위 메서드까지 예외가 전달되면, 그곳에서 예외를 처리하지 않으면 프로그램이 비정상적으로 종료된다.
따라서 언젠가는 try ~ catch를 사용해서 예외를 '복구' 해주어야 한다.
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
InputValidator inputValidator = new InputValidator();
while (true) {
System.out.println("숫자 3개를 입력하세요: ");
String input = scanner.nextLine();
try { // 예외가 발생할 수도 있는, 문장을 여기 아래에 넣음
inputValidator.validateInput(input);
} catch (InvalidInputException e) { // 예외가 발생했을 때, 어떻게 할 것인지를 정의
System.out.println("유효하지 않은 입력값 발생: " + e.getMessage());
continue;
} catch (Exception e) {
System.out.println("예상하지 못한 예외 발생: " + e.getMessage());
break;
}
System.out.println("결과: >>> ");
}
}
}
결론 - throw는 예외를 당장 처리하지 않고 미룬다(회피한다).
try ~ catch를 사용하면 예외가 발생할 수 있는 코드를 복구해서 예외가 발생했을 때
다시 입력을 받게 만들 수도 있고, 프로그램 종료 처리를 한다던지 각각 다른 케이스로 핸들링 할 수 있다.
try ~catch를 사용해서 예외를 복구할 수 있다.
2-5. Custom Exception
모든 예외 클래스는 Exception 클래스를 상속을 받고 있는 상태여야 한다.
상속을 받을 때
> RuntimeException을 상속 받게 되면 Unchecked Exception (예외처리가 강제되지 않는 Exception) 을 만들게 되고
> Exception을 상속받게 되면 강제를 하는 Checked Exception을 만들게 된다.