Object와 비슷한 이름을 가진 java.util.Objects 클래스는 객체 비교, 해시코드 생성, null 여부, 객체 문자열 리턴 등의 연산을 수행하는 정적 메소드로 구성된 Object의 유틸리티 클래스입니다.
리턴 타입 | 메서드 | 설명 |
int | compare(T a, T b, Comparator<T> c) | 두 객체 a와 b를 Comparator를 사용해서 비교 |
boolean | deepEqauls(Object a, Object b) | 두 객체의 깊은 비교 (배열의 항목까지 비교) |
boolean | eqauls(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 일 경우 두 번째 매개값 리턴 |
T가 비교할 객체 타입입니다.
compare() 메서드의 리턴 타입은 int 이며, a가 b보다 작으면 음수, 같으면 0, 크면 양수를 리턴하는 구현클래스가 있습니다.
interface Comparator<T> {
int compare(T a, T b);
}
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student a, Student b) {
if (a.sno<b.sno) return -1;
else if (a.sno == b.sno) return 0;
else return 1;
}
}
}
class CompareExample {
Student s1 = new Student(1);
Student s2 = new Student(1);
Student s3 = new Student(1);
int result = Objects.compare(s1, s2, new Student(Comparator());
int result1 = Objects.compare(s1, s3, new StudentComparator());
}
Objects.equals(Object a, Object b) 는 두 객체의 동등을 비교하는데 다음의 결과를 리턴합니다.
특이사항으로는 a, b 모두 null 일 경우 true를 리턴합니다. a와 b가 null 이 아닐 경우 a.equals(b)의 결과를 리턴합니다.
a | b | Objects.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 | Objects.deepEquals(a,b) |
not null (not array) | not null (not array) | a.eqauls(b)의 리턴값 |
not null (array) | not null (array) | Arrays.deepEqauls(a, b)의 리턴값 |
not null | null | false |
null | not null | false |
null | null | true |
Objects.hash(Object... values) 메서드는 매개값으로 주어진 값을 이용하여 해시 코드를 생성합니다.
Arrays.hashCode(Object[])를 호출해서 해시코드를 얻고 이 값을 리턴합니다. 이 메서드는 클래스가 hashCode()를 재정의 할 때 리턴값을 생성하기 위해 사용하면 좋습니다. 클래스가 여러 필드를 갖고 있을 때 필드들로부터 해시코드를 생성하게 되면 동일한 필드값을 가지는 객체는 동일한 해시코드를 가질 수 있습니다.
@Override
public int hashCode() {
return Objects.hash(field1, field2, field3);
}
Objects.hashCode(Object o)는 매개값으로 주어진 객체의 해시코드를 리턴하기 때문에 o.hashCode() 리턴값과 동일합니다.
차이점은 매개값이 null 이면 0을 리턴합니다.
Objects.isNull(Object obj)는 매개값이 null일 경우 true를 리턴합니다.
리턴타입 | 메서드 | 설명 |
T | requireNonNull(T obj) | not null -> obj null -> NullPointException |
T | requireNonNull(T obj, String message) | not null -> obj null -> NullPointException(message) |
T | requireNonNull(T obj, Supplier<String> msgSupplier) | not null -> obj null -> NullPointException(msgSupplier.get()) |
try {
String name = Objects.requireNonNull(str2);
} catch (Exception e) {
sout(e.getMessage());
}
try {
String name = Objects.requireNonNull(str2, "이름이 없습니다");
} catch (Exception e) {
sout(e.getMessage());
}
try {
String name = Objects.requireNonNull(str2, () -> "이름이 없습니다"); // 람다식
} catch (Exception e) {
sout(e.getMessage());
}
위 표를 구현했을때 소스코드
리턴타입 | 메서드 (매개변수) | 설명 |
String | toString(Object o) | not null -> o.toString() null -> "null" |
String | toString(Object o, String nullDefault) | not null -> o.toString() null -> nullDefault |
첫 번째 매개값이 not null 이면 toString()으로 얻은 값을 리턴하고 null 이면 "null" 또는 두 번째 매개값인 nullDefault를 리턴합니다.
Class 객체를 이용하면 클래스의 생성자, 필드, 메서드 정보를 알아낼 수 있습니다. 이것이 리플렉션입니다.
Constructor[] constructors = clazz.getDeclaredConstructors();
Field[] fields = clazz.getDeclaredFields();
Method[] methods = clazz.getDeclaredMethods();
Constructor 배열, Field 배열, Method 배열을 리턴합니다.
getDeclaredFields(), getDeclaredMethods()는 클래스에 선언된 멤버만 가져옵니다. 상속된 멤버는 가져오지 않습니다.
만약 상속된 멤버도 얻고 싶다면 getFields(), getMethods()를 이용해야 합니다.
StringTokenizer 클래스를 사용하면 손쉽게 문자열을 분리할 수 있습니다.
타입 | 메서드 | 설명 |
int | countTokens() | 꺼내지 않고 남아 있는 토큰 수 |
boolean | hasMoreTokens() | 남아 있는 토큰 있는지 여부 |
String | nextToken() | 토큰을 하나씩 꺼내옴 |
스레드 생성 방법 (Runnable) (0) | 2024.01.29 |
---|---|
날짜 파싱 메서드 (Formatting) (1) | 2024.01.28 |
예외처리 (Exception, RuntimeException, 사용자 정의 예외) (1) | 2024.01.22 |
JPA 고급 매핑 (1) (상속관계매핑, @MappedSuperclass) (0) | 2024.01.21 |
중첩 인터페이스 (익명 객체 로컬 변수) (0) | 2024.01.20 |
댓글 영역