class Object: method equals

class object는 구지 extend하지 않아도 상속되어지는 클래스를 말한다고 하였다. 저번에는 toString을 배웠으니 이번에는 equals라는 함수에 대해서 알아보자

Employee empl1 = new Employee("John", 50000);
Employee empl2 = new Employee("John", 50000);
System.out.println(empl1.equals(empl2));

위와 같이 작성이 되어 있을 때 equals 라는 함수를 사용하면 두개의 클래스가 같은 객체인지(같은 메모리에 저장된 객체인지) 혹은 둘 중 하나가 null인지를 확인한다. 그렇기 때문에 위의 객체들은 인자가 같을지라도 객체가 다르기 때문에 false를 반환한다.

하지만 equals도 class object의 method 답게 오버라이딩이 가능한데 그 대표적인 예가 String 이다.

String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2));

그래서 스트링 객체는 두 객체의 문자열을 비교하여서 true, false를 반환하게 된다. 그래서 위의 결과물은 false이다.


그럼 한 번 직접 우리가 만든 클래스에서 equals를 오버라이딩 한 것을 보도록 하자

class Employee {
	private String name;
	protected int salary;
	public Employee(String name, int salary) { this.name = name; this.salary = salary; }
	public String toString() { return getClass().getName() + "[name=" + name + ",salary=" + salary + "]"; }

	public boolean equals(Object otherObject) {
		if(this == otherObject) return true;
		if(otherObject == null) return false;
		if(getClass() != otherObject.getClass()) return false;
		Employee other = (Employee)otherObject;
		return (this.name == other.name && this.salary == other.salary);
}
	public String getName() { return this.name; }
	public int getSalary() { return this.salary; }
}

중간에 사용된 getClass() 함수는 동일하게 class Object의 함수이며 객체의 클래스 명을 반환해주는 역활을 수행한다.

이제 우리가 어떤 equals 함수를 재정의하든 다음 4가지의 과정으로 정의하면 된다.

  1. 같은 객체인지 확인
  2. 비교되는 객체가 null인지 확인
  3. 들어오는 함수가 Object 타입이기 때문에 같은 클래스에 속해 있는지 확인
  4. Object 클래스의 객체이기 때문에 우선 type casting해 주어서 사용한다.
Employee empl1 = new Employee("John", 50000);
Employee empl2 = new Employee("John", 50000);
System.out.println(empl1.equals(empl2));

그럼 최종적으로 true가 반환될 것이다.

하지만 위의 클래스도 한가지 문제점이 있을 수 있는데

return (this.name == other.name && this.salary == other.salary);