본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/9. 기본 API 클래스

4. Java 자바 [API] - Objects 클래스

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