상세 컨텐츠

본문 제목

Objects 클래스 설명

기록 - 프로그래밍/Java

by wjjun 2024. 1. 26. 00:34

본문

 

Objects 클래스

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 일 경우 두 번째 매개값 리턴

 

 

객체 비교 (compare(T a, T b, Comparator<T> c))

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());
}

 

 

동등비교 (equals() 와 deepEquals())

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을 리턴합니다. 

 

null 여부 조사 (isNull(), nonNull(), requireNonNull())

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());
}

위 표를 구현했을때 소스코드

 

객체 문자 정보 (toString())

리턴타입 메서드 (매개변수) 설명
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를 리턴합니다.

 

리플렉션 (getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods()))

Class 객체를 이용하면 클래스의 생성자, 필드, 메서드 정보를 알아낼 수 있습니다. 이것이 리플렉션입니다.

Constructor[] constructors = clazz.getDeclaredConstructors();
Field[] fields = clazz.getDeclaredFields();
Method[] methods = clazz.getDeclaredMethods();

 

Constructor 배열, Field 배열, Method 배열을 리턴합니다.

getDeclaredFields(), getDeclaredMethods()는 클래스에 선언된 멤버만 가져옵니다. 상속된 멤버는 가져오지 않습니다.

만약 상속된 멤버도 얻고 싶다면 getFields(), getMethods()를 이용해야 합니다.

 

StringTokenizer 클래스

StringTokenizer 클래스를 사용하면 손쉽게 문자열을 분리할 수 있습니다.

타입 메서드 설명
int countTokens() 꺼내지 않고 남아 있는 토큰 수
boolean hasMoreTokens() 남아 있는 토큰 있는지 여부
String nextToken() 토큰을 하나씩 꺼내옴

관련글 더보기

댓글 영역