자바의 정석 - object 클래스와 equals()

Yohan·2024년 2월 2일
0

Object 클래스

  • 모든 클래스의 최고 조상. 오직 11개의 메서드만 가지고 있음
  • notify(), wait() 등은 쓰레드와 관련된 메서드
  • 대표적인 것 몇 가지만 추려보면
    • public boolean equals(Object obj) - 객체 자신과 객체 obj가 같은 객체인지 알려줌 (같으면 true)
    • public class getClass() - 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환 (객체 정보)
    • public int hashcode() - 객체 자신의 해시코드 반환
    • public String toString() - 객체 자신의 정보 문자열로 변환

equals(Object obj)

  • 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false
  • Object 클래스의 equals()는 객체의 주소를 비교 (참조변수 값 비교)
public boolean equals(Object obj) {
	return (this==obj); // 주소가 같으면 true
}

예제1

  • Object 클래스의 equals()는 객체의 주소를 비교하지만 오버라이딩을 통해 주소가 아닌 value를 비교하여 서로 다른 객체여도 같다는 결과가 나올 수 있다!
class Ex {
	public static void main(String args[]) {
    	Value v1 = new Value(10);
        Value v2 = new Value(10);
        
        if (v1.equals(v2))
        	System.out.println("v1과 v2가 같습니다.");
        else
        	System.out.println("v1과 v2가 다릅니다.");
    }
}

class Value {
	int value;
    
    Value(int Value) {
    	this.value = value;
    }
    // Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교!
    public boolean equals(Object obj) {
    	// return this == obj; 주소 비교, 서로 다른 객체는 항상 거짓.
        // 하지만 나는 서로 다른 객체여도 같은 값이면 true를 얻고싶음
        
        // 참조변수의 형변환 전에는 반드시 instanceof로 확인해야함
        if(!(obj instanceof Value)) return false;
        
    	Value v = (Value)obj; // obj를 Value로 형변환
        
        return this.value == v.value;
    }
}

예제2

class Person {
	long id;
    
    public boolean equals(Object obj) {
    	if(obj instanceof Person)
        	return id == ((Person)obj).id;
        else
        	return false;
    }
    	
    Person(long id) {
    	this.id = id;
    }
}

class Ex {
	public static void main(String args[]) {
    	Person p1 = new Person(1000);
        Person p2 = new Person(1000);
        
        if (p1.equals(p2))
        	System.out.println("p1과 p2가 같습니다.");
        else
        	System.out.println("p1과 p2가 다릅니다.");
    }
}

정리

  • equals()를 통해 대상을 비교하면 값이 같아도 false, 왜냐하면 주소로 비교하기 때문이다. 그래서 객체가 달라고 값이 같을 때 true가 나오게하려면 인스턴스 변수 값을 비교하도록 오버라이딩해야되고 그 과정에서 형변환을 해주어야한다. (형변환 할 때 instanceof 활용)
profile
백엔드 개발자

0개의 댓글