<T>public final class Optional<T>
{
	private final T value;	//T타입의 참조변수
    	...
        
}
지금까지 널을 다루려면
1.nullPopintException
2.null을 if문으로 체크
하여 사용하였음
<T> 객체 생성하기<T>객체를 생성하는 다양한 방법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);	//ok
<T>객체를 사용하자Optional	//널로 초기화, 바람직하지 않음<String> optVal = null;
Optional<String> optVal = Optional.<String>empty(); //빈 객체로 초기화
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); //널이면 예외 발생
public final class OptionalInt{
	private final boolean isPresent;	// 값이 저장되어 있으면 true
    private final int value;			// int타입의 변수
}
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.println(opt.equals(opt2));	//false