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가지의 과정으로 정의하면 된다.
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);