[JAVA] Optional 사용하기(옵셔널)

Posted by 김성철

JAVA - Optional 사용하기

Optional

https://hbase.tistory.com/212  
https://mangkyu.tistory.com/70  
https://mangkyu.tistory.com/203  
  
NPE(NullPointerException) 방지가 주된 목적인 Wrapper 클래스  
결과값에 null이 올수 있고, null 로 인해서 오류가 발생할 가능성이 있을때 사용하면 된다.  
  
Wrapper 클래스 이기때문에 많이사용하면 성능 저하가 발생할 수 있음  
또한 NPE 대신 NoSuchElementException 오류가 발생 할 수 있음  
  
	Optinal.empty() : 데이터가 없는 빈 Optinal 객체 생성  
	Optional.ofNullable(data) : 데이터가 없을 경우 빈 객체 생성  
	Optional.of(data) : 반드시 데이터가 있어야 하며, 없을 경우 NPE 발생  
	get() : 데이터를 가져오며, 없을경우 null 을 가져옴  
	orElse() : 가져오려는 데이터가 없을 경우 지정한 값을 가져옴  
	Supplier<T> 인터페이스를 활용하여 orElseGet()메소드 사용  
	Supplier<T> 인터페이스를 활용하여 orElseThrow()메소드 사용 (데이터가 없는 경우 지정한 예외 발생)  
  
테스트 코드  
=================================================================================================================  
package com.sungchul;  
  
import java.io.*;  
import java.util.*;  
  
public class OptionalTestClass {  
  
	public static void main(String[] args) throws NumberFormatException, IOException {  
		ClassName<String,Integer> className = new ClassName<>();  
  
		//빈 객체 생성  
		Optional<ClassName> optionalClassNameTest1 = Optional.empty();  
  
		//값에 null이 오면 빈객체가, null 이 아니면 지정한 값이 들어간 객체가 생성  
		Optional<ClassName> optionalClassNameTest3 = Optional.ofNullable(className);  
  
		//값에 null이 오면 NullPointerException 발생  
		//Optional<String> optionalClassNameTest2 = Optional.of(className.getTest1());  
  
		className.set("문자열",12345);  
		className.setTest1("김성철");  
		Optional<ClassName> optionalClassNameTest4 = Optional.ofNullable(className);  
		//orElse 는 값이 없다면 다음괄호 안에 있는 값을 사용한다  
		String test = optionalClassNameTest4.map(ClassName::getTest1).orElse("값없음");  
		System.out.println("#### test : " + test);  
  
		//아래와같이 ifPresent 함수를 사용하여서 null일경우 값을 넣어줄수 있다  
		// null 출력  
		Optional.of(className)  
				.map(ClassName::getTest2)  
				.ifPresent(n-> className.setTest2(n));  
		System.out.println("#### Null test2 : "+ className.getTest2());  
  
		//test1의 값을 test2에 입력  
		Optional.of(className)  
				.map(ClassName::getTest1)  
				.ifPresent(n-> className.setTest2(n));  
		System.out.println("#### Not null test2 : "+ className.getTest2());  
  
	}  
}  
  
class ClassName<K,V> {  
	private K first;  
	private V second;  
	private String test1;  
	private String test2;  
  
	void set(K first , V second){  
		this.first=first;  
		this.second=second;  
	}  
  
	K getFirst(){  
		return first;  
	}  
  
	V getSecond(){  
		return second;  
	}  
  
	void setTest1(String test1){  
		this.test1 = test1;  
	}  
  
	String getTest1(){  
		return test1;  
	}  
  
	public String getTest2() {  
		return test2;  
	}  
  
	public void setTest2(String test2) {  
		this.test2 = test2;  
	}  
  
	String toLowerCase(){  
  
		return "소문자변환";  
	}  
}  
  
=================================================================================================================