본문 바로가기

JAVA/DAY 18 _ 23.09.11

Object _ Equals Overiding

 

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