# 주민등록번호는 같지만 개명을 하여 Person 객체 2개가 생성되는 결과가 나타났으며 '== 연산자' 로는 false 값이 반환되게 된다. 

   이때 Object 클래스의 equals() 메소드를 오버라이딩하여 Person 객체들의 비교값이 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package objectex;
 
class Person {
    
    String name;
    int jumin;
    
    public Person() {}
    public Person(String name, int jumin) {
        this.name = name;
        this.jumin = jumin;
    }
    
    @Override
    public boolean equals(Object obj) {
        
        boolean result = false;
        
        // Person 클래스와 상속관계인 것만 들어 올 수 있도록 예외처리
        if (obj instanceof Person) {
            // 연산 순서: Person > (Person)obj > (Person)obj.jumin
            if (((Person)obj).jumin == jumin) {
                result = true;
            }
        }
        return result;
    }
}
 
class App {}
 
public class ObjectTest05 {
    public static void main(String[] args) {
 
        Person p1 = new Person("김철수"870612);
        Person p2 = new Person("김수근"870612);
        
        System.out.println("p1 == p2: " + (p1 == p2));
        System.out.println("p1.equals(p2): " + (p1.equals(p2)));
        
        App app = new App();
        // java.lang.ClassCastException: objectex.App cannot be cast to objectex.Person
        System.out.println("p1.equals(app): " + (p1.equals(app)));
        
    }
}
 
# 실행 결과
p1 == p2: false
p1.equals(p2): true
p1.equals(app): false
cs

 # 설명 

Line 14~15: Object 클래스의 equals 메소드를 오버라이딩 한다. 

Line 17: 반환값이 있는 메소드에 return 키워드를 1개 이상 사용하는 것은 권장하지 않는다. 

때문에 최종 반환값을 대변할 boolean형 result 변수를 false로 선언과 동시에 초기화 해준다.

Line 20: equals() 메소드의 매개변수는 Object obj로 모든 객체 타입을 받아올 수 있는 장점이자 단점이 있다.

이때 Line 43 처럼 Person 클래스와는 무관한 App 클래스도 접근할 수 있는 단점이 생긴다.

때문에 instanceof 연산자를 통하여 Person 클래스와 상속관계인 객체만 받아 처리할 수 있도록 조건문을 걸어준다.

Line 22: 매개변수로 받아온 obj 객체는 Person 클래스로 다운캐스팅(명시적 형변환)을 해주어 변수 jumin에 접근한다. 

Line 23: 주민등록번호가 일치한다면 result를 true로 바꿔준다.