안녕하세요
코드짜는헬린이입니다.
오늘은 코딩을하며 쉽게 마주칠수 있는 NullPointException (NPE)에 대하여 처리 방법에 대한 포스팅을 할려합니다.
요즘은 제가 프로젝트를 진행하며 자바6....을 사용하느라 삼항연산자를 통한 Null 처리도 안되는거 같아서
Null 처리를 아래와 같이 하였습니다.
if(str!=null)[
}else if(str1!=null){
}else if(str2!=null){
}else{
}
어쩔수없이 코드가 지저분해지고 길어지기 마련입니다.
그래서 JDK8 부터는 보다 깔끔하게 Null 처리를 할 수 있는 Optional을 사용합니다
#Optional 이란 ?
Optional는 “존재할 수도 있지만 안 할 수도 있는 객체”, 즉, “null이 될 수도 있는 객체”을 감싸고 있는 일종의 래퍼 클래스입니다. 원소가 없거나 최대 하나 밖에 없는 Collection이나 Stream으로 생각하셔도 좋습니다. 직접 다루기에 위험하고 까다로운 null을 담을 수 있는 특수한 그릇으로 생각하시면 이해가 쉬우실 것 같습니다.
출처 : www.daleseo.com/java8-optional-after
위와같이 Null도 담을수 있는 클래스입니다.
그래서 장점은 ?
#Optional 장점
1. Null을 유발할수 있는 객체를 직접 다루지 않아도 된다.
* 말그대로 Null을 수고스럽게 관리를 할 필요가 없다는 뜻입니다.
2. Null을 직접 다루지 않다보니 코드가 깔끔해진다. 위와 같은 IF ELSE 로 처리를 계속 안해도됩니다.
#Optional 사용
public void test(){
String str = "ggomak";
if(str!=null){
System.out.println(str);
}
}
public void test(){
String str = "ggomak";
Optional<String> opt = Optional.ofNullable(str);
opt.ifPresent(name -> System.out.println(name));
}
Null 조건문을 사용 안하다 보니 훨씬 깔끔해졌고 가독성이 좋아졌습니다.
Optional의 정적메소드 3개가 있는데 아래와 같습니다.
-
Optional.empty : 빈 Optional 객체 생성한다
-
Optional.of(value) : value값이 null이 아닌 경우에 사용한다
-
Optional.ofNullable(value) : value값이 null인지 아닌지 확실하지 않은 경우에 사용한다
# Optional empty 사용
public void emp(){
Optional<String> optStr = Optional.empty();
System.out.println(optStr);
System.out.println(optStr.isPresent());
System.out.println(optStr.orElse("test"));
}
######result######
Optional.empty
false
test
##################
이러한 결과가 나오며 isPresent(), orElse 등 밑에서 다시 말씀드리겠습니다.
# Optional of 사용
public void emp1(){
Optional<String> optStr = Optional.of(null);
}
######result#####
java.lang.NullPointerException
################
of() 메소드는 null을 일체 허용하지 않기에 NPE 가 발생합니다.
# Optional.ofNullable사용
public void emp1(){
Optional<String> optStr = Optional.ofNullable(null);
}
######result####
Optional.empty
###############
ofNullable()을 사용함으로써 NPE는 발생하지 않고 Optional.empty 의 빈객체만 반환해줍니다.
Optional 내부에 담고 있는 객체에 접근하는 여러 메소드에 대하여 알아보겠습니다.
# IfPresent()
Optional 객체가 not null인 경우에 인자로 넘긴 함수를 실행하는 메서드입니다. Optional 객체가 null이면 인자로 넘긴 함수는 실행되지 않습니다.
public void test(){
String str = "ggomak";
Optional<String> opt = Optional.ofNullable(str);
opt.ifPresent(name -> System.out.println(name));
}
######result####
ggomak
#################
# orElse
Optional에 담고 있는 객체가 null이 경우에 대신할 수 있는 값을 반환하는 메서드입니다.
public void test(){
Optional<String> optStr2 = Optional.ofNullable(null);
optStr2.ifPresent(name -> System.out.println(name));
String result = optStr2.orElse("ggomak");
System.out.println(result);
}
#####result#####
ggomak
###############
#orElseGet
반환값으로 메소드를 인자로 넘길수 있으며 넘긴 인자(메소드)를 실행시킵니다.
public void test() {
Optional<String> optStr2 = Optional.ofNullable(null);
optStr2.ifPresent(name -> System.out.println(name));
String result = optStr2.orElseGet(this::emp2);
System.out.println(result);
}
public String emp2() {
System.out.println("LogInfo");
return "resuntResult";
}
######reusult##########
LogInfo
resuntResult
######################
* 그래도 orElse 와 orElseGet 은 어찌보면 같아보이지만 orElse는 null 이 아니여도 실행은 되지만,
orElseGet은 반디시 Null 이어야 반환되어 호출됩니다.
이상 포스팅을 마치도록하겠습니다
감사합니다.
'개발 > Java' 카테고리의 다른 글
[Java] JPA 프록시와 연관관계 관리 (1) | 2021.01.16 |
---|