개발하는 삶

[Java] 예외, 래퍼 클래스 본문

Java

[Java] 예외, 래퍼 클래스

삶_ 2022. 6. 25. 13:20

 

 

 

 

예외와 예외클래스

  • 에러 : JVM 실행에 문제가 생겼다는 뜻
  • 예외 : 사용자의 잘못된 조작/개발자의 잘못된 코딩으로 인해 발생하는 오류
    • 모든 예외는 예외처리가 필요하다
    • 모든 예외클래스는 java.lang.Exception 클래스를 상속받음

 

 

NullPointerException

  • 객체가 없는 상태(null)에서 객체를 사용하려 하면 예외 발생

ArrayIndexOutOfBoundsException

  • 배열에서 인덱스 범위를 초과하여 사용할 때 예외 발생

NumberFormatException

  • 문자열 내에 숫자로 변환 될 수 없는 문자가 포함될 때 예외 발생 ("a100" 과 같은것)

ClassCastException

  • 상위클래스 - 하위클래스, 인터페이스 - 구현클래스 관계가 아닌데 형변환 할 때 예외 발생

 

 

 

예외처리

try {    // if문과 달리 {}괄호 생략 불가
 //예외가 발생 가능한 문장들
} catch (Exception e1) {   //e1는 참조변수를 의미
	// Exception1이 발생할 경우, 처리하기 위한 문장
} catch (Exception e2) {
	//..
} catch (Exception e3 | Exception e4) { //catch를 여러개 쓰고싶다면 |을 활용!
	//..
} finally { //예외처리를 떠나 무조건 실행되는 문장
	//..
}
리턴타입 메소드명(매개변수) throws 예외클래스1, ... { //예외클래스 여러개도 가능
}

//예외처리 불러오기
public void method1 throws ClassNotFoundException {
	method2();
}


//예외 발생시키기
throws new XXXException(); //사용자 정의 예외발생

//try-catch 문으로 예외를 처리하기보단 예외를 호출한 곳에서 throws로 예외를 떠넘긴다
public void method() throws XXXException {
	throw new XXXException("메세지");
}

 

 

사용자 정의 예외처리

  • 자바 표준 API에 없는 예외를 사용자가 정의해 처리하는 것
public class XXXException extends [Exception | RuntimeException]{
	//보통 생성자 2개를 선언 (기본생성자,
    //예외메세지를 전달하기 위한 String타입의 매개변수를 갖는 생성자)
}

printStackTrace()

  • 예외발생 당시에 호출스택에 있었던 메서드의 정보와 예외 메세지를 화면에 출력한다
  • a.printStackTrace()

getMessage()

  • 발생한 예외 클래스의 인스턴스에 저장된 메세지를 얻을 수 있다
  • a.getMessage()

 

 

 

래퍼 클래스

  • 8개의 기본형 값을 감싸는 클래스
    • 감싸고있는 기본타입은 외부에서 변경 불가능
  • 8개의 기본 타입에 해당하는 데이터를 객체로 포장해줌
    • boolean -> Boolean
    • char -> character
    • byte -> Byte
    • short -> Short
    • int -> Integer
    • long -> Long
    • float -> Float
    • double -> Double
  • 다시 기본타입으로 반환할때
    • 기본타입명+Value() 호출
    • obj.charValue()
  • 문자열 -> 기본타입
    • byte num = Byte.parseByte("10");
    • int num = Integer.parseInt("10");
  • 연산자 == != 보다는 equals() 메서드를 사용하자
    • Integer obj1 = 300;
    • Integer obj2 = 300; 일때
    • obj1.equals(obj2) 으로 계산하기 = true

 

 

Random 클래스

  • Random(5) 
    • Random random = new Random(5);   //0~5 까지 수중에 하나 뽑아주는 랜덤객체 생성
  • 메서드
    • random.nextBoolean()  //boolean타입의 난수를 리턴
    • random.nextdouble()  //double타입의 난수를 리턴
    • random.nextInt()  //int 타입의 난수를 리턴 (int 허용범위 안에있음)
    • random.nextInt(n)  //int 타입의 난수를 리턴 (0 <= 값 <n)

 

 

 

Optional <T>

  • T 타입 객체의 래퍼클래스
  • null을 직접 다루는 것은 위험함 - NullpointException이 발생할 수 있음
    • null체크 - if문을 이용.(코드가 지저분해짐. -> 그래서 간접적으로 null을 다뤄야함)
    • Optional 객체를 이용해 확인하기 (<T> = 모든 종류의 객체 저장 가능)
    • 중간에 null인지 아닌지 확인하는 과정을 거친다
public final class Optional<T>{
	private final T value; //T타입의 참조변수
    ...
}
  • Optional <T> 객체 생성하기
    • null 가능성이 있을 때, ofNullable() 을 사용
String str = "abc";
Optional<String> optVal = Optional.of(str) // 가능.
Optional<String> optVal = Optional.of("abc")  // 가능.
Optional<String> optVal = Optional.of(null) // 불가능. NullPointerException이 발생
Optional<String> optVal = Optional.ofNullable(null) // 가능. null인지 확인하는 법.
  • null 대신 빈 Optional <T> 객체를 사용하자
Optional<String> optVal = null;  // null로 초기화는 바람직하지 않음.
Optional<String> optVal = Optional.<String>empty(); // 빈 Optional 객체로 초기화해야함
Optional<String> optVal = Optional.empty(); // 위와 의미는 같음. <String> 생략해도 됨

 

 

Optional<T> 객체의 값 가져오기

  • get(), orElse(), orElseGet(), orElseThrow()
Optional<String> optVal = Optional.of("abc");
String str1 = optVal.get();  //optVal에 저장된 값 반환. null이면 예외발생. //잘 안씀.
String str1 = optVal.orElse("");  //optVal에 저장된 값이 null일 때는, "" 반환. //이걸 잘 씀.
String str1 = optVal.orElseGet(String::new);  //람다식이 가능하다. 위랑 같음. //이걸 잘 씀.
String str1 = optVal.orElseThrow(NullPointerException::new);  // null이면 예외발생. 예외지정가능. //잘안씀.
  • isPresent() - Optional 객체의 값이 null이면 false, 아니면 true를 반환
if(Optional.ofNullable(str).isPresent()){
	System.out.println(str);  //null이면 false고, 아니면 true니 출력해라.
}

// ifPresent(Consumer) - null이면 아무런 동작 X, null이 아니면 작업 수행
Optional.ofNullable(str).ifPresent(System.out::println);
//str 값이 null이 아니면 출력해라

 

 

OptionalInt, OptionalLong, OptionalDouble

  • 기본형 값을 감싸는 래퍼클래스
  • Optional<T> 보다 성능이 좋아서 씀 (모든 객체를 다루다보니 성능이 떨어져서)
public final class OptionalInt {
	
    private final boolean isPresent;
    private final int value; //기본형 값
	...
}
  • OptionalInt 값 가져오기
    • Optional<T>  //get() : T 값을 반환
    • OptionalInt  //getAsInt() : int을 반환
    • OptionalLong  //getAsLong() : long을 반환
    • OptionalDouble  //getAsDouble() : double을 반환
  • 빈 Optional 객체와의 비교 - isPresent()
//값이 같은 두 객체
OptionalInt opt = OptionalInt.of(0); //0을저장. 값=0
OptionalInt opt2 = OptionalInt.empty();  //0을저장. 했지만 실제로는 아무값도 저장 하지 않았음.
//또 값이 없기 때문에 출력하면 예외발생한다.

//둘을 구별하는법
System.out.println(opt.isPresent()) //값이 있으면 true
System.out.println(opt2.isPresent()) //값이 없으니 false (아무 값도 저장하지 않아서)
System.out.println(opt.equals(opt2)) //false.

 

 

 

Optional<T> Stream - filter(), map(), flatMap()

  • stream 처럼 메서드 사용 가능
int result = Optional.of("123")
        .filter(x->x.length()>0)
        .map(Integer::parseInt).orElse(-1);

 

 

 

Optional<T> Stream - 최종 연산 메서드

  • Optional <T> 를 결과로 반환하는 최종연산 메서드들
Optional<T> findAny()
Optional<T> findFirst()
Optional<T> max(Comparator<? super T> comparator)
Optional<T> min(Comparator<? super T> comparator)
Optional<T> reduce(BinaryOperator<? super T> accumulator)

 

'Java' 카테고리의 다른 글

[Java] 람다식  (0) 2022.06.26
[Java] 제네릭스  (0) 2022.06.25
[Java] 스레드  (0) 2022.06.21
[Java] Object, String 클래스  (0) 2022.06.21
[Java] 상속, 인터페이스  (0) 2022.06.19