Java

[Java] Object클래스의 메서드- equals()

codeStudy123 2022. 1. 24. 21:52

 

 

java.lang 패키지는 자바 프로그래밍에 가장 기본이 되는 클래스들을 포함한 패키지이다. 

그래서 import문 없이도 사용할 수 있다. 예를 들어 System클래스, String클래스는 우리가 import문으로 선언을 안 해도 사용할 수 있다.

 


 

Object클래스

 

object클래스는 모든 클래스의 최고 조상이다.  그래서 object의 맴버들은 모든 클래스에서 바로 사용할 수 있다.

 

 

object클래스의 메서드

 

Object클래스의 메서드 설 명
protected Object clone() 객체 자신의 복사본을 반환한다.
public boolean equals (Object obj) 객체 자신과 객체 obj가 같은 객체인지 알려준다. (같으면 true)
protected void finalize() 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다. 이 때 수행되어야하는 코드가 있을 때 오버라이딩한다.
public Class getClass() 객체 자신 클래스 정보를 담고 있는 Class인스턴스를 반환한다.
public int hashCode() 객체 자신의 해시코드를 반환한다.
public String toString() 객체 자신의 정보를 문자열로 반환한다.
public void notify() 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다.
public void notifyAll() 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다.
public void wait()
public void wait(long timeout)
public void wait (long timeout, int nanos)
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간동안 기다리게 한다.

 

 

Object 클래스의 맴버변수는 존재하지 않는다. 11개의 메서드만 존재한다.

 


 

equals()

 

Object 클래스의 메서드중 하나인 equlas메서드는 객체 주소가 같은지 비교하는 메서드로 같을 시 true, 다를 시 false를 반환한다.

 

public class Main {

	public static void main(String[] args) {
		Ob o1 = new Ob(50);
		Ob o2 = new Ob(50);

		if (o1.equals(o2)) {
			System.out.println("두 객체는 같습니다.");
		} else {
			System.out.println("두객체는 다릅니다.");
		}
	}
}

class Ob {
	long value;

	Ob(long value) {
		this.value = value;
	}
}

 

두객체는 다릅니다.

실행결과

 

위 코드를 보면 o1과 o2의 value값은 같다. 하지만 equals메서드는 객체 주소 값을 비교하기 때문에 false를 반환한다. 

 

 

 

Ob o1 = new Ob(50);
		Ob o2;
		o2=o1;
		if (o1.equals(o2)) {
			System.out.println("두 객체는 같습니다.");
		} else {
			System.out.println("두객체는 다릅니다.");
}
두 객체는 같습니다.

 

o1과 o2처럼 객체주소만 같다면 equals 메서드는 true를 반환한다.

 

 

 

Object 클래스의 equals메서드는 결국 두 개의 참조 변수가 같은 객체를 참조하고 있는지를 비교하는 메서드이다. 즉, 객체 주소 값이 같은지 다른지만 비교하는 메서드인 것이다. 

 

하지만, 인스턴스가 가지고 있는 값도 비교를 할 수 있다. equals메서드를 오버라이딩하여 주소가 아닌 객체에 저장된 내용을 비교할 수 도 있다.

 

public class Main {

	public static void main(String[] args) {
		Ob o1 = new Ob(50L);
		Ob o2 = new Ob(50L);
		o2 = o1;
		if (o1.equals(o2)) {
			System.out.println("두 객체의 값은 같습니다.");
		} else {
			System.out.println("두객체의 값은 다릅니다.");
		}
	}
}

class Ob {
	long value;

	public boolean equals(Object obj) {
		if (obj instanceof Ob) {
			return value == ((Ob) obj).value; // obj가 Object타입이므로 id참조하기 위한 형변환
		} else {
			return false;
		}
	}

	Ob(long value) {
		this.value = value;
	}
}

 

두 객체의 값은 같습니다.

실행결과

 

위 처럼 public boolean equals(Object obj) 메서드를 오버라이딩하여 내용을 바꿀 수도 있다.

위 코드는 객체의 주소값이 아닌 멤버 변수 value의 값을 비교하도록 오버라이딩 한 것이다.