본문 바로가기
Java

[Java] Reflection으로 객체 비교

by 가드 2022. 11. 8.
728x90

개발을 진행하다 보면 두 개의 객체가 같은지 비교를 해야 할 경우가 많다.

PrimitiveType(기본 자료형) 또는 ReferenceType(참조 자료형) 객체를 비교할 경우 equals 또는 ==으로 비교를 한다.

ex) PrimitiveType(기본 자료형)

int a = 10;
int b = 10;
a == b // true

ex) ReferenceType(참조 자료형)

String s1 = "hello";
String s2 = "hello";
s1.equals(s2); // true

 

그렇다면 많은 자료형들을 가지고 있는 객체 간의 비교는 어떻게 하는게 좋을까?

 

예를 들어, 사람 정보가 담긴 사람 클래스가 있다고 가정해보자 사람 클래스에는 이름, 나이, 사는 곳, 성별이 있다.

ex) Person.class

public class person {
	private String name;
	private int age;
	private String city;
	private String gender;
    // getter, setter 생략
}

자료형과 같이 비교 할 경우 아래와 같은 코드가 만들어질 것이다.

Person person1 = new Person();
Person person2 = new Person();
person1.getName().equals(person2.getName());
person1.getAge() == person2.getAge();
person1.getCity().equals(person2.getCity());
person1.getGender().equals(person2.getGender());

 

Person이라는 예제 클래스는 4객의 자료형을 가지고 있지만 실제로 개발하다 보면 많은 자료형 객체를 가지고 있는 객체 클래스가 많을 것이고 이 객체 클래스 또한 다양하고 많을 것인데 서비스 코드에 항상 저렇게 비교해야 할까?

 

물론 Lombok 라이브러리의 @EqualsAndHashCode를 사용하여 비교한다면 정말 더 간단해진다.

 

이번에는 Lombok과 같은 Third Party Library를 사용하지 않고 Reflection을 이용하여 객체를 비교해 보겠다.

ex) Reflection을 이용하여 두 개의 객체가 같은지 비교

Object object1 = new Person();
Object object2 = new Person();
Arrays.stream(object1.getClass().getDeclaredFields()).allMatch(field -> {
	object1.getClass().getDeclaredField(field.getName());
    field.setAccessible(true);
    Object value1 = field.get(object1);
    Object value2 = field.get(object2);
    return value1.equals(value2);
});

객체의 필드 값을 조회 후 필드 값을 두개의 객체에서 가져와서 비교하는 방식이다.  Reflection을 비교할 객체의 상위 클래스인 Object를 사용하였기에 모든 클래스들을 공통으로 사용할 수 있을 것이다.

 

위의 예제들은 두 객체 가진 필드들의 값이 같냐, 다르냐를 판단하지만 조금 더 응용하여 두 객체가진 값이 다른 필드들을 뽑아낼 수도 있다.

 

객체 비교할 때는 Diff Library인 Javers도 참고해보자. 객체 비교에 대한 강력한 기능을 제공한다.

https://javers.org/documentation/

 

300x250

댓글