충분히 쌓여가는
Object 클래스와 equals(), equals(Object obj)의 오버라이딩 본문
Object 클래스
모든 클래스의 최고 조상
오직 11개의 메서드만을 가지고 있다
notify(), wait()등은 쓰레드와 관련된 메서드
protected로 되어있는 것들은 오버라이딩 후 public으로 변경해야한다
Object 클래스의 메서드 | 설명 |
protected Object clone() | 객체 자신의 복사본을 반환한다 |
public boolean equals(Object obj) | 객체 자신과 객체 obj가 같은 객체인지 알려준다(같으면 true) |
protected void finalize() | 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다 이때 수행되어야 하는 코드가 있을 때 오버라이딩한다(거의 사용 안함) |
public Class getClass() | 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환한다 |
public int hashCode() | 객체 자신의 해시코드를 반환한다 |
public String toString() | 객체 자신의 정보를 문자열로 반환한다 |
public void notify() | 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다 |
public void notifyAll() | 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다 |
public void wait() public void wait(long timeout) public void wait(long timeout, int nanos) |
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos)동안 기다리게한다 [timeout은 천 분의 1초, nanos는 10^9분의 1초) |
equals()
객체 자신(this)와 주어진 객체(obj)를 비교한다
반환타입 boolean: 같으면 true, 다르면 false
public boolean equals(Object obj) {
return (this==obj); // 주소가 같아야 true
}
결과: false
class equalsTest {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if (v1.equals(v2))
System.out.println("v1과 v2는 같다");
else
System.out.println("v1과 v2는 다르다");
}
}
class Value {
int value;
Value(int value) {
this.value = value;
}
}
v1과 v2는 다르다
서로 다른 두 객체는 항상 주소가 다르다
결과: true
obj에는 value가 없기 떄문에 형변환 필수
주소비교: 서로 다른 객체는 항상 거짓 나옴(서로 다른 객체라도 비교한 결과가 참이고 싶으면 형변환 후 여기서는 value라는 값으로 비교해야한다)
또한 참조변수의 형변환 전에는 반드시 instanceof로 확인을 해야한다
class equalsTest {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if (v1.equals(v2))
System.out.println("v1과 v2는 같다");
else
System.out.println("v1과 v2는 다르다");
}
}
class Value {
int value;
Value(int value) {
this.value = value;
}
// Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교
public boolean equals(Object obj) {
// return this==obj; // 주소비교, 서로 다른 객체는 항상 거짓
// 참조변수의 형변환 전에는 반드시 instanceof로 확인하기
if(!(obj instanceof Value)) return false;
Value v = (Value)obj; //obj에는 value가 없기 떄문에 형변환 필수
return this.value==v.value;
}
}
v1과 v2는 같다
equals(Object obj)의 오버라이딩
인스턴스 변수(instance variable)의 값을 비교하도록 equals() 오버라이딩해야 한다
class variable: 객체마다 공통(공유)
instance variable: 객체마다 다름(개별)
obj가 Object 타입이므로 id 값을 참조하기 위해서 Persion 타입으로 형변환이 필요하다
class Person {
long id; // this.id
public boolean equals(Object obj) {
if (obj instanceof Person)
return id == ((Person)obj).id;
// return this.id == ((Person)obj).id;
else
return false;
}
Person(long id) {
this.id = id;
}
}
public class equalsOverriding {
public static void main(String[] args) {
Person p1 = new Person(8011081111222L);
Person p2 = new Person(8011081111222L);
if(p1.equals(p2))
System.out.println("p1과 p2는 같다");
else
System.out.println("p1과 p2는 다르다");
}
}
p1과 p2는 같다
if문 변경: else 제거
class Person {
long id; // this.id
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
Person p = (Person)obj;
return id == p.id;
// return this.id == p.id;
}
Person(long id) {
this.id = id;
}
}
public class equalsOverriding {
public static void main(String[] args) {
Person p1 = new Person(8011081111222L);
Person p2 = new Person(8011081111222L);
if(p1.equals(p2))
System.out.println("p1과 p2는 같다");
else
System.out.println("p1과 p2는 다르다");
}
}
p1과 p2는 같다
'Java > JAVA2' 카테고리의 다른 글
String 클래스의 생성자와 메서드 (0) | 2023.06.26 |
---|---|
String 클래스, 문자열 비교, 빈 문자열 (0) | 2023.06.26 |
toString(), toString()의 오버라이딩 (0) | 2023.06.25 |
hashCode() (0) | 2023.06.25 |
연결된 예외(chained exception) (0) | 2023.06.25 |