총 11개의 메소드
notify()
, wait()
등 -> ch13~ (쓰레드 관련)
- 기본
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
라서 되는 것이다.그렇다면??
② 다운캐스팅(형변환)해주면 된다. 그전에 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는 다릅니다.