/*
* ┌--------------┐
* │ Object │ 슈퍼 클래스
* │--------------│
* │ equals() │ 두 객체의 참조값을 비교해서 같으면 true, 아니면 false 반환
* │ getClass() │ 어떤 클래스인지 반환
* │ hashCode() │ int 타입의 해시코드값, Object 클래스는 객체의 참조값을 해시코드값으로 사용함
* │ toString() │ "클래스이름@참조값" 형식의 문자열을 반환
* │ notify() │ 스레드(thread) 관련 메소드
* │ wait() │ 스레드(thread) 관련 메소드
* └--------------┘
* ▲
* │
* │
* ┌--------------┐
* │ Person │ 서브 클래스
* │--------------│
* │ @Override │
* │ equals() │ 이름과 나이가 같으면 true, 아니면 false 반환 (하드코딩하지 않고, 자동완성한다.)
* │ │
* │ @Override │
* │ toString() │ 이름과 나이를 확인할 수 있는 문자열 반환 (하드코딩하지 않고, 자동완성한다.)
* └--------------┘
*/
equals() : 모든 객체 비교는 equals()를 사용.
이클립스 메뉴 - Source - Generate hashcode() and equals()... 클릭
=> 자동으로 비교하는 equals 를 만들어줌.
toString() : 객체 출력, 참조값에 들어있는 값 확인하고 싶을 때.
이클립스 메뉴 - Source - Generate toString()... 클릭
=> 실제 들어있는 값을 출력.
public class Person {
// Field
private String name;
private int age;
// Constructor
// new Person()
public Person() {
}
// new Person("홍길동", 20)
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Method
@Override
public int hashCode() {
return Objects.hash(age, name);
}
@Override
public boolean equals(Object obj) {
if (this == obj) // p1.equals(p1)
return true;
if (obj == null) // p1.equals(null)
return false;
if (getClass() != obj.getClass()) // p1.equals(s1)
return false;
Person other = (Person) obj;
return age == other.age && Objects.equals(name, other.name);
}
//참조값에 들어있는 값 확인하고 싶을 때.
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void ex01() {
// Object 타입으로 모든 객체를 저장할 수 있다.
// Object 타입으로 저장한 객체를 사용할 때는 캐스팅 해야 한다.
}
public static void ex02() {
// 동일한 객체 2개
Person p1 = new Person("홍길동", 20);
Person p2 = new Person("홍길동", 20);
// 동일한 객체인지 판단
boolean same = p1.equals(p2);
// p1 과 p2 는 주소가 다른, 서로 다른 객체이다.
// equals(); 는 주소 번지 수가 다르니, 다른 객체라고 출력된다.
// equals 를 오버라이드 해서 주소값말고 주소 안에 있는 실제 값을 비교할 수 있도록 해주면 된다.
// 결과 확인
System.out.println(same ? "동일한 객체" : "다른 객체");
}
public static void main(String[] args) {
Object obj = new Person();
((Person) obj).setName("홍길동");
((Person) obj).setAge(20);
System.out.println(((Person) obj).getName());
System.out.println(((Person) obj).getAge());
}
// 위와 같이 다운캐스팅으로 바꿔 사용 가능.