public static void main(String[] args) {
/// Object Equals
Student s1 = new Student();
s1.name = "한조";
s1.age = 30;
s1.score = 70;
Student s2 = new Student();
s2.name = "한조";
s2.age = 30;
s2.score = 70;
if(s1 == s2) { // 다르다
System.out.println("같다");
}else {
System.out.println("다르다");
}
if(s1.equals(s2)) { // 직접 오버라이딩 전: 다르다 (당연히 참조주소 비교니까) / 후 : 같다
System.out.println("같다");
}else {
System.out.println("다르다");
}
// Q. 내가 만들지 않은 메서드 -> equals 가 사용될 수 있는 이유?
// object 클래스에 있는 메서드이므로. 오버라이딩된것을 가져온것!!
// Q. s1.name()equals(s2.name())을 편하게 비교하는 방법?
// Object class의 equals를 '직접 오버라이딩' 해보자
class Student{
String name;
int age;
int score;
// 2) Object class의 equals를 '직접 오버라이딩' 해보자
public boolean equals(Object t) {
if(!(t instanceof Student)) {
System.out.println("t가 Student의 필드에 속해있지 않으면 false를 보내줘");
return false;
}
// --> 출력이 안됐다는건 t(= 지금은 s2)가 Student 필드라는거지. 맞잖아!
// --> 같은 필드에 있는 애들을 비교할 수 있당
// return --> t는 Object클래스로 선언됐으므로 age등등을 넣을 수 없다. 그니까 이게 안된다는거지
// this.age == t.age &&
// this.name.equals(t.name) &&
// this.score == t.score;
Student target = (Student)t; // 그니까!! 강제로 타입캐스팅을 해줘야겠지?
return
this.age == target.age &&
this.name.equals(target.name) &&
this.score == target.score;
}
}
// Object 클래스의 equals 결과 --> 다르다
// 내가 '직접' 만든 클래스의 equals 결과 --> 같다
// ★ Object 클래스의 equals 메서드 :
// 객체의 참조 비교를 수행하므로 내용 비교를 위해서는 이를 오버라이딩해야 함
// ★ equals 메서드를 오버라이딩 :
// 우리가 정의한 비교 로직을 사용할 수 있음
// 따라서 객체의 내용을 기반으로 두 객체가 동일한지 여부를 판단할 수 있다
// ** equls 오버라이딩 방법 **
// equals 메서드를 오버라이드하고, 파라미터로 Object 클래스를 받습니다.
// 파라미터로 받은 객체가 해당 클래스의 인스턴스인지 확인합니다.
// 이를 위해 instanceof 연산자를 사용합니다.
// 만약 파라미터로 받은 객체가 해당 클래스의 인스턴스가 아니라면 -> equals 메서드는 false를 반환합니다.
// 만약 파라미터로 받은 객체가 해당 클래스의 인스턴스라면
-> 해당 객체와 비교하려는 객체의 필드를 비교하여 두 객체가 동일한지 여부를 판단합니다.
// 필드 비교 결과에 따라 true 또는 false를 반환합니다.
'JAVA > DAY 18 _ 23.09.11' 카테고리의 다른 글
Wrapper Class2 (0) | 2023.09.11 |
---|---|
Wrapper Class (0) | 2023.09.11 |
Hash Code2 (0) | 2023.09.11 |
Hash Code (0) | 2023.09.11 |
Object Class (0) | 2023.09.11 |