JAVA/java 실습

[자바JAVA]Object클래스 equals() /객체비교하기/ 논리적 동등

자바칩 프라푸치노 2020. 11. 25. 12:05

■equals()

원래 Object의 equals()는 번지 비교를 합니다.

그래서 논리적 동등을 비교하기 위해서는 오버라이딩을 해주어야합니다.

논리적 동등이란? 같은 객체든 다른 객체든 객체 저장 데이터가 동일하다는 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Member {
 
    String id;
    public Member(String id) {
        this.id = id;
    }
    
    @Override
    public boolean equals(Object obj) {
        System.out.println("equals호출");
        
        if (obj instanceof Member) {
            //타입 변환이 가능한지 여부를 알기 위해 instanceof사용
            //다운 캐스팅은 반드시 형변환 코드 必
            Member member = (Member)obj;
            //논리적 동등을 위해 조건문 설정
            if (this.id.equals(member.id)) {
                return true;
            }
        }return false;
    }
}
 
cs

equals()를 오버라이딩 하여

매개변수로 받은 객체가 Member이면 Member로 인스턴스를 생성하고

생성한 인스턴스의 id와 매개변수로 받은 obj의 id가 같으면 true를 리턴하라고 코드를 작성하였습니다.

논리적으로 id에 저장된 값이 같으면 true입니다.

 

<실행클래스>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class MemberEx {
 
    public static void main(String[] args) {
        
        Member obj1 = new Member("blue");
        Member obj2 = new Member("blue");
        Member obj3 = new Member("red");
        //주소는 다 다르다
        System.out.println(obj1);
        System.out.println(obj2);
        System.out.println(obj3);
        
        
        
        //Object의 eqauls메서드를 Member가 오버라이딩을 했기에 다음과 같이 동등객체로 인식한다.
        if (obj1.equals(obj2)) {
            System.out.println("논리적으로 동등합니다.");
        }
        else {
            System.out.println("논리적으로 동등하지 않습니다.");
        }
        System.out.println();
        
        if (obj1.equals(obj3)) {
            System.out.println("논리적으로 동등합니다.");
        }
        else {
            System.out.println("논리적으로 동등하지 않습니다.");
        }
    }
 
}
cs

Member로 각각의 인스턴스를 만들었으므로 obj1,2,3의 주소는 각각 다릅니다.

밑에 if, else문을 보시면, 아까 위에서 equals를 오버라이딩 했으므로

id가 같으면 true가 나올 것이고 id가 다르면 false가 나올 것입니다.

각각 다른객체지만 obj1과 obj2는 id가 같으므로 true가 나옵니다.

 

 

<출력 결과>

 

728x90