티스토리 뷰

Objects 클래스

Object 클래스와 유사한 이름을 가진 java.util.Objects 클래스는 객체 비교, HashCode 생성, null 여부, 객체 문자열 리턴 등의 연산을 수행하는 정적(static) 메서드들로 구성된 Object 클래스의 유틸리티 클래스 입니다.

Objects 클래스의 메서드

  • compare(a, b) - 객체 비교 메서드
  • equals(), deepEquals() - 객체 동등 비교 
  • hash(), hashCode() - 해시 코드 생성
  • isNull(), nonNull(), requireNonNull() - null 여부 조사
  • toString() - 객체 문자 정보

 

 

compare(T a, T b, Comparator c) : 객체 비교 메서드

두 객체 a, b를 Comparator(=비교 기준)로 비교하여 결과 값을 int 형으로 반환합니다.

public interface Comparator<T> {
    int compare(T a, T b)
}

java.util.Comparator 는 제네릭 인터페이스로 두 객체를 비교하는 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;  // a 의 sno 가 작으면 –1, 같으면 0, 크면 1
        else if(a.sno == b.sno) return 0;
        else return 1;
    }
}

따라서, Comparator<T> 인터페이스를 구현한 구현체는 compare 메서드를 오버라이딩 해야 합니다.

return 타입은 a < b일 때 음수a > b일 때 양수a == b일 때 0을 return하도록 구현 클래스를 만들어야 합니다.

 

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

위 코드는 StudentComparator 비교자 클래스를 통해 구현한 예시 코드입니다.

 

 

 

equals(), deepEquals() : 객체 동등 비교

Objects.equals(a, b)는 두 객체의 동등성(=값이 같음)을 비교하는데 아래와 같은 결과를 return합니다.

  • a와 b, 모두 null인 경우 true
  • a와 b가 null이 아닌 경우 a.equals(b)의 결과를 return합니다.

 

 

Objects.deepEquals(a, b) 역시, 두 객체의 동등성을 비교하는 데 사용합니다.

a와 b가 서로 다른 배열일 경우, 항목 값이 전부 같다면 true를 return합니다.(=배열과 배열을 비교하는 메서드)

Objects.deepEquals는 Arrays.deepEquals(Object a, Object b) 와 동일합니다.

 

 

아래의 코드는 equals 메서드와 deepEquals 메서드를 사용한 예시 코드입니다.

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
    }
}

 

 

 

 

hash(), hashCode() : 해시 코드 생성

Objects.hash(value1, ...)는 매개 값으로 주어진 값들을 이용하여 Hash Code를 생성하는 역할을 합니다.

주어진 매개 값들로 배열을 생성하고,   Arrays.hashCode(Object) 를 호출하여 Hash Code를 얻고 이 값을 return합니다.

hash()는 클래스가 hashCode()를 재정의할 때 return 값을 생성하기 위해 사용하면 좋습니다.

클래스가 여러 가지 필드를 가질 때 이 필드들로부터 Hash Code를 생성하게 되면 동일한 필드 값을 가지는 객체는 동일한 Hash Code를 가질 수 있습니다.

@Override
public int hashCode() {
    return Objects.hash(field1, field2, field3);
}

Objects.hashCode()는 매개 값으로 주어진 객체의 Hash Code를 return하기 때문에 Object.hashCode()와 return 값이 동일합니다. 차이점은 매개 값이 null이면 0을 return한다는 것입니다.

 

 

 

 

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

  • Objects.isNull(Object obj): 매개 값이 null인 경우 true를 반환합니다.
  • Objects.nonNull(Object obj): 매개 값이 not null인 경우 true를 반환합니다.
  • requireNonNull(): 아래 사진과 같이 3가지로 Overloading 되어 있습니다.

 

 

첫 번째 매개 값(T obj)이 not null이면 첫 번째 매개 값(obj)를 return하고 null이면 NullPointerException을 발생 시킵니다.

두 번째 매개 값은 NullPointerException의 예외 메시지를 제공합니다.

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());      // 메시지 출력됨
        }
    }
}

 

 

 

 

toString() : 객체 문자 정보

Objects.toString()은 객체의 문자 정보를 return하는데 아래 두 가지로 오버라이딩 되어 있습니다.

 

첫 번째 매개 값(Object o)이 not null이면 toString()의 문자열을 출력하고, null이면 "null" 또는 두 번째 매개 값인 nullDefault를 return합니다.

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, “이름이 없습니다.”);   // 이름이 없습니다.
    }
}

'Language > JAVA' 카테고리의 다른 글

[JAVA]Reflection??  (0) 2024.09.13
[JAVA]Thread란?  (0) 2024.09.09
[JAVA]equals()와 hashCode()를 같이 재정의 하는 이유  (0) 2024.08.30
[JAVA]Optional? Optional의 개념 및 사용법  (0) 2024.08.28
[JAVA]JDK? JRE? JVM?  (0) 2024.08.28
공지사항
최근에 올라온 글
Total
Today
Yesterday