JAVA_47_Object클래스의 equals()

charl hi·2021년 9월 4일
0

JAVA

목록 보기
47/53

Object 클래스

  • 총 11개의 메소드

  • notify(), wait() 등 -> ch13~ (쓰레드 관련)



equals()

  • 기본
public boolean equals(Object obj) {
	return this==obj;
}
  • 사용/호출
(참조)변수1.equals((참조)변수2);
  • 객체 자신(this)과 주어진 객체(obj)를 비교, 같으면 true, 다르면 false

  • Object클래스의 equals()는 ✨객체의 주소(참조변수의 값)를 비교

  • 따라서 서로 다른 객체는 주소가 항상 다르기에 ✨항상 거짓
    -> 주소가 아닌 인스턴스 변수value의 값을 비교하고 싶다면 오버라이딩을 해야 한다!!



✨✨✨ 오버라이딩

public boolean equals(Object obj) {
		//형변환 가능한지 꼭 !!
	if(!(obj instanceof Value)! return false;
    
    	Value v = (Value)obj;
     		//객체생성해 v도 obj의 객체를 가리키게됨, 즉 일종의 복사가 됨
     	return this.value == v.value;
        	//참조변수의 값(주소)이 아닌 가리키는 변수의 값(value)
}

public class Ex9_01 {

	public static void main(String[] args) {
		Value v1 = new Value(20);
		Value v2 = new Value(10);
		
		if(v1.equals(v2)) {	//v1이 가리키는 equals()호출
			System.out.println("v1과 v2는 같습니다.");
		} else {
			System.out.println("v1과 v2는 다릅니다.");
		}

		System.out.println(v1.value);
		System.out.println(v2.value);
	}

}

class Value{
	int value;
	
	Value(int value){
		this.value = value;	//20
	}
	
	public boolean equals(Object obj) {	//Object및 그 자손들 다 들어올 수 있음
		if(!(obj instanceof Value)) {
			return false;
		}
		Value v = (Value)obj;	//obj가 가리키는 객체주소를 Value v를 생성해 집어넣기
		System.out.println(this.value+"!");
		System.out.println(v.value);
		return this.value == v.value;
//		return this.value == obj.value;
	}
	
}

20!
10
v1과 v2는 다릅니다.
20
10

v1.equals(v2);

  • ✨✨Value v를 새로 생성하여 v2의 값(주소)을 복사하여 넣은 다음 -> v.value == v1.value;

👀👀👀왜 직접 v2.value == v1.value;를 안하는 걸까?

public boolean equals(Object obj) {

	return this.value == obj.value;
}

로 하면 안되는 걸까? 했는데 오류가 떴다!

당연하다! 매개변수로 받은 Object에는 value가 없기 때문에!!

따라서 이걸 해결하기 위해선

① 차라리 매개변수를 > Value로 바꾸거나

public boolean equals(Value obj) {

	return this.value == obj.value;
}
  • 이건 별로 추천안한다.
    -> 비교대상이 같은 클래스Value라서 되는 것이다.
    -> 만약 다른 클래스의 iv들을 비교한다면 이 방법은 해결책이 못된다.

그렇다면??


다운캐스팅(형변환)해주면 된다. 그전에 instanceof는 필수!!

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

public boolean equals(Object obj) {

	if(!(obj instanceof Value)) return false;

	return this.value == ((Value)obj).value;
}

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨


③ 위처럼 객체생성해서 형변환 해주든가

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

public boolean equals(Object obj) {

	if(!(obj instanceof Value)) return false;
    
    	Value v = (Value)obj;
    	return this.valu == v.value;
}

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨


호기심이 또 도졌다.

👀👀👀만약 다른 클래스의 iv를 비교한다면??


public class Ex9_01 {

	public static void main(String[] args) {
		Value v1 = new Value(10);
		Balue b1 = new Balue(10);
		
		if(v1.equals(b1)) {	//v1이 가리키는 equals()호출
			System.out.println("v1과 b1는 같습니다.");
		} else {
			System.out.println("v1과 b1는 다릅니다.");
		}

		System.out.println(v1.value);
		System.out.println(b1.value);
	}

}

class Balue{
	int value;

	Balue(int value){
		this.value = value;	//10
	}
}

class Value{
	int value;
	
	Value(int value){
		this.value = value;	//10
	}
	
	public boolean equals(Object obj) {	//Object및 그 자손들 다 들어올 수 있음
		if(!(obj instanceof Balue)) 	return false;
        //-> Balue
		System.out.println(this.value+"!");
		System.out.println(((Balue)obj).value);
       
		return this.value == ((Balue)obj).value;
        //-> Balue
	}
	
}

아니면

public boolean equals(Object obj) {
	if(!(obj instanceof Balue)) return false;
	
	Balue b = (Balue)obj;
	return this.value == b.value;
}

객체 생성해서 받아주든가.

10!
10
v1과 b1는 같습니다.
10
10


public class Ex9_02 {

	public static void main(String[] args) {
		Person p1 = new Person(990101_1234567L);
		Person p2 = new Person(990101_1234577L);
		
		if(p1.equals(p2)) {
			System.out.println("p1의 id와 p2의 id는 같습니다.");
		} else {
			System.out.println("p1의 id와 p2의 id는 다릅니다.");
		}

	}

}

class Person{
	long id;
	
	Person(long id){
		this.id = id;
	}
	
	public boolean equals(Object obj) {
		if(obj instanceof Person) {
			return id == ((Person)obj).id;
		}
		return false;
		
//		if(!(obj instanceof Person))	return false;
//		
//		Person p = (Person)obj;
//		return this.id == p.id;
	}
	
}

p1의 id와 p2의 id는 다릅니다.



Ref

0개의 댓글

관련 채용 정보