티스토리 뷰

Java

Objects 클래스

LichKing 2017. 12. 21. 21:04

자바7에서 추가된 Objects 클래스는 여러 유틸메서드를 제공하고있다. 이중 유용한 메서드들을 몇가지 알아보자.


1. equals()

null에 대한 방어를 위해 이런코드를 작성한적이 한번쯤 있을것이다.


public void method(String str1, String str2){
if(str1 != null && str1.equals(str2)){

}
}


str2는 인자로 활용되기때문에 null 체크를 굳이 할필요가 없지만 메서드 호출 객체인 str1이 null 이면 NPE가 발생하기때문에 이런식으로 방어코드를 작성하게된다. 이런 코드는 실무에서도 흔히 볼 수 있는데 null 체크는 자칫하면 빼먹기 쉬워 골칫덩이가 되곤한다. Optional로 우아하게 처리하는 방법도 있지만 str1과 str2가 모두 null일때도 처리해야한다면 Optional로는 부족하다. 그럴땐 Objects.equals() 를 이용하자.


public void method(String str1, String str2){
if(Objects.equals(str1, str2)){

}
}


참고로 첫번째 코드는 str1이 null이 아니어야하지만 두번째 코드는 str1이 null이어도 str2가 null이라면 true를 리턴한다. 말그대로 null이든 아니든 str1과 str2가 같은지만 비교하는것이므로 위 예제코드는 if문 조건의 의미가 조금 다르다는것을 유의하자.


2. toString()

equals() 와 마찬가지로 모든 객체는 Object 클래스를 상속받기때문에 toString() 메서드를 갖고있다. 그럼에도 Objects 에 있다는건 위와 마찬가지로 null 에 대응하겠다는 의미로 보면 된다.


public static void main(String[] args) {
String str = null;

System.out.println(Objects.toString(str));
}


null 일때 출력하고싶은 내용이 있다면 오버로딩된 2개인자짜리를 사용할 수도 있다.


public static void main(String[] args) {
String str = null;

System.out.println(Objects.toString(str, "hello"));
}


3. requireNonNull()

인자의 null 체크를 해주고 null이 아닐시 그대로 반환, null 일 경우 NPE를 발생시킨다.


public void method(String str1){
String str2 = Objects.requireNonNull(str1);
}


오버로딩된 메서드가 2가지 더 있는데 NPE 발생시 기본 메세지를 설정한다. 하나는 메세지 자체를 전달하고 하나는 메세지를 반환하는 Supplier 객체를 전달받아 lazy 하게 작동한다.


public void method(String str1){
String str2 = Objects.requireNonNull(str1, "default");
}
public void method(String str1){
String str2 = Objects.requireNonNull(str1, () -> "default");
}


4. isNull(), nonNull()

메서드명에서 드러나듯이 null 체크를 해준다. 개인적으로 애용하는 메서드들인데 그냥 == null 비교하면되지 뭐하러 저걸 만들어놓은건지 이해하기 힘들수도있다. 그냥 가독성을 위한 메서드라고 보면된다.


public void method(String str1){
if(Objects.isNull(str1)){

}
}
public void method(String str1){
if(Objects.nonNull(str1)){

}
}


5. compare

Comparator 인터페이스를 구현하는 경우 해당 객체의 compare() 메서드를 호출해줘야한다. Objects의 compare() 그 호출을 대신해준다. 일단 동일성 검사를 한번하고 호출하기때문에 약간의 최적화도 되는것 같다.


public void method(String str1, String str2){
Objects.compare(str1, str2, (s1, s2) -> s1.length() - s2.length());
}


6. 이 외

hashcode() 호출의 null 체크도 검사해주는 hashCode() 와 같은 메서드도있다. Objects에 있는 메서드들은 어려운 구현을 대신해줬다기보다 코드를 좀 더 추상화시켜 가독성을 향상시키거나 간단하지만 실수할 수 있는 부분들을 도와주는 클래스이므로 누구나 구현은 할 수 있지만 유용히 사용하자.

댓글
댓글쓰기 폼