Java/객체지향

[객체지향][람다와 스트림] - Optional

얄루몬 2022. 3. 28. 21:52

https://youtu.be/W_kPjiTF9RI?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[Optional<T>란?]

  • T 타입의 객체의 래퍼 클래스(Integer, Long 등)
  • 모든 종류의 객체를 저장할 수 있다.
  • null도 저장가능하다. (장점임 Null은 직접 다루기 위험하기 때문이다.)
    • null을 직접 다루는  것은 위험하다.
      • Nullpointexception 발생 위험
      • null 체크를 할 때 if문을 사용해야 해서 코드가 지저분해지게 된다.
    • Optional 객체를 사용해서 위의 null을 직접 다룰 때의 단점을 신경쓰지 않고 null을 사용할 수 있다. 

[Optional<T> 객체 생성하기]

  • Optional<T> 객체를 생성하는 다양한 방법

  • null 대신 빈 Optional<T> 객체를 사용하자.
Optional<String> optVal = null; //널로 초기화 바람직하지 않은 방법임
Optional<String> optVal = Optional.empty(); //빈 객체로 초기화 바람직한 방법임

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

Optional객체의 값 가져오기 - get(), orElse(), orElseGet(), orElseThrow()

  • get( ) - 저장된 값 반환해주고 null일 땐 예외발생
  • orElse( ) - 저장된 값이 null일 때는 ""를 반환
  • orElseGet( ) - 람다식 사용 가능 () -> new String( )
  • orElseThrow( ) - null이면 예외 발생
  • isPresent( ) - Optional 객체의 값이 null이면 false, 아니면 true 반환 

[실습]

[빈 배열 만드는 방법]

package javajungsuk;

public class Java14_11 {
	public static void main(String[] args) {
		int[] arr = null ; // X
		int[] arr = new int[0]; //O
		
		System.out.println("arr.length = " +arr.length);		
	}
}

[Optional을 사용한 null 표현 - get( )]

package javajungsuk;

import java.util.Optional;

public class Java14_11 {
	public static void main(String[] args) {
		Optional<String> opt = null; //가능하지만 바람직하지 않음
		Optional<String> opt = Optional.empty(); //O
		System.out.println("opt= "+ opt.get());
	}
}
  • get( ) 사용 시 예외가 발생하기 때문에 이를 아래와 같이 처리해주어야 한다.
package javajungsuk;

import java.util.Optional;

public class Java14_11 {
	public static void main(String[] args) {

		Optional<String> opt = Optional.empty(); //O
		System.out.println("opt= "+ opt.get());
		
		String str = "";
		try {
			str = opt.get();//예외 발생
		} catch (Exception e) {
			str = ""; //예외 발생하면 빈문자로 초기화
		}
        System.out.println("str" + str);
	
	}
}

[Optional을 사용한 null 표현 - orElse( )]

package javajungsuk;

import java.util.Optional;

public class Java14_11 {
	public static void main(String[] args) {
		Optional<String> opt = Optional.empty(); //O
		System.out.println("opt= "+ opt.get());
		
		String str = "";
		
		str = opt.orElse("EMPTY"); //Optional에 저장된 값이 null이면 "" 반환
		System.out.println("str = " +str);
	}
}

[Optional을 사용한 null 표현 - orElseGet( )]

package javajungsuk;

import java.util.Optional;

public class Java14_11 {
	public static void main(String[] args) {

		Optional<String> opt = Optional.empty(); //O
		System.out.println("opt= "+ opt.get());
		
		String str = "";
		
		str = opt.orElseGet(()-> new String());
		str = opt.orElseGet(String::new); 
		System.out.println("str = " +str);
	}
}

[더 높은 성능을 필요로 할 때 - OptionalInt,OptionalLong, OptionalDouble]

  • 기본형 값을 감싸는 래퍼클래스

  • 빈 Optional 객체와의 비교(값이 있어도 0이 저장 값이 없어도 기본값으로 0을 저장)
    • 0을 저장한 값 아무 것도 저장하지 않은 값 비교를 위한 함수  -> isPresent
    • isPresent를 사용해서 값이 있으면 true를 값이 없이 기본값으로 0이 들어가 있다면 false를 반환