본문 바로가기
[IT] JAVA

[자바] 객체 리스트 특정 필드 값 제외하고 같은지 비교

by 오리엔탈킴 2022. 11. 9.

서로 다른 두 Java Object List에 구성된 객체 데이터들이 같은지, 두 리스트가 동일한지 비교를 할 경우가 있는데, 그 중에서 특정 필드(값)을 무시하고, 일부 필드 인자만으로 객체의 값이 같은지를 판단해서 리스트가 같은지 비교를 하려면 아래와 같이 진행을 하면 됩니다.

특정 값 제외하고 두 객체 리스트가 같은지 비교

public class Phone {

    private int SerialNumber;
    
    private String Model;
    
    private int Version;
    
}

 

위와 같이 Phone이라는 임의의 객체가 있는데, 만약 SerialNumber라는 값을 제외하고 Model과 Version이 같으면 두 객체는 같다고 판단을 해야하는 경우가 있다면, 아래와 같이 모든 IDE에 있는 기능인 Source Generate 기능을 이용해서  equals 메서드를 오버라이드해줍니다.

보통 hashCode() and equals() 메서드를 오버라이드하는 소스를 자동 생성해주도록 되어 있는데, 여기서 아래와 같이 SerialNumber 필드는 제외하고 소스를 생성합니다. 그러면 아래와 같이 전체 Phone 객체에 대한 소스가 자동 생성이 되었습니다. 편의상 @AllArgsConstructor와 @ToString는 Lombok 어노테이션을 사용하였습니다.

소스 자동생성
hashCode() and equals()

@AllArgsConstructor
@ToString
public class Phone {

    private int SerialNumber;
    
    private String Model;
    
    private int Version;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((Model == null) ? 0 : Model.hashCode());
        result = prime * result + Version;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Phone other = (Phone) obj;
        if (Model == null) {
            if (other.Model != null)
                return false;
        } else if (!Model.equals(other.Model))
            return false;
        if (Version != other.Version)
            return false;
        return true;
    }
    
}

 

		List<Phone> AList = new ArrayList<>();

		List<Phone> BList = new ArrayList<>();

		AList.add(new Phone(1, "GalaxyS21", 21));
		AList.add(new Phone(2, "iPhone14", 14));

		BList.add(new Phone(3, "GalaxyS21", 21));
		BList.add(new Phone(4, "iPhone14", 14));
		

		System.out.println( AList.toString() );
		System.out.println( BList.toString() );
		System.out.println( AList.equals( BList ) );

 

이제 위와 같이 SerialNumber가 다르지만 나머지 Model과 Version이 같은 객체를 두 List에 add를 해주고 AList.equals(BList) 메서드를 이용해서 확인을 해보면 두 리스트는 같다고 True라고 아래와 같이 출력이 됩니다.

ArrayList를 비교하는 equals 메서드는 단순한 로직으로 두 리스트의 순서까지 동일해야하므로, 만약 순서가 다르다면 Collections.sort를 이용하여 정렬 후 두 리스트를 비교해야 합니다.

[Phone(SerialNumber=1, Model=GalaxyS21, Version=21), Phone(SerialNumber=2, Model=iPhone14, Version=14)]
[Phone(SerialNumber=3, Model=GalaxyS21, Version=21), Phone(SerialNumber=4, Model=iPhone14, Version=14)]
true

 

반응형

댓글