일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 개발자기술면접
- 운영체제
- jpa
- 스프링부트 테스트코드
- 테스트코드
- 트랜지스터
- 기술면접
- 자바스크립트
- 스프링부트
- 내가해냄
- Flexbox
- 어찌저찌해냄
- 스프링부트와 AWS로 혼자 구현하는 웹서비스
- 오늘도
- 그래도일단
- 스프링부트와 AWS로 혼자 구현하는 웹 서비스
- AWS EC2 구현
- 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 2장
- CS
- 스프링 부트와 AWS로 혼자 구현하는 웹 서비스
- Today
- Total
개발 공부
Java Day14 : 예외 처리, Wrapper 클래스 본문
예외 상황 설정하기
// Exception 클래스 상속
public class FileFormatException extends Exception{
public FileFormatException (){
// super 호출
super();
}
public FileFormatException (String s){
super(s);
}
}
// 예외 상황이 발생하면 throw
throw new FileFormatException("Your file is not well formatted")
Exception 클래스를 상속 받고 생성자를 만든 다음
생성자 안에서 super()를 호출하면 예외 상황에 대한 클래스를 만들 수 있다.
이후 상황이 발생했을 때 throw를 사용하면 그 예외 상황의 이름으로 에러가 발생하게 됨
-> 예외 상황의 이름을 적절하게 설정하면 코드에 오류가 나서 디버깅 할 때 고쳐야 할 부분에 대한 힌트를 얻을 수 있다.
예외를 만나도 프로그램이 강제 종료 되지 않게끔 예외처리 하기
그때 쓰는 것이 try와 catch인데, 메인 클래스가 실행을 하다가 오류를 만나면 catch문에 클래스 형태로 오류 전달
try{
예외가 발생할 소지가 있는 코드를 이 안에 작성
}catch(발생된 예외에 대한 클래스와 매개변수){
예외 발생시 실행되는 코드
}finally{
예외일 경우에만 처리하는 catch와는 다르게 예외 발생 유무 상관없이 무조건 실행
}
try {
System.out.print("a = ");
int num1 = sc.nextInt(); <- 정수 입력해야 하는데 문자열이 들어오면 예외 발생할 수 있음
System.out.print("b = ");
int num2 = sc.nextInt(); <- 정수 입력해야 하는데 문자열이 들어오면 예외 발생할 수 있음
System.out.println("a / b = " + num1 / num2); <- 0이 들어왔을 경우 나눌 수 없음
}catch(ArithmeticException e) {
System.out.println("0으로 나누었어요!");
}
catch(InputMismatchException e){
System.out.println("문자가 들어왔어요!");
}finally {
sc.close();
}
다양한 오류가 있는데 나는 일단 이 정도만 알고 있으면 될 것 같다.
NullPointerException : 객체 참조가 없는 상태 (null값을 갖는 참조 변수에 접근하려 했을 때)
ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과할 경우
ClassCastException : 클래스를 잘못 호출했을 때
ArithmeticException : 수에 관련된 예외
InputMismatchException : 입력된 값이 입력받아야 하는 값의 자료형과 맞지 않을 때
throwable
예외 클래스의 조상되심
그 밑에 있는 자식 클래스 3개
1. Error : 이건 뭐 개발자가 어떻게 할 수 없는 노답 상태
2. Exception
3. RuntimeException
throws
예외 떠넘기기
public class Exception3 { public static void main(String[] args) throws Exception { md1(3); System.out.println("프로그램 종료"); } public static void md1(int n) throws Exception { md2(n, 0); } public static void md2(int n1, int n2) throws Exception { int r = n1 / n2; } } |
실행 순서 : md1(3)을 찾아가기 -> md2(n, 0)을 찾아가기 -> md2의 나눗셈이 예외가 되므로 여기부터 throws 달아줌
throws Exception : 예외 전가하기 -> 얘를 호출하는 애한테 예외를 전가함
throws Exception : 또 예외 전가
throws Exception : 더 이상 전가할 곳 없음. 최종적으로 메인메소드까지 오면 컴파일러한테 넘겨줌.
컴파일러는 예외 처리 할 줄 모르기 때문에 걍.. 예외로 보냄
Wrapper
: JVM은 기본 자료형에 대해서 정확하게 필요한 만큼의 메모리를 할당하지만 객체에 대해서는 이 객체가 가리키는 4byte짜리 포인터와 힙의 공간을 할당함.
따라서 기본 자료형은 객체가 아니고, Object 메소드를 상속 받지 않음.
그런데 Java에는 기본 자료형뿐 아니라 래퍼 클래스라는 것이 존재함.
래퍼 클래스는 객체 버전의 기본 자료형이다.
int -> Integer
byte -> Byte
short -> Short
char -> Char
boolean -> Boolean
Java는 Autoboxing을 이용하여 이 둘 사이를 적절하게 서로 바꿔줌
public static void showData(Object obj) {
System.out.println(obj);
}
}
매개변수의 Object obj : 모든 자료형을 다 받겠다는 뜻. 근데 기본 자료형은 클래스가 아니라서 못 들어옴. 그럼에도 불구하고 넣고 싶다면 기본 자료형을 클래스화 하면 됨. 이때 쓰는 것이 Wrapper
Integer a = showData(a); double b = |
정수형 래퍼 클래스는 Integer, 실수형 래퍼 클래스는 Double
저렇게 변수 a, b를 new 연산자를 통해 래퍼 클래스의 인스턴스로 만들어주면 참조 자료형이 됨.
그래서 위의 showData() 사용 가능!
a는 10이라는 값이 들어가 있는 참조 자료형이 되고, b는 10.5라는 값이 들어가 있는 참조 자료형이 되는 것
Integer c = 20; |
new 연산자로 객체를 생성 하지 않아도 컴퓨터는 알아서 위의 방법처럼 생각함
이러한 과정, 기본 자료형을 래퍼 클래스화 시키는 과정을 박싱(Boxing)이라고 함
showData(10); |
근데 사실 매개변수 자리에 정수 10을 바로 넣어도 에러는 안 뜸
왜냐? 컴파일러가 알아서 해 줌. 이렇게 자동으로 래퍼 클래스화 되는 것을 auto boxing이라고 함
int d = a.intValue(); |
이거는 다시 기본 자료형으로 바꾸는 메소드
int e = a; |
a는 현재 인티저라는 클래스형이고 e는 기본자료형인데 대입 가능
근데 그냥 이렇게 해도 알아서 intValue()써서 처리해 줌...
이렇게 자동으로 박싱된 게 벗겨지면 auto unboxing이라고 함
+ 220805 래퍼클래스, 예외 상황 설정에 대한 설명 추가
참고 :
학원 수업
https://www.youtube.com/watch?v=zgCnMvvw6Oo&list=PLpPXw4zFa0uKKhaSz87IowJnOTzh9tiBk
'Java' 카테고리의 다른 글
Java 람다 (0) | 2022.07.28 |
---|---|
옵셔널(Optional) : null 체크 (수정 중) (0) | 2022.05.18 |
제네릭, Comparable 인터페이스 (0) | 2022.05.15 |
Java Day15 : 컬렉션 프레임워크 (0) | 2022.01.19 |
Java Day 03 : 반복문 (while, for) (0) | 2021.12.31 |