Objects 클래스
Object 와 유사한 이름을 가진 java.util.Objects 클래스는 객체 비교, 해시 코드 생성, null 여부,
객체 문자열 리턴 등의 연산을 수행하는 정적 메소드들로 구성된 Object 클래스의 유틸리티 클래스이다.
Objects 클래스의 정적(static) 메소드들
|
리턴 타입 |
메소드(매개 변수) |
설명 |
|
int |
compare(T a, T b, Comparator<T> c) |
두 객체 a, b를 Comparator 를 사용해서 비교 |
|
boolean |
deepEquals(Object a, Object b) |
두 객체의 깊은 비교(배열의 항목까지 비교) |
|
boolean |
equals(Object a, Object b) |
두 객체의 얕은 비교(번지 값만 비교) |
|
int |
hash(Object ... values) |
매개 값이 저장된 배열의 해시코드 생성 |
|
int |
hashCode(Object o) |
객체의 해시코드 생성 |
|
boolean |
isNull(Object obj) |
객체가 null 인지 조사 |
|
boolean |
nonNull(Object obj) |
객체가 null 이 아닌 지 조사 |
|
T |
requireNonNull(T obj) |
객체가 null 인 경우 예외 발생 |
|
T |
requireNonNull(T obj, String message) |
객체가 null 인 경우 예외 발생 (주어진 예외 메시지 포함) |
|
T |
requireNonNull(T obj, Supplier<String> messageSupplier) |
객체가 null 인 경우 예외 발생 (람다식이 만든 예외 메시지 포함) |
|
String |
toString(Object o) |
객체의 toString() 리턴 값 리턴 |
|
String |
toString(Object o, String nullDefault) |
객체의 toString() 리턴 값 리턴, 첫 번째 매개 값이 null인 경우 두 번째 매개 값 리턴 |
* 가변 인자 ... 기호
전달 인자를 0 ~ n 개 까지 넣을 수 있고, 배열로 처리된다. (컴파일 시)
Objects 클래스의 메소드들
1. compare(T a, T b, Comparator<T> c) : 객체 비교 메소드
두 객체 a, b를 비교자 (Comparator)로 비교해서 int 값을 리턴한다.
java.util.Comparator<T> 는 제네릭 인터페이스 타입으로
두 객체를 비교하는 compare(T a, T b) 메소드가 정의되어 있다.
T : 비교할 객체 타입
리턴 타입 int : a 가 b 보다 작으면 음수, 같으면 0, 크면 양수를 리턴하도록 구현 클래스를 만들어야 한다.
public interface Comparator<T> {
int compare(T a, T b)
}
예) 학생 객체에서 학생 번호로 비교하는 StudentComparator 구현 클래스 작성
StudentComparator.java : 학생 번호 비교자 구현 클래스
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student a, Student b) {
if(a.sno < b.sno) return –1; // a 의 sno 가 작으면 –1, 같으면 0, 크면 1
else if(a.sno == b.sno) return 0;
else return 1;
}
}
ComparatorExample.java : 비교자 사용 실행 클래스
public class CompareExample {
public static void main(String[] args) {
Student s1 = new Student(1);
Student s2 = new Student(1);
Student s3 = new Student(2);
int result = Objects.compare(s1, s2, new StudentComparator());
System.out.println(result);
result = Object.compare(s1, s3, new StudentComparator());
System.out.println(result);
}
static class Student {
int sno;
Student(int sno) { // 생성자
this.sno = sno;
}
}
static class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
/* if (o1.sno < o2.sno) return –1;
else if(o1.sno == o2.sno) return 0;
else return 1; */
return Integer.compare(o1.sno, o2.sno);
}
}
}
2. equals(), deepEquals() : 객체 동등 비교
- Objects.equals(Object a, Object b) 는 두 객체의 동등을 비교하는데 아래와 같은 결과를 리턴한다.
a 와 b 모두 null 일 경우 true 를 리턴한다.
a 와 b 가 null이 아닌 경우는 a.equals(b) 의 결과를 리턴한다.
|
a |
b |
Object.equals(a, b) |
|
not null |
not null |
a.equals(b) 의 리턴값 |
|
null |
not null |
false |
|
not null |
null |
false |
|
null |
null |
true |
- Objects.deepEquals(Object a, Object b) 역시 두 객체를 동등 비교하는데 사용된다.
a 와 b 가 서로 다른 배열일 경우, 항목 값이 모두 같다면 true를 리턴한다.
Arrays.deepEquals(Object[] a, Object[] b) 와 동일하다.
|
a |
b |
Object.deepEquals(a, b) |
|
not null(not array) |
not null(not array) |
a.equals(b) 의 리턴값 |
|
not null(array) |
not null(array) |
Arrays.deepEquals(a, b)의 리턴값 |
|
not null |
null |
false |
|
null |
not null |
false |
|
null |
null |
true |
예)EqualsAndDeepEqualsExample.java : 객체 동등 비교
public class EqualsAndDeepEqualsExample {
public static void main(String[] args) {
Integer o1 = 1000;
Integer o2 = 1000;
System.out.println(Objects.equals(o1, o2)); // true
System.out.println(Objects.equals(o1, null)); // false
System.out.println(Objects.equals(null, o2)); // false
System.out.println(Objects.equals(null, null)); // true
System.out.println(Objects.deepEquals(o1, o2) + “\n”); // true
Integer[] arr1 = {1, 2};
Integer[] arr2 = {1, 2};
System.out.println(Objects.equals(arr1, arr2)); // false
System.out.println(Objects.deepEquals(arr1, arr2)); // true
System.out.println(Arrays.deepEquals(arr1, arr2)); // true
System.out.println(Objects.deepEquals(null, arr2)); // false
System.out.println(Objects.deepEquals(arr1, null)); // false
System.out.println(Objects.deepEquals(null, null)); // true
}
}
3. hash(), hashCode() : 해시코드 생성
Objects.hash(Object ... values) 메소드는 매개값으로 주어진 값들을 이용해서
해시코드를 생성하는 역할을 한다.
주어진 매개값들로 배열을 생성하고, Arrays.hashCode(Objects[]) 를 호출해서 해시코드를 얻고,
이 값을 리턴한다.
hash() 메소드는 클래스가 hashCode()를 재정의할 때 리턴 값을 생성하기 위해 사용하면 좋다.
클래스가 여러가지 필드를 가질 때 이 필드들로부터 해시코드를 생성하게 되면
동일한 필드 값을 가지는 객체는 동일한 해시코드를 가질 수 있다.
@Override
public int hashCode() {
return Objects.hash(field1, field2, field3);
}
Objects.hashCode(Object o) 메소드는 매개값으로 주어진 객체의 해시코드를 리턴하기 때문에
o.hashCode() 의 리턴값과 동일하다.
차이점은 매개값이 null 이면 0을 리턴한다.
Student 객체의 해시코드를 생성하기 위해 Student 의 필드인 sno(학생 번호) 와 name(학생 이름)을
매개값으로 해서 Objects.hash() 메소드 호출
학생 번호와 이름이 동일하다면, 같은 해시 코드를 얻을 수 있다.
예) HashCodeExample.java : 해시 코드 생성
public class HashCodeExample {
public static void main(String[] args) {
Student s1 = new Student(1, “홍길동”);
Student s2 = new Student(1, “홍길동”);
System.out.println(s1.hashCode());
System.out.println(Objects.hashCode(s2)); // 해시코드 리턴 받음
}
static class Student {
int sno;
String name;
Student(int sno, String name) {
this.sno = sno;
this.name = name;
}
@Override
public int hashCode() {
return Objects.hash(sno, name);
}
}
}
4. isNull(), nonNull(), requireNonNull() : null 여부 조사
Objects.isNull(Object obj) 메소드는 매개값이 null 일 경우 true 를 리턴한다.
반대로 nonNull(Object obj) 메소드는 매개값이 not null 일 경우 true 를 리턴한다.
requireNonNull() 메소드는 아래처럼 세 가지로 오버로딩 되어 있다.
|
리턴 타입 |
메소드(매개 변수) |
설명 |
|
T |
requireNonNull(T obj) |
not null → obj null → NullPointerException |
|
T |
requireNonNull(T obj, String message) |
not null → obj null → NullPointerException(message) |
|
T |
requireNonNull(T obj, Supplier<String> msgSupplier) |
not null → obj null → NullPointerException(msgSupplier.get()) |
첫 번째 매개값(T obj)이 not null 이면 첫 번째 매개값(obj)을 리턴하고,
null 이면 모두 NullPointerException 을 발생시킨다.
두 번째 매개값은 NullPointerException 의 예외 메시지를 제공한다.
NullExample.java : null 여부 조사
public class NullExample {
public static void main(String[] args) {
String str1 = “홍길동”;
String str2 = null;
System.out.println(Objects.requireNonNull(str1)); // 홍길동
try {
String name = Objects.requireNonNull(str2);
} catch(Exception e) {
System.out.println(e.getMessage()); // null
}
try {
String name = Objects.requireNonNull(str2, “이름이 없습니다.”);
} catch(Exception e) {
System.out.println(e.getMessage()); // 메시지 출력됨
}
try {
String name = Objects.requireNonNull(str2, ()->“이름이 없다니깐요”); // 람다식
} catch(Exception e) {
System.out.println(e.getMessage()); // 메시지 출력됨
}
}
}
5. toString() : 객체 문자 정보
Objects.toString() 은 객체의 문자 정보를 리턴하는데 아래 두 가지로 오버로딩 되어 있다.
|
리턴 타입 |
메소드(매개 변수) |
설명 |
|
String |
toString(Object o) |
not null → o.toString() null → “null” |
|
String |
toString(Object o, String nullDefault) |
not null → o.toString() null → nullDefault |
첫 번째 매개값(Object o)가 not null 이면 toString() 으로 얻은 값을 리턴하고
null이면 “null” 또는 두 번째 매개 값인 nullDefault를 리턴한다.
ToStringExample.java
public class ToStringExample {
public static void main(String[] args) {
String str1 = “홍길동”;
String str2 = null;
System.out.println(Objects.toString(str1)); // 홍길동
System.out.println(Objects.toString(str2)); // null
System.out.println(Objects.toString(str2, “이름이 없습니다.”); // 이름이 없습니다.
}
}
'Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어] > 9. 기본 API 클래스' 카테고리의 다른 글
| 6. Java 자바 [API] - Class 클래스 (0) | 2020.09.22 |
|---|---|
| 5. Java 자바 [API] - System 클래스 (0) | 2020.09.22 |
| 3. Java 자바 [API] - Object 클래스의 메소드 2 clone(), finalize() (0) | 2020.09.18 |
| 2. Java 자바 [API] - Object 클래스, Object 클래스의 메소드 1 (0) | 2020.09.18 |
| 1. Java 자바 [API] - 자바 기본 API 패키지 (0) | 2020.09.18 |