- T 타입 객체의 래퍼 클래스 - Optional <T>

래퍼 클래스란? Integer , Long.... int(X)

 

public final class Optional <T> {

       private final T value; // T타입의 참조 변수

           ...

}

T타입의 value는 모든 종류의 객체를 저장할 수 있다.(null을 저장할 수 있다.)

null을 직접 사용하면 위험 부담이 크다 nullpointException이 발생할 수 있기 때문!!

 

간접적으로 null을 다루기 위해서 Optional 사용함.

 

한마디로, null이 올 수 있는 값을 감싸는 wrapper 클래스! 🤗

if(result != null){
	result.toString()
}

이런 식으로 null이 없을 때 사용해야 되기 때문에 if문을 사용하는 것을 방지해주기 위해 Optional을 사용함.


Optional <T> 객체 생성하기

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

String str = "abc";

Optional <String> optVal = Optional.of(str);

Optional <String> optVal = Optional.of("abc");

Optional <String> optVal = Optional.of(null);

Optional<String> optVal = Optional.ofNullable(null); 

 

한 단계 더 거친 거라고 생각하면 됨.

 

- null대신 빈 Optional <T> 객체를 사용하자

Optional <String> optVal = null; // 널로 초기화. 바람직하지 않음.

Optional <String> optVal = Optional. <String> empty(); // 빈 객체로 초기화


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

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

 

Optional <String> optVal = Optional.of("abc");

String str1 = optVal.get(); // optVal에 저장된 값을 반환. null이면 예외 발생

String str2 = optVal.orElse(""); // optVal에 저장된 값이 null일 때는, "'를 반환

String str3 = optVal.orElseGet(String::new); // 람다식 사용 가능 () -> new String()

String str4 = optVal.orElseThrow(NullPointerException::new);  // null이면 예외 발생

 

- isPresent() - Optional객체의 값이 null이면 false, 아니면 true를 반환

if(Optional.ofNullable(str). isPresent()){

      System.out.println(str);

}

 

// ifPresent(Consumer) - null이 아닐 때만 작업 수행, null이면 아무 일도 안 함

Optional.ofNullable(str). ifPresent(System.out::println);


Surround With 들어가면 try / catch문 자동으로 만들어 준다.

package OptionalPt;

import java.util.Optional;

public class OptionalTests {

	public static void main(String[] args) {
		Optional<String> opt2 = null; // OK. 하지만 null은 바람직하지 않다.
		Optional<String> opt = Optional.empty();
		System.out.println("opt="+opt);
		//System.out.println("opt="+opt.get()); // null이여서 예외 발생함. get 잘 안씀
		
		String str = "";
		
		try {
			str = opt.get();
		} catch (Exception e) {
			str =""; // 예외 발생하면 ""로 초기화
		}
		
//		str = opt.orElse("EMPTY"); // Optional에 저장된 값이 null이면 ""반환
//		str = opt.orElseGet(() -> new String()); // Optional에 저장된 값이 null이면 ""반환
		str = opt.orElseGet(String::new); // Optional에 지정된 값이 null이면 ""반환
		System.out.println("str="+str);
	}

}

OptionalInt, OptionalLong, OptionalDouble

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

성능 때문에 씀.. 그냥 Optional 써도 상관없다.

 

- OptionalInt의 값 가져오기 - int getAsInt()

Optional <T> T get()

OptionalInt  int getAsInt()

OptionalLong long getAsLong()

OptionalDouble double getAsDouble()

 

- 빈 Optional객체와의 비교

OptionalInt opt = OptionalInt.of(0); // OptionalInt에 0을 저장

OptionalInt opt2 = OptionalInt.empty(); // OptionalInt에 0을 저장

 

System.out.println(opt.isPresent()); // true

System.out.println(opt2.isPresent()); // false

System.out.prinltln(opt.equals(opt2)); // false

 

opt는 value가 0이어서 값은 있음.

empty도 value는 0인데 값이 없어서 false이다.

 

package OptionalPt;

import java.util.Optional;
import java.util.OptionalInt;

public class OptionalTests2 {
	public static void main(String[] args) {
		Optional<String> optStr = Optional.of("abcde");
		Optional<Integer> optInt = optStr.map(String::length);
		
		System.out.println(optStr);
		System.out.println(optInt);
		
		int result1 = Optional.of("123")
						.filter(x->x.length() > 0)
						.map(Integer::parseInt).get();
		
		int result2 = Optional.of("")
						.filter(x->x.length() > 0)
						.map(Integer::parseInt).orElse(-1);
		
		System.out.println(result1);
		System.out.println(result2);
		
		Optional.of("456").map(Integer::parseInt)
						  .ifPresent(x->System.out.printf("result3=%d%n",x));
		
		OptionalInt optInt1 = OptionalInt.of(0);   // 0을 저장
		OptionalInt optInt2 = OptionalInt.empty(); // 빈 객체를 생성
		
		System.out.println(optInt1.isPresent()); // true
		System.out.println(optInt2.isPresent()); // false
	}
}

 

+ Recent posts