반응형
Object 클래스
- 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.
- notify(), wait() 등은 쓰레드와 관련된 메서드이다.
메서드 | 설명 |
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(Object obj)
- 객체 자신과 주어진 객체를 비교한다. 같으면 true 다르면 false.
- Object클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)
**오버라이딩 해서 값을 비교 하는 함수를 만든다.
package obj;
class Value {
int value;
Value(int value){
this.value = value;
}
public boolean equals(Object obj){
if(!(obj instanceof Value)){
return false;
}
Value v = (Value) obj;
return this.value == v.value;
}
}
public class ValueMain {
static public void main(String[] args){
Value v1 = new Value(1);
Value v2 = new Value(1);
if(v1.equals(v2)){
System.out.println("같음");
}else {
System.out.println("다름");
}
}
}
hashCode()
- 객체의 해시코드를 반환하는 메서드
- Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
- equals()를 오버라이딩 하면, hashCode()도 오버라이딩 해야한다.
equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문
public class Object{
...
public native int hashCode();
// native : 네이티브 메서드 : OS의 메서드(C언어)
...
}
** 근데 반환형이 int 형이다
32비트에서는 4바이트가 주소값
64비트에서는 8바이트가 주소값 >> 8 바이트에서 앞에 4바이트를 잘라서 형변환 시키기 때문에 >> 값이 같은 것이 나올 수 있다.
- 참고 : System.identityHashCode(Object obj)는 Object 클래스의 hashCode()와 동일
toString()
- 객체를 문자열로 변환하기 위한 메서드
오버라이딩 해서 사용 할 수 도 있다.
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
equals(), toString(), hashCode() 구현
package obj;
import java.util.Objects;
public class CardMain {
static public void main(String[] args){
Card v1 = new Card(1, "A");
Card v2 = new Card(1, "B");
Card v3 = new Card(1, "B");
System.out.println(v1.equals(v2));
System.out.println(v3.equals(v2));
System.out.println(v1.hashCode());
System.out.println(v1.toString());
}
}
class Card {
int value;
String name;
Card(int value, String name){
this.value = value;
this.name = name;
}
public boolean equals(Object obj){
if(!(obj instanceof Card)){
return false;
}
Card v = (Card) obj;
return this.value == v.value && this.name.equals(v.name);
}
public int hashCode(){
return Objects.hash(name, value);
}
public String toString(){
return "name:"+this.name+", value:"+this.value;
}
}
반응형
'개발' 카테고리의 다른 글
Java - StringBuffer 클래스 (0) | 2021.06.05 |
---|---|
Java - String 클래스 (0) | 2021.06.05 |
Java - 오류 / 예외 처리하기 (0) | 2021.06.05 |
Java - 내부 클래스(inner class) / 익명 클래스(anonymous class) (0) | 2021.06.05 |
Java - 인터페이스 (0) | 2021.06.05 |